2、TinyML基础:微控制器资源限制、典型TinyML模型(MobileNet、TinyMLPerf)、部署流程简介
TinyML(微型机器学习)的核心挑战在于:如何在资源极度受限的微控制器(MCU)上,高效地运行机器学习推理任务。与云端或移动端GPU不同,MCU的存储容量、计算能力、功耗和内存带宽均存在严格上限。理解这些约束,是评估剪枝前后MACs(乘加运算次数)与参数量变化的前提——因为剪枝的收益,最终要落到“能否在目标MCU上跑起来”以及“能跑多快”这两个现实问题上。本章将系统梳理MCU的资源边界、典型TinyML模型的结构特征,以及从训练到部署的完整工程链路,为后续章节的剪枝量化分析奠定基础。
2.1 微控制器资源限制:剪枝决策的硬边界
微控制器(MCU)与桌面CPU或移动SoC的本质区别在于其资源预算的不可扩展性。在云端,内存不足可以扩容;在手机上,算力不够可以调用NPU。但在MCU上,Flash和RAM的容量在芯片出厂时即已固定,无法动态扩展。这意味着,任何模型压缩技术(包括剪枝)的收益,都必须以“适配目标MCU的物理资源”为最终验收标准。
核心原理:存储与计算的耦合约束
MCU的典型资源参数如表2-1所示。需要特别注意的是,Flash容量决定了模型权重和代码的存储上限,而RAM容量则决定了推理过程中激活值(activations)和中间缓冲区的峰值占用。这两者往往构成一对矛盾:剪枝可以减少参数量(节省Flash),但如果剪枝后模型结构变得不规则,可能导致推理引擎需要额外的索引表或稀疏存储格式,反而增加RAM开销。
| 资源类型 | 典型范围 | 对模型的影响 | 剪枝关联 |
|---|---|---|---|
| Flash(代码+权重) | 256KB - 2MB | 模型参数量上限 | 剪枝直接减少权重存储 |
| RAM(数据+栈) | 32KB - 512KB | 激活值、中间张量上限 | 结构化剪枝可降低激活峰值 |
| CPU频率 | 48 - 400 MHz | MACs吞吐率上限 | 减少MACs直接降低延迟 |
| 功耗预算 | 1 - 100 mW | 连续推理时长 | 减少计算量降低动态功耗 |
以STM32F746系列为例,其拥有1MB Flash和320KB RAM,主频216MHz。若部署MobileNetV1(α=0.25,参数量约0.47M),在FP32精度下权重占用约1.9MB,远超Flash容量;即使转换为INT8量化,权重仍需约0.47MB,加上代码和运行时开销,依然逼近极限。此时,剪枝便成为能否部署的关键前置步骤。
判断方法:资源预算的“三倍法则”
在评估剪枝方案前,建议先完成以下资源预算检查:
- Flash预算:计算模型量化后的权重体积(参数量×量化字节数),加上推理引擎代码体积(通常50-100KB),再预留20%余量,总和需小于目标MCU的Flash容量。
- RAM预算:估算最大中间张量尺寸。对于卷积网络,通常是某一层的输出特征图大小。例如,输入为32×32×3的图像,第一层卷积输出16×16×16的特征图,在INT8下占用4KB,但后续层可能更大。
- 计算预算:根据MCU的MACs吞吐率(Cortex-M4约0.5-1 MACs/cycle/MHz)估算推理延迟。若目标延迟为100ms,主频100MHz,则总MACs预算约为100MHz×100ms×0.5=5M MACs。
2.2 典型TinyML模型:MobileNet与TinyMLPerf基准
TinyML领域并非所有模型都适用。由于MCU资源有限,模型设计必须遵循“小而精”的原则。目前业界公认的三大主流模型族包括:MobileNet系列(视觉任务)、DS-CNN/CRNN(语音唤醒)以及TinyMLPerf官方基准模型。
核心原理:深度可分离卷积的MACs优势
MobileNet系列的核心创新在于用深度可分离卷积(Depthwise Separable Convolution)替代标准卷积。标准卷积的MACs计算为:K×K×C_in×C_out×H×W;而深度可分离卷积将其分解为深度卷积(K×K×C_in×H×W)和逐点卷积(1×1×C_in×C_out×H×W),总MACs约为前者的1/C_out + 1/K²倍。以3×3卷积、C_out=64为例,计算量降至原来的约1/8。
MobileNetV1(α=0.25)的参数量约0.47M,MACs约41M(输入224×224)。但若输入缩小到96×96(TinyML常见分辨率),MACs降至约7.5M,这已接近Cortex-M4的实时处理能力。MobileNetV2引入了倒残差结构(Inverted Residual),在保持低MACs的同时提升了精度;MobileNetV3则通过NAS搜索和激活函数优化,进一步压缩了计算量。
TinyMLPerf基准:行业统一的评估标尺
TinyMLPerf是MLCommons组织发布的TinyML性能基准,其核心任务包括:
- Visual Wake Words (VWW):图像分类任务,判断画面中是否有人,输入96×96 RGB图像,使用MobileNetV1(α=0.25)作为参考模型。
- Keyword Spotting (KWS):语音唤醒词识别,输入49×10的MFCC特征,使用DS-CNN或CRNN模型。
- Anomaly Detection (AD):异常检测,基于LSTM或Transformer-lite。
- Image Classification (IC):CIFAR-10分类,使用ResNet-8等小型CNN。
TinyMLPerf的评分标准不仅包括推理精度,还综合了延迟、峰值RAM占用和Flash占用。这意味着,一个模型即使精度很高,如果RAM超限或延迟过长,也无法通过基准测试。剪枝在TinyMLPerf中扮演重要角色——许多参赛队伍通过结构化剪枝将MobileNetV1的参数量减少30%-50%,同时保持精度损失在1%以内。
| 模型 | 参数量 | MACs(@96×96) | INT8权重体积 | 适用MCU等级 |
|---|---|---|---|---|
| MobileNetV1 α=0.25 | 0.47M | 7.5M | 470KB | 中高端Cortex-M7 |
| MobileNetV2 α=0.35 | 0.35M | 5.2M | 350KB | 中端Cortex-M4 |
| DS-CNN (KWS) | 0.27M | 0.9M | 270KB | 入门级Cortex-M0+ |
| ResNet-8 (CIFAR-10) | 0.08M | 1.1M | 80KB | 低端Cortex-M0 |
2.3 部署流程简介:从训练到板级验证
TinyML的部署流程与云端推理有显著差异。云端可以依赖Python运行时和GPU驱动,而MCU部署需要将模型转换为C数组,并链接到嵌入式工程中。理解这一流程,有助于明确剪枝在哪个环节介入、如何验证剪枝效果。
标准部署五步法
- 训练与量化感知训练(QAT):在PyTorch/TensorFlow中训练模型,并模拟INT8量化误差。剪枝应在此阶段之前或之中完成,因为剪枝后需要重新微调以恢复精度。
- 模型转换:将训练好的模型导出为TFLite格式,并执行后训练量化(PTQ)或使用QAT产出的量化参数。此步骤会生成
.tflite文件,其中包含权重和激活的量化尺度。 - 转换为C数组:使用
xxd -i或TFLite Micro的转换工具,将.tflite文件转为C语言字节数组,嵌入到嵌入式工程中。 - 编译与链接:在STM32CubeIDE或Keil中,将模型数组与TFLite Micro解释器、CMSIS-NN优化算子库一起编译。此步骤需注意内存对齐和Flash分区。
- 板级验证:通过串口或JTAG下载固件,实测推理延迟、功耗和精度。使用逻辑分析仪或MCU的DWT计数器获取精确的周期数。
剪枝在部署流程中的介入点
剪枝操作应发生在训练阶段(步骤1),具体有两种策略:
- 训练后剪枝(Post-training Pruning):先训练一个完整模型,然后剪枝,再微调。适合快速原型验证,但精度损失可能较大。
- 稀疏训练(Sparse Training):在训练过程中逐步施加稀疏约束,使模型自动学习到可剪枝的结构。精度保持更好,但训练时间更长。
无论哪种策略,剪枝后都必须重新进行量化校准(步骤2),因为剪枝改变了权重分布,原有的量化尺度可能不再最优。
案例拆解:TinyMLPerf VWW任务的完整部署
以TinyMLPerf VWW任务为例,目标平台为STM32F746G-Discovery开发板(Cortex-M7, 216MHz, 1MB Flash, 320KB RAM)。
初始状态:使用MobileNetV1 α=0.25,输入96×96×3,INT8量化。模型权重470KB,激活峰值约40KB(第一层输出16×16×16)。预估Flash占用:470KB(权重)+ 80KB(TFLite Micro运行时)+ 20KB(驱动)= 570KB,Flash余量充足;RAM占用:40KB(激活)+ 10KB(中间缓冲)= 50KB,RAM余量充足。但实测延迟为210ms,超出100ms目标。
分析过程:通过profiling发现,第一层标准卷积(3×3×3×16)虽然MACs仅0.4M,但耗时占比达35%,原因是CMSIS-NN对3×3标准卷积的优化不如深度卷积充分。进一步分析,该层存在大量冗余通道。
操作步骤:①对第一层进行通道剪枝,将16个输出通道减至12个(剪枝率25%);②对最后一个逐点卷积层(1×1×256×16)进行通道剪枝,将256个输入通道减至192个;③重新微调5个epoch,精度从82.1%降至81.4%(损失0.7%);④重新量化并部署。
结果对比:剪枝后权重体积降至410KB,MACs从7.5M降至5.8M,实测延迟从210ms降至145ms。虽然仍未达到100ms目标,但通过将输入分辨率降至80×80(MACs降至4.1M),最终延迟降至98ms,精度80.9%。
复盘经验:①剪枝应优先针对耗时占比高的层,而非参数量大的层;②输入分辨率调整是延迟优化的“最后手段”,因为它直接影响所有层的MACs;③剪枝与量化必须协同进行,剪枝后重新校准量化参数可额外减少1-2%的精度损失。
常见误区与总结
- 误区一:只关注参数量,忽略激活值。剪枝减少了Flash占用,但若剪枝后特征图尺寸不变,RAM占用不会下降。需配合输入分辨率调整或池化层优化。
- 误区二:认为剪枝是“免费午餐”。剪枝必然带来精度损失,且需要额外的微调计算资源。在MCU资源极度紧张时,可能需要接受1-3%的精度下降。
- 误区三:忽略推理引擎的算子支持。TFLite Micro对稀疏张量的支持有限,非结构化剪枝可能导致推理引擎回退到低效的通用矩阵乘法。