TinyML适合在哪些MCU上运行?怎么评估我们的MCU能不能运行TinyML?(赠评估手册)

我的《AI+嵌入式:让单片机学会思考》课程开课以来,接触了非常多的学员,学员们在认可【AI+嵌入式】的前景外,更多的是一些没有接触过TinyML学员,所以会问一下偏基础的问题"我的xxxMCU上能不能运行TinyML?"。

今天,小编再整理一篇科普文章,重点讲清楚两点:

(1)TinyML适合在哪些MCU上运行?

(2)怎么评估我们的MCU能不能运行TinyML?

一、TinyML 是什么

TinyML 不是某一颗"专用芯片",也不是某一个"固定框架"。它更像是一类工程做法:把机器学习模型的推理(必要时含少量特征提取)放到微控制器(MCU)上本地运行,让设备在端侧完成识别、检测、分类、回归等任务。

以 Google 的 LiteRT for Microcontrollers(原 TensorFlow Lite Micro)为例:它面向"只有几 KB 内存"的微控制器,核心运行时在 Arm Cortex-M3 上可压到约 16KB 量级,并且不依赖操作系统、标准 C/C++ 库或动态内存分配。

这段话很重要:TinyML 能不能跑,首先看"推理运行时 + 我们模型 + 模型的输入/预处理"整体能否在 MCU 的 Flash/RAM/算力/功耗预算内闭环。

二、哪些 MCU 已经"被定义/被验证"可以运行 TinyML?

下面我们通过一些"官方"的文章/资料来了解清楚已经被定义或者验证可运行TinyML的MCU

1、Google LiteRT for Microcontrollers(TFLM)

Google 在官方文档里明确给了"Supported platforms / Supported boards",如下面截图所示:

从上面的网页内容可以总结下面几点:

平台要求 :C++17,且要求 32 位平台;大量在 Arm Cortex-M 系列上做过广泛测试,并移植到了 ESP32 等架构;可作为 Arduino 库使用,也可生成 Mbed 等开发环境工程。

支持的开发板:Arduino Nano 33 BLE Sense、SparkFun Edge、STM32F746 Discovery、Adafruit EdgeBadge、ESP32-DevKitC、ESP-EYE、Wio Terminal(ATSAMD51)、Himax WE-I Plus、Synopsys ARC EM 平台、Sony Spresense 等

上面这些开发板背后的MCU架构是:Cortex-M4/M7、Cortex-M0+(ATSAMD51 实际是 M4F)、ESP32(Xtensa)、ARC DSP 等。

2、ARM CMSIS-NN

CMSIS-NN 是ARM针对 Cortex-M 的神经网络算子优化库。它的用户手册明确说明:目标是在 ARM Cortex-M 处理器上最大化性能、最小化内存占用

并且它按指令能力把 Cortex-M 分成三类实现路径:

  • 无 SIMD(例如 Cortex-M0)

  • 带 DSP 扩展(例如 Cortex-M4)

  • 带 MVE/Helium(例如 Cortex-M55)

这等于给了我们一条非常清晰的结论:同样跑 TinyML,Cortex-M4/M33(带DSP)/M7/M55 这类"有 DSP/向量能力"的 MCU,通常更合适、更省时延、更省能耗。

3、STM32Cube.AI

ST 的 STM32Cube.AI 页面明确说:它可以把训练好的神经网络模型优化并部署到任意 STM32 微控制器上,并且提供模型分析信息(参数量、复杂度、以及 RAM/Flash 需求等),还能做板级验证与内外存权衡优化。

此外,在 STM32Cube.AI 用户手册(UM2526)的描述中,也给出了明确的系列覆盖举例:STM32F3/F4/F7/H7/L4/L5/G4/G0/C0/WB/WL/U0/U5 等,并说明这些开发板可以作为验证平台。

4.综上

综上,针对可以哪些MCU可以运行TinyML进行总结:

  • Google 给出通用 TinyML 运行时的平台要求 + 已验证板卡

  • Arm 给出 Cortex-M 上跑 NN 的优化路径与适配分层

  • ST 给出 STM32 生态内的部署工具与可量化评估手段

三、从实际工程落地的层面分析TinyML 适合哪些 MCU?

综合上面的"官方定义/验证来源",我们可以把"可以运行TinyML"分成三层来讲:

第一层:能跑起来(验证型/入门型 TinyML)

典型目标:Hello World(正弦回归)、简单阈值替代的二分类、小型异常检测等

这类能跑通TInyML对MCU要求的特征是:

  • 32 位 MCU,能编译 C++(最好 C++17),有基本串口/定时器用于测量与输出。

  • 即便是 Cortex-M3,官方也明确"核心运行时可放进 16KB",可以跑不少基础模型。

特殊提醒:这里"能跑TinyML"还并不能代表"能跑我们的业务模型"。很多项目失败不是运行时装不下,而是特征提取缓存 + 中间激活张量能模型运行中操作导致RAM不够用。

第二层:跑得合理(量产常用型 TinyML)

第二层应用的典型目标包括传感器时序分类(振动/电流/姿态)、关键词唤醒、小分辨率图像粗分类等。

针对第二层级比较常见的"合适"架构:

  • Cortex-M4/M7/M33(尤其 M4 带 DSP、M7 高频、M33 带 DSP/FPU 的配置)

  • 选择理由:CMSIS-NN 在这些核心上有更强的优化实现路径(DSP/向量化),单位时延与能耗表现更可控。

如果你追求"同一颗 MCU 上同时跑外设实时任务 + AI 推理",这层最常见,也是课程/量产项目最值得投入的区间。

第三层:跑得更大/更快(视觉/多模态/更复杂网络)

这一层应用的典型目标包括:更高分辨率视觉、多人/多类检测、更复杂的时序模型、端侧多任务。

针对第三层级,比较常见的MCU方案为:

  • Cortex-M55/M85 +(可选)NPU(Ethos-U、Neural-ART 等)

  • 或MCU + 外部 RAM/Flash(QSPI/SDRAM)做权重与缓存扩展

  • 从 Edge Impulse 的硬件列表就能看到:带加速器的 MCU 平台已经成为一类独立分组("MCU + AI Accelerators")。

这层的关键不再只是"能不能放下模型",而是"吞吐、功耗、内存带宽、数据搬运"是否成为系统瓶颈。

四:怎么评估"我们的 MCU 能不能运行 TinyML"?

当我们评估"我们的 MCU 能不能运行 TinyML"的时候,我们的评估对象不是"MCU + TinyML"这两个名词,而是"某个业务模型 + 某套输入/预处理 + 某个 MCU + 某个运行时/工具链"组合是否闭环。

下面我提供一套从0到结论的评估流程,我们直接跟着照做就即可。

Step 0:先把问题定清楚

当我们需要开始评估我们的MCU能否运行TInyML之前,至少整理了解清楚下面这 6 个量,它们直接决定了所需要的RAM/算力/功耗等等参数。

(1)传感器类型(IMU/麦克风/电流/图像),这里其实决定了我们要做什么样的系统、使用到什么样的数据进行模型训练。

(2)采样率与采样位宽(例如 16kHz/16bit 音频):直接决定单位时间的数据吞吐量(缓冲区大小、DMA/中断压力)与可用信息带宽。因此会拉动 RAM 需求、CPU 占用和整体功耗的下限。

(3)窗口长度与滑窗步长(例如 1s 窗、100ms 步):决定一次推理需要累积的数据量与输出频率,进而确定输入张量规模、实时性节拍,以及"预处理+推理"必须满足的时间预算。

(4)预处理方法(FFT/MFCC/滤波/归一化/特征拼接):决定端侧额外的计算与缓存开销,并且决定模型的输入形态(波形/特征图/统计特征),从而影响是否需要 DSP/FPU、以及我们的RAM峰值是否会被预处理缓冲顶爆。

(5)模型类型与输入维度(1D CNN/DS-CNN/LSTM/小型 MobileNet 等):决定模型权重大小(Flash)与中间激活峰值(RAM),同时决定推理算力/时延以及算子是否容易被 TFLM/CMSIS-NN 等端侧库支持与加速。

(6)端侧输出策略(触发事件/概率分布/回归值):决定后处理复杂度与系统闭环方式(阈值、投票、滤波等),并影响上报数据量与功耗策略(只上报事件还是持续上报结果)。

这一步的作用:让你后续的"RAM/Flash/Latency"估算有边界。

Step 1:用"官方工具"先得到第一版数字

这一步不是为了最终结论,而是为了快速排除"不可能"。

  • 如果用Edge Impulse :Studio 里可以直接 Profiling 估算 内存、Flash、时延

  • 如果STM32Cube.AI :在它的分析界面会给出参数量、复杂度(MACC)、以及详细的 RAM/Flash 需求,并支持在板上验证与内外存权衡。

经验上,这一步就能筛掉大量方案:例如"模型本体不大,但预处理缓存很大"的情况,会立刻暴露。

在这一步,我们会经常遇到的一种情况:模型已经设计好了,但是由于MCU不支持的算子,导致cube AI解析模型不成功。

Step 2:Flash 评估

Flash 不是只有一个 .tflite 文件那么简单,至少包含:模型权重(常量区)、推理运行时与算子实现(TFLM/LiteRT Micro、CMSIS-NN、你启用的 op kernel)、预处理代码(FFT/MFCC/DSP 库)、外设驱动与系统代码(日志、协议栈、RTOS 可选)等等内容。

一种比较常用的工程做法是:

  • 先用最小 demo(如当前我们已经验证的Hello World正弦波模型)在目标工程里编译一次,得到"运行时 + 工程骨架"的基本大小;

  • 再把模型与预处理接入,观察增量;

  • 用 map 文件把 Flash 大头定位出来(通常是:某些算子实现 + DSP 预处理 + 权重常量区)。

Step 3:RAM 评估,这一点是TinyML 最常见的失败点

MCU 上的 RAM 主要会下面几块内容占用:

  • Tensor Arena(激活张量 + scratch buffer)

  • 模型输入/输出 buffer(含量化/反量化缓冲)

  • 预处理 buffer(音频环形缓冲、FFT 输入输出、特征图缓存等)

  • 任务栈、协议栈 buffer、DMA buffer、双缓冲等系统开销

关键点在于:

LiteRT Micro明确强调其不使用动态内存分配、需要手工管理内存;同时也提醒"支持的算子子集有限"。

这意味着你很容易遇到两类问题:

  • **Arena 够不够:**不够就直接 AllocateTensors 失败或运行崩溃

  • **算子是否支持:**不支持就算内存足够也跑不通

在这一步中,比较常用的真实做法是:

(1)先让模型在 MCU 上能跑通一次推理,然后把 arena 使用量打印出来/记录下来(TFLM/LiteRT Micro 的示例通常会提供类似统计口径);

(2)再逐项加上你的预处理与系统任务,看 RAM 峰值是否超过可用 RAM;

如果我们用 STM32Cube.AI,可直接看到它按层给出的 RAM 分配与外/内存策略建议。

Step 4:算力/时延评估

这一点决定了决定我们的模型运行"能不能实时"。最核心的判断是:在我们的滑窗节拍下,推理和预处理能否在时间预算内完成。

(1)建议从两端测试时延

  • 预处理耗时(FFT/MFCC/滤波/归一化)

  • 推理耗时(Invoke)

(2)对照我们的节拍:

例如我们每 100ms 做一次推理,那么"预处理 + 推理 + 余量"必须显著小于 100ms(通常至少留 30% 以上余量给系统与抖动)。

这里,提供一条加速路径:

  • Cortex-M 上优先使用 CMSIS-NN 路径(M4/M55 等有明显收益)。

  • 如果我们选择了"带 NPU"的 MCU(例如我们课程中配套硬件STM32N6 的 Neural-ART)上评估,则要把"数据搬运/量化格式/内存布局"作为时延的一部分考虑。

Step 5:功耗评估(针对需要电池供电的设备)

针对电池供电的设备来说,MCU 跑 TinyML 是否"合适",最终通常是由功耗决定的。如果我们是电池供电,关键不是"单次推理多耗电",而是"推理频率 + 预处理占空比 + 无线传输策略"叠加后的平均电流。

TinyML 的常见优势之一是:在端侧完成判断后,只上传"事件/摘要",减少无线通信的长期耗电与延迟风险。

比较常用的工程做法:

  • 先测"空闲功耗基线"(MCU + 传感器 + 低功耗模式)

  • 再测"推理占空比下的平均功耗"(例如每秒推理 10 次)

如果平均功耗不达标,再回到模型与节拍做折中:降低推理频率、改特征提取方式、换更合适的模型结构、或选择带加速器的平台。

Step 6:算子支持与工程集成

最后这一点决定我们的项目"能不能顺利落地"

两条硬约束必须在评估早期确认:

算子子集:LiteRT Micro 明确说明只支持 TensorFlow 的"有限子集算子",不支持端侧训练,并且 API 偏底层,需要手工内存管理。

工具链与生态:我们是否能在现有工程里稳定集成(编译器/RTOS/驱动/调试),并具备持续迭代的路径(模型更新、版本回滚、日志与诊断)。

相关推荐
亿道电子Emdoor10 小时前
【Arm】Keil MDK 的Symbols窗口
stm32·单片机·嵌入式硬件
myron668812 小时前
基于STM32LXXX的模数转换芯片ADC(MCP3421A0T-E/CH)驱动C程序设计
c语言·stm32·嵌入式硬件
广药门徒12 小时前
PADS布局时放置同网络部件或过孔的节约空间技巧
嵌入式硬件
csg110715 小时前
PIC单片机进阶实战(六):4-20mA/0-5V/0-10V数据采集
单片机·嵌入式硬件·物联网
码农三叔17 小时前
《卷2:人形机器人的环境感知与多模态融合》
人工智能·嵌入式硬件·算法·机器人·人形机器人
Heart of Dream17 小时前
[STM32 HAL源码解析] 为什么中断里要判断挂起寄存器?为什么非要用回调函数?
单片机·嵌入式硬件
liwulin050618 小时前
【ESP32-S3】WINDOWS+VMware+ROS2+YDLIDA X2导航初步调试
windows·stm32·单片机
dozenyaoyida20 小时前
RS预览失败问题分析和解决
网络·经验分享·嵌入式硬件·tcp·wifi6兼容性·视频预览卡顿
forAllforMe21 小时前
STM32 驱动CAN接口的拉线位移传感器
stm32·单片机·嵌入式硬件