4. Neural-ART NPU架构与算力特性

Neural-ART 是 ST 在 STM32N6 中集成的神经网络加速器,它不是一颗“跑得快的 CPU”,而是一套围绕张量计算组织起来的专用数据通路。理解它的关键,不是记住某个 TOPS 数字,而是搞清楚三件事:算力由什么结构提供、数据如何被喂进这个结构、哪些算子能真正落到硬件上。这三件事共同决定了 STM32N6 上模型能跑多快、能跑多大、以及哪些网络结构会“掉出”加速范围。

MAC 阵列:算力的物理来源

Neural-ART 的核心是一个二维乘累加(MAC)阵列。每个 MAC 单元在一个时钟周期内完成一次“乘 + 累加”,阵列规模决定了单周期可并行完成的乘累加次数。若阵列有 M 行 × N 列,则单周期可执行 M×N 次 MAC。算力估算的基本关系是:

峰值算力(ops/s) ≈ MAC阵列规模 × 2 × 主频
其中 ×2 是因为一次 MAC 计为 2 次运算(乘、加)

举例说明(示例参数,非实测):若阵列规模为 1024 个 MAC,NPU 时钟为 800 MHz,则峰值约为 1024 × 2 × 800M ≈ 1.64 TOPS。这个数字是“理论上限”,只有在数据供给充足、算子完全匹配、无停顿的理想情况下才能逼近。实际有效算力通常显著低于峰值,差距来自访存、调度和算子映射效率。

MAC 阵列对数据有强烈的“复用偏好”:卷积和矩阵乘中,权重和激活可以被多个 MAC 共享。因此阵列越大,越需要高带宽的片上缓存来喂数据。Neural-ART 配套了专用的张量缓存与权重缓存,目的就是让阵列尽量不因等数据而空转。这也解释了为什么“同样算力的 NPU,实际帧率可能差一倍”——瓶颈往往不在 MAC,而在数据搬运。

张量调度:让阵列持续忙碌

张量调度解决的是“如何把一层网络切分、排序、送入阵列”的问题。Neural-ART 的调度大致遵循这样的数据流:输入张量从系统内存或外设进入 → 在片上缓存中按 tile(分块)组织 → 权重从权重缓存流式加载 → MAC 阵列计算 → 累加结果写回 → 激活/量化在输出阶段处理。

调度器需要处理几个现实约束:片上缓存容量有限,大特征图必须分块;不同层的张量形状差异大,需要动态重排;卷积的 im2col 展开会放大数据量,必须靠复用抵消。因此,一个模型能否高效运行,很大程度上取决于编译器能否把算子切成适合阵列的 tile,并让相邻层之间的数据尽量留在片上。

Neural-ART 张量数据通路与算力边界 输入张量 系统内存 / 摄像头 片上张量缓存 tile 分块 / 复用 权重缓存流式加载 MAC 阵列 M×N 并行乘累加 输出处理 累加 / 激活 / 量化 写回内存 算子加速范围 Conv / DWConv MatMul / FC Pooling / Resize Add / Concat 激活 / 量化 自定义算子→CPU 绿色=硬件加速 黄色=部分支持 红色=回退 CPU 性能边界与影响因素 峰值算力 MAC规模 × 2 × 频率 有效算力 受访存/调度制约 关键瓶颈 带宽 / tile / 算子映射 量化收益 INT8 带宽↓、吞吐↑

量化支持:INT8 是主战场

Neural-ART 对量化有明确偏好:INT8 是主力精度,权重和激活都以 8 bit 定点参与 MAC 运算。相比 FP32,INT8 带来三重收益:权重体积缩小约 4 倍,激活带宽需求下降,MAC 阵列在相同面积下可容纳更多并行单元。对 STM32N6 这类嵌入式 NPU,量化不是“可选优化”,而是发挥算力的前提。

量化部署中真正容易出问题的是 per-tensor 与 per-channel 的选择。权重通常采用 per-channel 量化,因为不同输出通道的数值范围差异大;激活多采用 per-tensor,便于硬件统一处理。校准集的选择直接决定 scale 和 zero_point:校准集应覆盖真实输入分布,若只用少量样本,某些通道的动态范围会被低估,导致推理时饱和截断。实践中建议用 100~500 张有代表性的输入做校准,并检查每层激活的饱和比例。

另一个关键点是 量化感知训练(QAT)与训练后量化(PTQ)的取舍。PTQ 流程快,适合分类、检测等对精度不极端的任务;若 PTQ 后精度掉点超过可接受范围(例如 mAP 下降超过 2~3 个百分点),再考虑 QAT。Neural-ART 的编译器通常要求模型先转成量化友好的图结构,再映射到硬件。

算子加速范围与性能边界

并非所有算子都能落到 MAC 阵列。Neural-ART 的加速范围集中在计算密集、规则性强的算子:标准卷积、深度可分离卷积、全连接/矩阵乘、池化、上采样、逐元素加与拼接。这些算子形状规整、复用度高,适合阵列并行。

而像自定义激活、复杂索引、动态 shape 操作、非规则稀疏计算,往往只能部分支持或回退到 CPU。回退的代价不只是“慢一点”:CPU 与 NPU 之间的数据往返会打断流水,可能让整层耗时增加数倍。因此模型设计阶段就应尽量用 NPU 友好的算子替换“奇怪”的结构。

性能边界可以用一个简单判断来把握:当算子映射效率高、数据复用充分时,有效算力可接近峰值;当层与层之间频繁换出、或大量算子回退 CPU 时,有效算力可能只有峰值的 20%~40%。 这不是硬件缺陷,而是所有 NPU 的共同规律。部署时的优化重点,就是减少换出、提高 tile 复用、把算子尽量留在加速范围内。

判断一个模型是否适合 STM32N6,可以先看三件事:卷积/矩阵乘占比是否高、是否以 INT8 为主、是否存在大量自定义算子。三者都满足,通常能获得较好的加速比。

部署时的参数检查清单

下面这份清单可直接用于模型上线前的自检,字段围绕 Neural-ART 的实际约束组织:

检查项关注点判断依据
MAC 利用率阵列是否持续有数据有效算力 / 峰值算力,偏低说明访存或 tile 有问题
量化精度INT8 校准是否充分逐层饱和比例、PTQ 后精度掉点
算子覆盖回退 CPU 的算子数量回退层占比越高,流水打断越严重
片上缓存tile 是否超出缓存容量频繁换出意味着带宽成为瓶颈
层间数据相邻层能否留在片上减少内存往返可显著提升有效算力

把这张清单和前面的数据通路图对照使用,就能在部署前定位大部分性能问题:先确认算子是否在加速范围内,再确认量化是否到位,最后看数据是否喂得动 MAC 阵列。Neural-ART 的算力特性并不神秘,它是一套“结构决定上限、调度决定效率、量化决定可行性”的工程体系。