TinyML基础:边缘设备约束、模型大小与推理速度、典型应用场景
TinyML 的核心命题,是在功耗、内存、算力都极度受限的微控制器(MCU)或极低功耗处理器上,让机器学习模型能够实时运行。与云端 AI 不同,TinyML 没有高速网络、没有大容量内存、没有散热风扇,甚至没有操作系统。理解这些硬性约束,是学习量化感知训练(QAT)的前提——因为 QAT 的所有设计,本质上都是在与这些约束进行博弈。
边缘设备的硬性约束:为什么不能直接跑大模型
典型的 TinyML 目标硬件,如 Arm Cortex-M0+、M4、M7 或 RISC-V 内核的 MCU,其资源规模与云端 GPU 相差数个数量级。以常见的 Arm Cortex-M4 为例,主频通常在 80~180 MHz,内置 Flash 为 256 KB~1 MB,SRAM 为 64~256 KB。这意味着一个 1 MB 的 FP32 模型(约 25 万参数)就已经占满全部 Flash,没有任何空间存放代码、运行时库和传感器驱动。更关键的是,模型推理时的中间激活值(activation)需要存放在 RAM 中,而 RAM 往往只有 Flash 的四分之一到八分之一。
功耗约束同样苛刻。许多 TinyML 设备由纽扣电池或能量收集供电,整机平均功耗必须控制在毫瓦甚至微瓦级别。以关键词唤醒为例,设备需要 7×24 小时监听麦克风信号,如果持续以全速运行 DSP 和神经网络,电池会在数小时内耗尽。因此,实际系统通常采用"低功耗监听 + 事件触发推理"的架构,而模型本身必须足够小,才能在极短的唤醒窗口内完成推理并迅速回到睡眠状态。
另一个容易被忽视的约束是外设接口。MCU 通常通过 I2C、SPI、UART 或 GPIO 与传感器连接,数据带宽有限。例如,一个 I2S 接口的麦克风以 16 kHz/16 bit 采样,每秒产生 32 KB 数据,这已经占用了相当比例的 DMA 带宽。如果模型需要更高分辨率的输入(如 224×224 图像),仅数据传输就会成为瓶颈。因此,TinyML 模型设计必须从源头考虑传感器数据的特征维度。
模型大小与推理速度:量化如何同时解决两个问题
模型大小直接由权重存储决定。一个 FP32 模型,每个参数占用 4 字节;如果量化为 INT8,每个参数仅需 1 字节,模型体积立即缩小 4 倍。对于 1 MB Flash 的 MCU,这意味着原本只能容纳 25 万参数的模型,现在可以容纳 100 万参数,或者同样参数量的模型可以留出更多空间给代码和运行时。但模型大小只是问题的一半,推理速度同样关键。
推理速度的核心指标是乘加运算次数(MACs)和内存访问次数。在 MCU 上,一次 FP32 乘法可能需要 10~20 个时钟周期,而一次 INT8 乘法仅需 1~2 个时钟周期(如果硬件支持 SIMD 或 DSP 扩展)。更重要的是,INT8 数据占用的内存带宽只有 FP32 的四分之一,而内存访问往往是比计算更严重的瓶颈。以 Cortex-M4 为例,从 Flash 读取 4 字节数据可能需要 2~3 个等待周期,而 CPU 执行一次乘法只需 1 个周期。因此,减少数据搬运量对推理速度的提升往往比减少计算量更显著。
量化感知训练(QAT)正是在训练阶段模拟量化的舍入误差,让模型权重和激活值适应低比特表示。与训练后量化(PTQ)相比,QAT 通常能获得更高的精度,尤其是在模型较小、任务较复杂的情况下。QAT 的核心思想是在前向传播时使用"伪量化"操作(fake quant),即把浮点数值舍入到最近的量化网格点,但反向传播时仍然使用浮点梯度更新权重。这样,模型在训练时就学会了容忍量化误差,部署时切换到真正的 INT8 推理,精度损失可以控制在 1%~3% 以内。
| 对比维度 | FP32 原始模型 | INT8 量化后(QAT) | 收益 |
|---|---|---|---|
| 模型体积 | 4 字节/参数 | 1 字节/参数 | 缩小 4 倍 |
| 内存带宽占用 | 高(每次读取 4 字节) | 低(每次读取 1 字节) | 减少 75% 数据搬运 |
| 乘法运算周期 | 10~20 周期(无 FPU) | 1~2 周期(DSP 扩展) | 加速 5~10 倍 |
| 中间激活值 RAM 占用 | 4 字节/元素 | 1 字节/元素 | 减少 75% RAM 峰值 |
| 精度影响 | 基准 | 通常损失 1%~3% | 可接受范围 |
需要注意的是,量化并非没有代价。INT8 推理需要硬件支持或软件模拟。Cortex-M4 和 M7 内核支持 SIMD 指令,可以一条指令完成多个 INT8 乘法;而 Cortex-M0+ 没有 DSP 扩展,INT8 运算可能需要拆分为多个指令,收益会打折扣。此外,量化后的模型对数值范围非常敏感,如果某个层的激活值分布极不均匀(例如存在明显的离群值),量化误差会被放大。QAT 通过训练过程中的动态范围调整,可以部分缓解这个问题,但设计模型时仍应尽量避免极端数值分布。
典型应用场景:关键词唤醒、视觉与异常检测
TinyML 的三个代表性应用场景,恰好对应了三种不同的模型架构和量化需求。理解这些场景的差异,有助于在 QAT 训练时做出正确的取舍。
关键词唤醒(KWS)
关键词唤醒是 TinyML 最成熟的应用之一。设备持续监听麦克风信号,当检测到预设关键词(如"Hey Siri")时唤醒系统。典型的 KWS 模型输入是 40 维梅尔频率倒谱系数(MFCC)特征,时间窗口约 1 秒,模型通常采用深度可分离卷积或小型 CRNN,参数量在 10 万~50 万之间。KWS 对延迟极其敏感——从用户说出关键词到系统响应,延迟必须小于 100 ms,否则体验会明显下降。因此,KWS 模型通常需要 INT8 量化以降低推理延迟,同时保持 95% 以上的唤醒率。
在 QAT 训练 KWS 模型时,一个关键技巧是关注误唤醒率(False Accept Rate)。量化误差可能导致模型对噪声过于敏感,从而频繁误唤醒。建议在 QAT 训练集中加入多种噪声环境(如厨房、街道、车内),并监控量化前后误唤醒率的变化。如果误唤醒率上升超过 1%,可能需要调整量化参数或增加正则化。
视觉识别
视觉任务(如人脸检测、物体分类)对 MCU 的挑战最大。输入图像通常为 96×96 或 160×160 分辨率,即使是轻量级模型(如 MobileNetV1 的 0.25 倍宽度),参数量也在 10 万~50 万之间,而中间激活值可能达到数 MB——这远超 MCU 的 RAM 容量。因此,视觉 TinyML 模型必须仔细设计网络结构,避免过大的特征图。常用的策略包括:使用全局平均池化替代全连接层、减少通道数、使用深度可分离卷积。
量化对视觉模型的影响尤为显著。图像数据的数值范围通常较广(0~255),但经过归一化后分布相对均匀,量化误差相对可控。然而,视觉模型中的 BatchNorm 层在量化时需要特殊处理——通常将 BatchNorm 的缩放因子和偏移量融合到前一层的卷积权重中,否则量化误差会累积。QAT 训练时,应确保 BatchNorm 层处于训练模式,让模型学习到融合后的权重分布。
异常检测
异常检测(如工业设备振动监测、电机故障预测)通常采用自编码器或单类分类器。输入是振动传感器的时间序列数据(如 1~3 秒的加速度计信号),模型学习正常数据的分布,推理时计算重建误差或异常分数。这类模型的参数量通常较小(1 万~10 万),但对数值精度较为敏感——异常分数往往取决于细微的重建差异,量化误差可能淹没真正的异常信号。
在 QAT 训练异常检测模型时,建议使用较小的量化位宽(如 INT8)但保留最后一层或输出层为 FP32,或者对异常分数进行额外的校准。另一种做法是使用"混合精度量化":对编码器使用 INT8,对解码器使用 FP16 或 FP32,以保持重建精度。这需要 QAT 框架支持逐层量化配置。
常见误区与总结复盘
在 TinyML 项目实践中,有几个反复出现的误区值得警惕。第一个误区是"先训练大模型,再压缩"。这种做法往往事倍功半——大模型在量化后精度损失严重,因为其权重分布可能不适合低比特表示。正确的做法是从一开始就设计小模型,并在训练过程中加入量化感知。第二个误区是"只看模型大小,不看内存峰值"。有些模型虽然参数量小,但中间激活值极大(例如早期层有高分辨率特征图),导致 RAM 溢出。在 QAT 训练时,应同时监控权重大小和激活值大小。
第三个误区是"忽略数据预处理对量化的影响"。输入数据的归一化方式(如除以 255 还是减去均值再除以标准差)会直接影响量化范围的选择。如果输入范围是 [-1, 1],量化网格可以充分利用;如果输入范围是 [0, 255],则有一半的量化网格被浪费。建议在 QAT 训练前,将输入数据归一化到适合量化的范围(如 [-1, 1] 或 [0, 1]),并在部署时使用相同的预处理。
最后,一个实用的复盘方法是:在完成 QAT 训练后,使用真实的 MCU 开发板(如 STM32F746、ESP32-S3)进行端到端测试,测量实际的推理延迟、内存占用和功耗。模拟器或 PC 上的测试结果往往过于乐观——Flash 读取等待周期、DMA 竞争、中断开销等因素只有在真实硬件上才能暴露。建议在项目早期就搭建硬件测试环境,将量化模型的性能指标作为迭代的基准。