1. STM32N6 NPU架构与量化工程导入

STM32N6 是 ST 首批集成自研神经网络加速器 Neural-ART 的通用 MCU 之一。它把一颗面向边缘推理的 NPU 与 Cortex-M55 主核、大容量片上 SRAM 放在同一颗芯片里,使得原本需要外挂加速器或跑在云端的小型视觉、音频模型,可以直接在终端以毫瓦级功耗完成推理。理解这颗 NPU 的硬件特性,是后续所有量化与优化工作的起点——因为量化策略、算子支持、内存布局,几乎都由硬件结构决定。

Neural-ART NPU 的硬件特性

Neural-ART 是一颗定点推理加速器,核心计算单元是 MAC 阵列,按周期并行完成乘加运算。它对外暴露的关键规格包括:算力约 600 GOPS(INT8,1 GHz 条件下),片上专用 SRAM 用于存放权重与激活,支持 INT8 与 INT4 权重、INT8/INT16 激活的混合精度,并通过 AXI 总线与 Cortex-M55 及系统 SRAM 交互。NPU 不直接访问外部 Flash,模型权重必须在推理前由 CPU 搬运到片上内存,这一点直接影响了后面“权重驻留”与“分块调度”的优化思路。

从数据流看,一次推理大致经过:输入张量从系统 SRAM 进入 NPU 输入缓冲 → 逐层执行卷积/全连接/池化等算子 → 中间激活在 NPU 内部 SRAM 与系统 SRAM 之间按需交换 → 输出张量写回系统 SRAM 供 CPU 后处理。NPU 内部有独立的调度器,按层顺序驱动 MAC 阵列,因此“层”是理解性能的基本单位:每层的输入输出尺寸、通道数、量化位宽,共同决定了该层的计算量与内存占用。

STM32N6 推理数据流与 Neural-ART NPU 结构 Cortex-M55 预处理 / 后处理 权重搬运 系统 SRAM 输入/输出张量 中间激活 Neural-ART NPU 输入缓冲 INT8 张量 MAC 阵列 INT8 / INT4 权重 SRAM 量化权重 输出缓冲 激活结果 层调度器 · 逐层驱动 MAC 关键约束 权重需搬入片上 激活走系统 SRAM INT8 为主精度 层间内存需分块

量化在边缘 AI 部署中的价值

边缘部署的核心矛盾是“模型精度”与“资源预算”之间的拉扯。以一颗典型 320×240 输入的轻量检测模型为例,FP32 权重约 8 MB,而 STM32N6 可用于权重的片上空间通常只有几 MB 量级,且外部 Flash 读取带宽有限。量化把权重从 FP32 压到 INT8,体积直接降到 1/4,同时 MAC 阵列对 INT8 的吞吐远高于浮点,推理延迟和功耗同步下降。这就是量化在边缘场景的第一价值:让模型装得下、跑得动。

第二价值在于确定性。定点运算没有浮点舍入的随机性,同一输入在 NPU 上多次推理结果完全一致,便于做功能安全与结果复现。第三价值是工具链协同:Neural-ART 的编译器只接受量化后的模型,量化不是可选项,而是进入 NPU 的“入场券”。因此本课程把量化放在最前面,先建立“量化—编译—部署”的完整链路认知。

课程实战目标与工具链全景

本课程围绕一条主线展开:把一个训练好的浮点模型,经过量化、校准、编译,最终在 STM32N6 上跑出可接受的精度与延迟。实战目标可拆成三层:能看懂——理解 NPU 规格与量化原理;能操作——独立完成 PTQ/QAT、校准集构建、模型编译;能优化——根据逐层耗时与内存占用,调整量化粒度、算子替换与内存分块。

工具链全景如下:训练侧使用 PyTorch 或 TensorFlow 导出 ONNX;量化与编译侧使用 ST 提供的 ST Edge AI Core(原 STM32Cube.AI)及其量化插件,把 ONNX 转为 NPU 可执行的二进制;部署侧使用 STM32CubeIDE 与 STM32CubeProgrammer,把模型与固件一起烧录到开发板。三者之间以 ONNX 和 ST 的中间格式衔接,任何一环的参数变化都会影响最终精度。

建议在动手前先确认三件事:开发板型号(如 STM32N6570-DK)、ST Edge AI Core 版本、以及目标模型的算子是否在 Neural-ART 支持列表内。算子不支持时,编译器会回退到 CPU 执行,性能会明显下降。

一个可复现的入门示例

为了把上述概念落到具体数字,这里给出一个教学示例(参数为合理假设,非实测)。假设输入为 1×3×96×96 的分类模型,权重 FP32 约 1.2 MB。使用 INT8 对称量化,权重体积降至约 0.3 MB,可完整驻留片上权重 SRAM。校准集取 200 张训练集图片,采用逐通道量化。编译后若 NPU 占用率约 70%,则单帧推理延迟可控制在十几毫秒量级。判断是否达标,看两个指标:Top-1 精度相对浮点下降不超过 1 个百分点,且单帧延迟满足应用帧率要求。

# 量化与编译的典型命令形态(示例)
stedgeai quantize --model model.onnx \
  --calibration calib/ --calib-count 200 \
  --per-channel --output model_int8.onnx

stedgeai generate --model model_int8.onnx \
  --target stm32n6 --output generated/

执行后重点观察编译器输出的报告:每层的量化位宽、是否回退 CPU、权重与激活的内存峰值。若某层被标记为 CPU fallback,优先检查该算子是否在支持列表,必要时用等价算子替换。报告中的内存峰值若超过片上预算,就需要在后续章节学习内存分块与权重驻留策略。

量化不是“压得越狠越好”。INT4 权重虽然进一步省内存,但对通道数少、动态范围大的层容易造成明显精度损失。是否启用 INT4,应以逐层精度对比结果为准,而不是全局一刀切。