184、TinyML与微型智能体
上个月调试一块国产低功耗SoC板子,目标是做一个分拣线上的振动微型智能体:用加速度计感知物料撞击,本地跑一个十几KB的模型判断“正常”还是“卡料”。板子用的是Cortex-M4,主频80MHz,RAM只有96KB,Flash 512KB。模型量化成int8后,TFLite Micro推理一次大概6ms,看起来没问题。但系统跑起来老是在高负载时死机。查了三天,最后发现是IMU的DMA缓冲区和模型输入的tensor缓冲区重叠了——我在初始化时从微控制器分配池里拿了arena,又随手在栈上定义了一个DMA buffer,刚好编译器把后者塞进了前者的“安全边界”,一旦DMA连续写,就把模型权重表冲掉了。死机不是因为模型跑得慢,而是因为内存布局没做资源编排。这件事让我真正明白,TinyML不是“模型塞进MCU”这么简单,它是在设计一个微型智能体,而不是部署一个算法。
很多人谈论微型智能体时喜欢拿云端大模型当参照物,说终端智能体就是“小号ChatGPT”。但真实MCU上的智能体完全不同。它没有Linux,没有容器,甚至没有MMU,所有代码和变量都在同一块物理内存里。你要做的不是“压缩模型”,而是让整个感知—决策—执行闭环在一个数百KB的Flash、几十KB的RAM、微安级待机电流的约束里自洽运转。这个闭环里,每一毫秒、每一字节都是预算。我们的振动智能体,加速度计采样2kHz,窗口128点提取32维特征,模型输入就是这32个int8值,输出二分类置信度。但执行器是气阀,动作延迟不能超过20ms。推理6ms,加上采样和特征计算,已经吃掉了一半预算。这时候你不可能在中断里做推理,只能在主循环里等数据攒齐后调用Interpreter.Invoke()。中断里只允许“置标志