1. 课程导入
当你把一个人工智能模型塞进只有几十KB内存、靠纽扣电池供电的微控制器时,真正的挑战才刚刚开始。TinyML(Tiny Machine Learning)正是研究如何在资源极度受限的嵌入式设备上运行机器学习推理的技术领域。它不是把云端模型简单缩小,而是从模型结构、数值精度、内存布局到运行时调度的一次系统性重构。
本课程围绕两个核心问题展开:如何让推理足够省电,以及如何让多个任务在有限算力下有序运行。前者决定设备能工作多久,后者决定设备能否同时完成采集、推理、通信和响应。二者共同构成TinyML从“能跑”走向“可用”的关键。
一、核心原理:三层约束下的协同设计
TinyML系统通常运行在MCU级硬件上,典型资源边界包括:Flash 64KB~1MB、SRAM 16KB~512KB、主频 16MHz~200MHz、功耗预算毫瓦级。在这样的平台上,一个浮点卷积层就可能耗尽全部内存。因此,TinyML的核心原理可以概括为三层约束的协同:
- 模型层:通过剪枝、量化、知识蒸馏压缩参数量与计算量,常用INT8量化将模型体积缩小约4倍。
- 推理层:使用CMSIS-NN、TensorFlow Lite Micro等推理引擎,以定点运算替代浮点运算,减少CPU周期与能耗。
- 调度层:通过RTOS任务划分、中断优先级、睡眠策略,让推理任务与传感器采集、无线通信错峰执行。
这三层不是独立优化,而是相互制约。例如量化会降低精度,调度延迟会影响实时性,睡眠策略会改变数据采集节奏。理解这种耦合关系,是本课程的第一条主线。
二、方法流程:从模型到调度的六步闭环
一个可落地的TinyML项目通常遵循以下流程。每一步都会影响后续环节,因此建议以闭环方式迭代,而不是一次性线性推进。
- 需求与约束定义:明确输入传感器类型、采样率、响应时间、电池寿命和成本上限。
- 模型训练与压缩:在PC端训练基线模型,再通过剪枝和量化得到候选Tiny模型。
- 量化转换与验证:使用TFLite Converter生成INT8模型,并对比量化前后的精度损失。
- 部署与推理集成:将模型数组嵌入固件,调用推理引擎完成单次推理。
- 任务调度设计:划分采集、推理、通信、休眠任务,设定优先级与触发条件。
- 功耗与实时性测量:用电流探头或功耗分析仪测量平均电流,用GPIO打点测量延迟与抖动。
下面是一个典型的量化转换命令示例,用于生成适合MCU部署的INT8模型:
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model("saved_model")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_data_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8
tflite_quant_model = converter.convert()
open("model_int8.tflite", "wb").write(tflite_quant_model)
三、案例场景:关键词唤醒中的推理与调度
以“关键词唤醒”为例:麦克风以16kHz持续采集音频,系统需要在检测到“你好设备”时唤醒主处理器。若让推理任务一直运行,MCU平均电流可能达到十几毫安,电池几天就会耗尽。合理的做法是:
- 音频前端以DMA方式采集,仅在缓冲区半满时触发中断;
- 唤醒词模型以低优先级任务运行,每200ms推理一次;
- 未检测到关键词时,MCU进入低功耗睡眠,关闭未使用外设;
- 检测到关键词后,提升优先级并唤醒通信任务上报事件。
在这个场景中,模型精度决定误唤醒率,推理优化决定单次推理耗时,调度策略决定平均功耗。三者缺一不可。
四、常见误区与复盘
| 误区 | 表现 | 正确做法 |
|---|---|---|
| 只关注模型大小 | 模型很小但推理仍很慢 | 同时评估算子数量、内存访问和CPU周期 |
| 忽略调度开销 | 推理很快但系统响应差 | 测量任务切换、中断延迟和队列等待时间 |
| 量化后不验证精度 | 部署后准确率骤降 | 使用代表性数据集校准并对比量化前后指标 |
| 睡眠策略过于激进 | 漏采数据或响应超时 | 根据采样率和实时性要求设置唤醒周期 |
本课程后续将沿着“模型压缩—推理引擎—任务调度—功耗测量—综合实战”的路线逐步展开。你将学会如何把一个浮点模型变成可在MCU上运行的INT8推理程序,如何设计多任务调度策略,以及如何用数据证明系统真正达到了低功耗与实时性要求。