1、课程导论:TinyML与振动检测概述
工业设备预测性维护、可穿戴健康监测、结构健康监测等场景正加速向边缘端迁移。传统振动分析依赖高功耗DSP或云端服务器,而TinyML(微型机器学习)技术使得在微控制器(MCU)上直接运行振动检测模型成为可能。然而,模型推理时间直接决定了系统能否满足实时性要求——例如,当采样率为4kHz、每帧256点时,推理必须在64ms内完成才能不丢帧。本课程聚焦于加速度计振动检测场景下的TinyML模型推理时间测量与优化,帮助工程师在资源受限的硬件上实现可预测、可复现的实时推理。
上图展示了本课程的核心技术链路:从加速度计数据采集、信号调理、ADC采样与帧缓冲,到TinyML模型推理,再到推理时间测量与优化。三个层次之间通过箭头串联,底部虚线回路表示测量结果会反馈至模型与部署策略,形成闭环优化。这张图将贯穿整个课程,后续章节会逐一深入每个环节。
1.1 TinyML与振动检测的核心原理
TinyML是机器学习与嵌入式系统的交叉领域,其核心思想是在功耗受限、计算资源有限的MCU上部署轻量化神经网络模型。振动检测利用加速度计捕捉机械结构的振动信号,通过分析时域波形、频域特征或时频特征来识别设备状态。将两者结合,可以在不依赖云端的情况下实现实时故障预警。
振动信号具有以下特点,直接影响模型设计:
- 高采样率需求:工业设备振动频率通常集中在10Hz~10kHz,根据奈奎斯特定理,采样率至少为最高频率的2倍,实际工程中常取4~8倍。
- 非平稳特性:设备启停、负载变化会导致振动信号统计特性随时间变化,需要模型具备时序建模能力。
- 噪声干扰:电磁干扰、安装共振等噪声会污染信号,需在预处理阶段进行滤波。
在TinyML框架下,模型通常采用1D-CNN、深度可分离卷积或轻量级Transformer架构。以1D-CNN为例,输入为256点加速度数据,经过3层卷积和全局平均池化后输出故障类别概率。模型参数量控制在10KB~100KB之间,推理所需RAM小于32KB,适配Cortex-M4或Cortex-M7内核的MCU。
关键约束:振动检测TinyML模型必须在帧间隔时间内完成推理。若采样率4kHz、帧长256点、重叠50%,则每帧新数据到达间隔为32ms,推理时间必须小于32ms,否则会造成数据丢失或流水线阻塞。
1.2 推理时间测量的判断方法与操作流程
推理时间测量是性能优化的基础。测量方法的选择直接影响数据的可信度。常用的测量手段包括:
| 测量方法 | 精度 | 侵入性 | 适用场景 |
|---|---|---|---|
| DWT循环计数器 | 纳秒级 | 低 | Cortex-M3/M4/M7内核 |
| SysTick定时器 | 微秒级 | 低 | 通用MCU |
| GPIO翻转+示波器 | 纳秒级 | 中 | 硬件调试阶段 |
| RTOS时间戳API | 微秒级 | 中 | FreeRTOS等环境 |
推荐使用DWT循环计数器,因为它直接读取CPU周期数,不受中断影响,且无需额外硬件。操作流程如下:
- 初始化DWT:在系统启动时使能DWT_CYCCNT寄存器。
- 在推理函数前后分别读取CYCCNT值,计算差值。
- 将周期数除以CPU主频得到时间(秒)。
- 重复测量至少100次,记录平均值、最大值、最小值和标准差。
// DWT初始化与测量示例
void DWT_Init(void) {
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}
uint32_t t0 = DWT->CYCCNT;
model_inference(input_buffer, output);
uint32_t t1 = DWT->CYCCNT;
float time_ms = (float)(t1 - t0) / (SystemCoreClock / 1000);
注意:DWT计数器在调试暂停时会停止计数,因此测量结果反映的是实际运行时间。若使用RTOS,需确保推理期间不被高优先级任务抢占,否则测量值会偏大。
1.3 案例拆解:电机轴承故障检测的推理时间预算
某工厂计划在电机轴承上部署TinyML振动检测模型。电机转速为1800rpm(30Hz),轴承故障特征频率约为150Hz~500Hz。工程师选择采样率4kHz,帧长256点,重叠率50%。
初始目标:推理时间小于帧间隔32ms,且平均功耗低于5mW。
硬件选型:STM32L476(Cortex-M4,80MHz),内置FPU,512KB Flash,128KB RAM。
模型设计:使用1D-CNN,输入256点,3层卷积(每层16个3×1卷积核),全连接层输出4类(正常、内圈故障、外圈故障、滚动体故障)。模型量化后大小为18KB。
测量过程:
- 使用DWT测量裸机推理时间,平均为28.5ms,最大31.2ms,接近预算上限。
- 进一步分析发现,第一层卷积耗时12ms,主要因为内存访问不连续导致缓存命中率低。
- 将输入数据从float32转为int8量化后,推理时间降至14.2ms,但精度从97.2%降至95.8%,仍在可接受范围。
- 使用CMSIS-NN优化算子后,推理时间进一步降至9.8ms。
结果对比:
| 优化阶段 | 推理时间(ms) | 精度(%) | RAM占用(KB) |
|---|---|---|---|
| 原始float32 | 28.5 | 97.2 | 42 |
| int8量化 | 14.2 | 95.8 | 21 |
| CMSIS-NN优化 | 9.8 | 95.8 | 21 |
风险与代价:量化后精度下降1.4%,对于早期故障预警可能造成漏报。工程师通过增加一帧数据的时间投票机制(连续3帧中2帧判定故障才报警)来弥补,代价是报警延迟增加32ms,但整体可靠性提升。
复盘经验:推理时间优化不能只看模型本身,数据布局、内存对齐、编译器优化选项(-O3 vs -Os)都会产生显著影响。建议在项目初期就建立测量基准,每次改动后重新测量,避免优化方向偏离。
1.4 常见误区与总结复盘
在TinyML推理时间测量与优化中,初学者常陷入以下误区:
- 误区一:只测一次推理时间。单次测量受中断、缓存状态影响大,必须多次测量并统计分布。
- 误区二:忽略输入数据预处理时间。FFT、归一化等操作可能占据总延迟的30%以上,应纳入测量范围。
- 误区三:盲目追求低延迟。过度优化可能导致模型精度下降或代码可维护性变差,应在满足实时性要求的前提下保留余量。
- 误区四:忽视温度影响。MCU在高温下时钟频率可能下降,导致推理时间变长,需在最高工作温度下验证。
经验建议:建立“推理时间预算表”,将总预算分解为数据采集、预处理、推理、后处理四个阶段,每阶段设定上限。例如总预算32ms,可分配为:采集0ms(DMA后台进行)、预处理5ms、推理20ms、后处理2ms、余量5ms。这样在优化时能快速定位瓶颈。