3. 面向STM32N6 NPU的模型选型与约束分析
在STM32N6上部署神经网络,模型选型不是“先训练再想办法塞进去”,而是从项目一开始就要围绕NPU的硬约束做取舍。STM32N6内置的Neural-ART NPU提供约600 GOPS的算力,配合大容量片上SRAM,能支撑中等规模的视觉与音频推理,但它并不是通用GPU:算子支持范围、张量形状、内存布局和接口带宽都会直接决定一个模型能否落地、能跑多快。本节围绕四类约束展开——支持算子集、张量形状限制、内存预算、输入输出接口,并给出典型视觉/音频模型的适配判断方法。
一、支持算子集:先看“能不能跑”,再看“跑多快”
Neural-ART NPU对算子的支持是分层的。核心加速算子包括卷积(Conv2D)、深度可分离卷积(DepthwiseConv2D)、全连接(Fully Connected)、池化(Max/Average Pool)、逐元素加/乘(Add/Mul)、激活(ReLU、ReLU6、Sigmoid、Tanh)以及部分量化友好的算子如Concat、Reshape、Transpose。这些算子会被映射到NPU的MAC阵列上执行,是性能的主要来源。
而像LSTM、GRU、自定义注意力、动态Shape的Gather、复杂的ArgMax等,往往只能回退到CPU执行,甚至完全不被支持。回退到CPU不仅速度慢一个数量级,还会打断NPU的连续执行流水,造成频繁的DDR/SRAM搬运。因此选型的第一条原则是:统计模型中各算子的计算量占比,确保NPU可加速算子覆盖80%以上的FLOPs。如果某个模型大量使用NPU不支持的算子,即使参数量很小,实际推理时间也可能无法接受。
二、张量形状限制:通道对齐与维度约束
NPU对张量形状有明确的偏好和限制。首先是通道数对齐:为了充分利用MAC阵列的并行度,输入/输出通道数通常建议为8或16的倍数。例如,一个输出通道为12的卷积层,NPU可能按16通道计算,浪费25%的算力;而通道数为16、32、64时效率最高。其次是空间维度,特征图的高宽在多数情况下没有硬性上限,但过小的特征图(如1×1)会导致并行度不足,过大的特征图则受限于片上SRAM容量。
另一个容易被忽视的是张量秩与动态维度。NPU通常要求静态Shape,即推理时所有维度固定。如果模型包含动态batch、动态序列长度(如音频的变长输入),需要在导出时固定为某一典型值,或在预处理阶段做padding/截断。对于音频模型,常见的做法是将输入固定为1秒或2秒的帧长,例如16kHz采样、1秒对应16000个采样点,再通过Mel频谱转换为固定尺寸的时频图。
三、内存预算:权重、激活与中间张量的分配
内存是STM32N6部署中最容易踩坑的约束。需要区分三类内存:权重(Weights)、激活/中间张量(Activations)、以及输入输出缓冲区。STM32N6的NPU有专用的片上SRAM,但容量有限,通常需要将权重放在外部Flash(如Octo-SPI NOR),推理时按层流式加载;激活张量则尽量驻留在片上SRAM,避免频繁访问外部DDR。
一个实用的估算方法是:对每一层,计算输入激活、输出激活和权重的大小,累加后与可用SRAM比较。以INT8量化为例,一个3×3卷积层,输入通道32、输出通道64、特征图56×56,则权重为3×3×32×64=18432字节,输入激活为56×56×32=100352字节,输出激活为56×56×64=200704字节。如果连续多层都保持这个量级,片上SRAM很快会被占满。因此,模型选型时要优先选择通道数适中、特征图分辨率逐步下降的网络结构,例如MobileNet系列在早期层用较大分辨率但较少通道,后期层用较小分辨率但较多通道,整体内存曲线更平滑。
四、输入输出接口:带宽与节拍匹配
模型选型还要考虑传感器接口与推理节拍是否匹配。视觉场景常用DCMI或MIPI CSI接收图像,典型分辨率为320×240或640×480。如果模型输入为224×224×3,则需要在预处理阶段做缩放和裁剪。音频场景常用SAI/I2S接收PCM数据,再通过MFCC或Mel频谱转换为模型输入。接口带宽决定了单位时间内能送入多少数据,而NPU推理时间决定了处理一帧需要多久。两者必须匹配:如果摄像头输出30fps,而模型推理只能做到10fps,就需要降帧或降低分辨率。
五、典型模型适配速查
| 模型类型 | 典型结构 | NPU适配要点 | 内存关注点 |
|---|---|---|---|
| 图像分类 | MobileNetV2 / V3 | DWConv+ReLU6全支持,通道16对齐 | 早期层激活较大,需控制输入分辨率 |
| 目标检测 | YOLO-Fastest / NanoDet | 注意Concat和Resize算子映射 | 多尺度特征图叠加,峰值内存高 |
| 关键词唤醒 | DS-CNN / TC-ResNet | 1D卷积转2D或直接支持 | 输入帧长固定,权重小易驻留 |
| 音频事件检测 | MobileNetV1-1D | 避免LSTM,改用卷积+全局池化 | 时频图尺寸决定激活大小 |
选型时建议按以下顺序推进:先确认算子覆盖率,再检查张量形状是否对齐,然后逐层估算内存峰值,最后核对接口带宽与推理节拍。任何一维不满足,都应优先调整模型结构而非强行部署。例如,将LSTM替换为因果卷积,将动态Shape固定为典型帧长,将通道数从12调整为16,这些改动往往能在保持精度的同时显著提升NPU利用率。