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上?我总结了一个“三步匹配法”:

  1. Flash匹配: 模型体积 ≤ Flash总容量 × 70%
  2. RAM匹配: 激活值缓冲区 + 权重缓冲区 ≤ RAM总容量 × 60%
  3. 算力匹配: 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 选型决策流程图

下面这张图是我自己项目里常用的选型流程,你可以直接拿来用:

MCU模型选型决策流程 开始选型 步骤1:确定任务类型与精度要求 步骤2:从TinyMLPerf初选候选模型 判断1:Flash是否满足? 否 是 剪枝/量化压缩模型 判断2:RAM是否满足? 迭代优化 否 是 降低输入分辨率 判断3:算力是否满足? 否 是 更换更轻量的模型 选型成功 ✓ 说明: Flash、RAM、算力三者必须 同时满足,缺一不可。

3.6 我的选型清单

最后,分享一份我常用的选型清单。每次开始新项目,我都会对着它过一遍:

  • 任务需求: 分类、检测、唤醒?精度要求多少?
  • 硬件约束: Flash/RAM余量、主频、外设带宽
  • 模型候选: MobileNetV1、DS-CNN、TinyMLPerf基准模型
  • 量化策略: INT8还是FP16?是否需要混合精度?
  • 推理框架: TensorFlow Lite Micro、CMSIS-NN、自家引擎?
  • 实测验证: 在目标板子上跑一遍,记录真实推理时间和内存占用
一句话总结: 模型选型不是找“最好的”,而是找“最合适的”。MobileNetV1是MCU上的万金油,TinyMLPerf是选型的导航仪,而你的硬件资源就是最终裁判。别贪大,能跑起来才是硬道理。