070、TensorFlow Lite Micro的Deployment项目:部署到生产环境

070、TensorFlow Lite Micro的Deployment项目:部署到生产环境

070 TensorFlow Lite Micro的Deployment项目:部署到生产环境

昨晚凌晨两点,我在产线上盯着那块STM32U5开发板,串口输出突然卡死在“AllocateTensor failed”上。旁边测试工程师递来一杯冷掉的咖啡,说“这板子上午还跑得好好的”。我盯着调试器里那个0xDEADBEEF的地址,突然意识到——TFLM的部署,从来不是把模型塞进去就完事。

那个让我失眠的“内存碎片”陷阱

先说说这个坑。TFLM的arena内存分配器用的是简单的线性分配,没有碎片整理。如果你的模型在初始化时分配了A、B、C三个tensor,运行中又动态创建了临时tensor D,然后释放了B——这时候arena中间就空出一块。下次再分配一个比B大的tensor,分配器会直接跳过这块空洞,继续往后找。反复几次,arena尾部耗尽,就给你一个“AllocateTensor failed”。

我当时的模型有6个输入tensor,每个都是动态shape,推理时根据输入尺寸重新分配。生产环境里输入尺寸变化频繁,跑了12小时后arena尾部就炸了。解决方案?要么固定所有tensor尺寸,要么自己实现一个简单的内存池。我选了后者,在arena前面划出256字节给动态tensor专用,静态tensor走后面。代码里这样写:

// 别这样写:让所有tensor都动态分配