CMSIS-NN 是什么:Cortex-M 上的神经网络内核库
CMSIS-NN 是什么:Cortex-M 上的神经网络内核库
CMSIS-NN 是 Arm 官方放在 CMSIS 软件包体系中的神经网络推理内核库,面向 Arm Cortex-M 系列:M0、M0+、M3、M4、M7,以及带 Helium(MVE,M-profile Vector Extension)的 M55、M85 等 Armv8.1-M 内核。它既不训练模型,也不负责把训练好的模型转成 C 数组——那两步分别属于训练框架和模型转换器。CMSIS-NN 只做一件事:把推理中最耗时的算子,用目标内核上真正跑得快的方式实现出来。
为什么需要它?在裸机上直接拿浮点参考实现跑推理,问题从来不是「能不能跑」,而是「跑一次要多少周期、占多少 RAM」。Cortex-M4、M7 只有单精度 FPU,一次浮点乘加就是一条指令;而 int8 定点在带 DSP 扩展的 M4、M7 上可以一次做四个 8 位乘加,在带 Helium 的 M55 上还能用向量指令做得更多。CMSIS-NN 的核心价值,就是把「量化到 int8 或 int16」和「用上这些 SIMD 指令」这两件事,打包成可以直接调用的算子。
它和相邻方案的分工一定要分清,否则很容易接错层:
- CMSIS-DSP:通用信号处理库,提供 FFT、FIR、IIR、矩阵运算与统计等能力。CMSIS-NN 的头文件与它共用基础类型定义,但两者解决的问题不同——CMSIS-DSP 里没有卷积神经网络算子。
- TensorFlow Lite for Microcontrollers(简称 TFLM):上层推理框架,负责加载 FlatBuffer 模型、管理 tensor arena、按图调度算子。它的 Cortex-M 优化内核目录里,卷积、深度可分离卷积、全连接、Softmax 等实现是包装 CMSIS-NN 的。也就是说 CMSIS-NN 是算子层,TFLM 是图执行层。
- 厂商 NPU 与专用 DSP SDK:算子在硬件加速单元上跑,吞吐更高,但绑定芯片型号、工具链封闭。CMSIS-NN 是纯 CPU 方案,任何 Cortex-M 都能上。
核心术语先统一,后面会反复用到:
| 术语 | 含义 |
|---|---|
| 量化 quantization | 把浮点权重与激活映射成 8 位或 16 位整数,推理时只做定点运算 |
| scale | 浮点值与整数之间的比例因子,real = scale × (q − zero_point) |
| zero point | 浮点 0 所对应的整数值;非对称量化时通常不为 0 |
| per-tensor / per-channel | 整个张量共用一个 scale,还是每个输出通道各有一个 scale。权重常用后者,精度更好 |
| multiplier / shift | 把浮点的 scale 比值近似成「整数乘子 + 右移位数」,避免运行时出现浮点除法 |
| scratch buffer | 算子执行期间的临时内存,例如 im2col 缓冲,由调用方提供 |
一句话总结定位:CMSIS-NN 不是框架,是内核库。你不会「用 CMSIS-NN 训练模型」,只会「把量化好的权重喂给 CMSIS-NN 的算子」。
