3. 模型选型:适合MCU的轻量级模型
模型选型这事儿,说白了就是给MCU找个合适的“脑子”。
我见过不少新手,一上来就选ResNet-50,结果发现MCU连模型参数都装不下。嗯,这其实是个很常见的误区——总以为模型越大越准。但在嵌入式世界里,能跑起来的模型才是好模型。
3.1 轻量级模型的核心指标
选模型之前,先搞清楚几个关键指标。我个人习惯用这三个维度来卡:
| 指标 | 含义 | MCU关注点 |
|---|---|---|
| 参数量(Params) | 模型权重总数 | 决定Flash占用,一般不超过1MB |
| 乘加运算量(MACs) | 每次推理的运算次数 | 决定推理速度,MCU通常< 100M MACs |
| 模型体积(Model Size) | 量化后的二进制文件大小 | 直接影响固件烧录和OTA升级 |
我的经验: 选型时先看RAM和Flash的余量。我曾经在一个只有256KB Flash的STM32F4上硬塞了一个300KB的模型,结果连RTOS都跑不起来。后来学乖了,留出至少30%的资源给系统栈和中间件。
3.2 MobileNetV1:MCU上的常青树
MobileNetV1为什么适合MCU?核心就一招——深度可分离卷积。
你想想看,普通卷积的计算量是:
DK × DK × M × N × DF × DF
而深度可分离卷积把它拆成两步:
DK × DK × M × DF × DF(深度卷积)
1 × 1 × M × N × DF × DF(逐点卷积)
算下来,计算量直接降到原来的 1/N + 1/DK²。说白了,就是用更少的运算干同样的活。
MobileNetV1典型配置(α=0.25):
- 参数量:0.47M
- MACs:41M
- 模型大小(INT8量化后):约470KB
- 在Cortex-M4上推理:约200-400ms/帧
我在一个智能门锁项目里用过这个配置。当时MCU是STM32L4,Flash 512KB,RAM 128KB。量化后模型刚好塞进去,推理一次大概350ms,完全满足门锁的人脸识别需求。
3.3 TinyMLPerf基准:选型的“体检报告”
TinyMLPerf是Google和MLCommons推出的嵌入式ML基准测试。它不只是一个跑分工具,更是一张选型地图。
我建议你重点关注这几个基准模型:
| 基准模型 | 任务 | 典型MCU | 推理时间 |
|---|---|---|---|
| MobileNetV1 0.25 | 图像分类 | Cortex-M4 @ 80MHz | ~300ms |
| DS-CNN | 关键词唤醒 | Cortex-M7 @ 400MHz | ~50ms |
| Anomaly Detection | 异常检测 | Cortex-M0+ @ 48MHz | ~100ms |
| ResNet-8 | 视觉唤醒 | Cortex-M4 @ 200MHz | ~150ms |
避坑指南: 我曾经直接拿TinyMLPerf的公开数据来估算自己的项目,结果发现实际推理时间比基准慢了2倍。为什么?因为基准测试用的是理想条件——连续推理、无中断、DMA全开。你的项目里还有传感器采集、通信协议栈、看门狗……这些都会抢CPU时间。所以,基准数据只能做参考,最终一定要在自己的板子上实测。
3.4 模型复杂度与硬件资源的匹配法则
怎么判断一个模型能不能跑在你的MCU上?我总结了一个“三步匹配法”:
- Flash匹配: 模型体积 ≤ Flash总容量 × 70%
- RAM匹配: 激活值缓冲区 + 权重缓冲区 ≤ RAM总容量 × 60%
- 算力匹配: MACs ÷ 主频 ÷ 2(MAC/cycle) ≤ 目标推理时间
举个例子。假设你有个Cortex-M4,主频100MHz,Flash 512KB,RAM 128KB。你想跑MobileNetV1 0.25(41M MACs,470KB模型)。
- Flash:470KB ≤ 512KB × 70% = 358KB?不满足!
- RAM:激活值约200KB(假设输入224×224×3)≤ 128KB × 60% = 76.8KB?严重不满足!
所以这个配置根本跑不了。怎么办?两个方向:
- 降输入分辨率: 从224×224降到96×96,激活值从200KB降到约37KB
- 剪枝+量化: 模型体积从470KB压到200KB以内
嗯,这就是我们后面几章要讲的内容了。
3.5 选型决策流程图
下面这张图是我自己项目里常用的选型流程,你可以直接拿来用:
3.6 我的选型清单
最后,分享一份我常用的选型清单。每次开始新项目,我都会对着它过一遍:
- 任务需求: 分类、检测、唤醒?精度要求多少?
- 硬件约束: Flash/RAM余量、主频、外设带宽
- 模型候选: MobileNetV1、DS-CNN、TinyMLPerf基准模型
- 量化策略: INT8还是FP16?是否需要混合精度?
- 推理框架: TensorFlow Lite Micro、CMSIS-NN、自家引擎?
- 实测验证: 在目标板子上跑一遍,记录真实推理时间和内存占用
一句话总结: 模型选型不是找“最好的”,而是找“最合适的”。MobileNetV1是MCU上的万金油,TinyMLPerf是选型的导航仪,而你的硬件资源就是最终裁判。别贪大,能跑起来才是硬道理。