1. CMSIS-NN 概述:它到底是什么?

各位同学,咱们开始第一讲。

先问个问题:你在 Cortex-M 上跑过神经网络吗?如果跑过,大概率遇到过两个麻烦——内存不够,或者算力跟不上。CMSIS-NN 就是 ARM 官方给咱们准备的“救兵”。

说白了,CMSIS-NN 是一套针对 Cortex-M 系列处理器深度优化的神经网络推理库。它不是框架,不负责训练模型;它只做一件事——把训练好的模型在 MCU 上跑得又快又省内存。

1.1 为什么需要 CMSIS-NN?

我刚开始做嵌入式 AI 的时候,踩过一个坑。当时想把一个简单的分类模型塞进 STM32F4 里,模型不大,就几十 KB。结果一跑推理,单次推断花了 800 多毫秒。这哪行?产品要求 50ms 以内。

后来我查了查瓶颈,发现全在卷积和全连接层。Cortex-M4 虽然有 DSP 指令和 SIMD,但编译器不会自动把神经网络算子映射到这些指令上。你写个纯 C 的卷积,编译器生成的是通用循环,根本用不上 SIMD。

CMSIS-NN 就是来解决这个问题的。它做了三件关键事:

  • 手工汇编优化:关键算子直接用 Cortex-M 的 DSP/SIMD 指令手写,不走编译器自动向量化。
  • 量化推理:全部使用 int8/int16 定点运算,避免浮点开销。Cortex-M 没有 FPU 的型号也能跑。
  • 内存复用:通过“内存池”机制,把中间结果 buffer 压到最小。我见过一个项目,用 CMSIS-NN 后内存占用直接砍半。

核心结论:CMSIS-NN 不是“可选项”,而是“必选项”。如果你要在 Cortex-M 上做任何实时推理,不用它,性能基本没戏。

1.2 CMSIS-NN 在 Cortex-M 生态中的位置

咱们把 Cortex-M 生态想象成一个三层结构:

Cortex-M 生态中 CMSIS-NN 的位置 应用层 人脸检测 / 关键词唤醒 / 传感器分类 / 异常检测 中间件层 CMSIS-NN / CMSIS-DSP / CMSIS-Core / CMSIS-RTOS 硬件抽象层 (HAL / CMSIS-Core) 寄存器映射 / 中断控制 / 系统定时器 / MPU 配置 硬件层 Cortex-M4 / M7 / M33 / M55 / M85 + 内存 + 外设 CMSIS-NN 属于 中间件 直接 调用 DSP 指令 不依赖 OS

你看这张图,CMSIS-NN 处在中间件层。它不直接操作硬件寄存器,而是通过 CMSIS-Core 提供的接口访问 DSP 指令和 SIMD。这意味着:

  • 跨平台:同一份 CMSIS-NN 代码,可以在 M4、M7、M33 上编译运行。我换芯片时基本不用改算子代码。
  • 不依赖 RTOS:裸机也能用。CMSIS-NN 本身是纯函数库,没有线程、信号量这些东西。
  • 与 CMSIS-DSP 互补:DSP 库做信号处理(FFT、滤波),NN 库做推理。两个库可以混用。

我的习惯:项目初期先用 CMSIS-NN 的参考实现(纯 C 版本)验证功能,确认模型精度没问题后,再切换到优化版本(汇编优化)。这样调试阶段不会因为汇编代码难读而浪费时间。

1.3 CMSIS-NN 的核心组件

CMSIS-NN 不是一个大而全的库,它只包含几个关键算子。我整理了一张表:

算子 函数名 适用场景 量化类型
卷积 (2D) arm_convolve_s8 图像分类、目标检测的特征提取 int8
深度可分离卷积 arm_depthwise_conv_s8 MobileNet、轻量级网络 int8
全连接 arm_fully_connected_s8 分类器头部、MLP int8
池化 (最大/平均) arm_max_pool_s8 / arm_avg_pool_s8 降采样、特征压缩 int8
激活 (ReLU) arm_relu_s8 非线性变换 int8
Softmax arm_softmax_s8 多分类概率输出 int8

嗯,这里要注意:CMSIS-NN 的算子都是针对 int8 量化输入输出设计的。如果你模型是 float32,得先量化成 int8 才能用。量化方法我们后面专门有一章讲。

1.4 一个简单的性能对比

我拿一个实际项目的数据给大家看看差距。项目用的是 STM32F746 (Cortex-M7, 216MHz),模型是一个 3 层卷积 + 2 层全连接的小网络,输入 32x32 灰度图:

实现方式 单次推理时间 内存占用 (RAM) 代码体积 (Flash)
纯 C 实现 (无优化) 420 ms 128 KB 36 KB
CMSIS-NN (int8 量化) 38 ms 52 KB 28 KB
加速比 11x 2.5x 节省 1.3x 节省

看到没?推理时间从 420ms 降到 38ms,直接跨过了实时性的门槛。内存也省了一半多。这就是 CMSIS-NN 的价值——不是锦上添花,而是雪中送炭。

避坑提醒:我曾经在一个项目里直接用了 CMSIS-NN 的默认配置,结果发现推理结果全是错的。排查了半天,原来是输入数据的量化参数(scale 和 zero_point)没对齐。CMSIS-NN 要求输入数据的量化方式和训练时完全一致,差一点都不行。后面我会专门讲量化对齐的检查方法。

1.5 本章小结

咱们这一章把 CMSIS-NN 的定位讲清楚了:

  • 它是 Cortex-M 上的神经网络推理加速库,不是训练框架。
  • 它通过手工汇编 + 量化 + 内存复用,把推理速度提升 5~15 倍。
  • 它处在中间件层,跨平台、不依赖 OS,与 CMSIS-DSP 互补。
  • 核心算子包括卷积、深度可分离卷积、全连接、池化、激活、Softmax,全部基于 int8 量化。