4、NPU工作原理解析:卷积、全连接、激活函数等算子在NPU上的映射方式,以及数据流和流水线机制

在TinyML模型的部署优化中,理解NPU(神经网络处理单元)的内部工作机制是进行延迟预算优化的前提。与CPU的冯·诺依曼架构或GPU的SIMT架构不同,Arm Ethos-U系列NPU采用了一种面向极致能效比的专用数据流架构。它并非逐指令执行计算,而是将神经网络模型编译为特定的运算图(Compute Graph),通过硬件调度器将算子映射到固定的计算阵列上。本章将深入拆解卷积、全连接、激活函数等核心算子如何在NPU上完成映射,并剖析其独特的数据流与流水线机制,帮助开发者从“调参”层面上升到“架构理解”层面。

输入特征图 IFM (HWC) DDR / SRAM 权重/偏置 Weights (OHWI) Flash / DDR Ethos-U NPU 核心流水线 命令流调度器 (Command Stream Processor) 卷积引擎 MAC阵列 8x8/16x16 3x3/1x1/5x5 全连接引擎 向量MAC 高并行 矩阵乘加速 激活/池化/元素级引擎 ReLU/LeakyReLU/最大池化/加/乘 输出特征图 (OFM) DMA写回DDR / 直接作为下一层IFM 流水线阶段 1. 读取IFM/权重 2. 卷积/FC计算 3. 激活/池化 4. 量化/截断 5. 写回OFM 多级流水线重叠 不同层并行处理 → 数据流 → 权重流

4.1 核心原理:从“指令执行”到“数据流驱动”的架构转变

传统CPU执行神经网络时,每个算子(如卷积)会被拆解为成百上千条指令(load、multiply、add、store),由ALU逐条执行。而Ethos-U NPU采用数据流驱动(Dataflow-Driven)架构,其核心思想是:数据在计算阵列中流动,计算随数据到达而触发,无需中央控制器逐条派发指令。这种架构消除了指令取指(Instruction Fetch)和译码(Decode)的开销,使得能效比提升10-20倍。

在Ethos-U中,神经网络模型首先通过Vela编译器(Arm官方NPU编译器)进行算子融合与重排,生成一个命令流(Command Stream)。该命令流并非CPU指令,而是一系列硬件配置描述符,描述了每个算子的输入地址、输出地址、维度信息、量化参数等。NPU内部的命令流调度器(Command Stream Processor)逐条解析这些描述符,并直接配置对应的计算引擎开始工作。

关键认知:NPU的“编程”不是写代码,而是配置数据路径。开发者通过Vela编译器间接控制NPU的寄存器级行为。因此,优化NPU延迟的核心在于优化数据布局和算子融合策略,而非优化代码循环。

4.2 算子映射方式:卷积、全连接与激活函数的硬件实现

4.2.1 卷积算子:隐式GEMM与MAC阵列

Ethos-U的卷积引擎由一组乘累加单元(MAC)阵列构成,典型配置为8x8或16x16的脉动阵列(Systolic Array)。Vela编译器会将卷积运算转换为隐式GEMM(General Matrix Multiply)形式:将输入特征图(IFM)的每个卷积窗口展开为一行向量,将权重展开为矩阵列,从而将卷积转化为矩阵乘。

硬件映射时,MAC阵列的每一行负责计算一个输出通道的部分和(Partial Sum),每一列负责处理输入通道的累加。例如,对于3x3卷积,输入通道为16,输出通道为32,则MAC阵列会按以下方式工作:

  • 输入重排:DMA从DDR读取IFM数据,按卷积窗口滑动顺序重新排列为9x16的输入块(9个像素位置,16个通道)。
  • 权重驻留:权重矩阵(32x144)预先加载到片上SRAM,并按MAC阵列的列广播。
  • 脉动计算:输入数据从左向右、从上向下在阵列中流动,每个MAC单元完成一次乘加后,将部分和传递给下一行/列。
算子类型硬件映射方式关键参数延迟影响因素
3x3卷积隐式GEMM + 脉动阵列MAC阵列尺寸、输入通道数输入通道数需对齐到MAC列数(如16的倍数)
1x1卷积直接矩阵乘(无窗口滑动)通道数、批量大小数据复用率高,带宽瓶颈较小
深度可分离卷积先逐通道卷积,再逐点卷积通道数、深度乘数逐通道卷积利用率低,需优化通道对齐
全连接向量MAC阵列(高并行)输入维度、输出维度权重加载时间占比高,需预取

4.2.2 全连接算子:向量MAC的并行展开

全连接层本质上是矩阵向量乘(GEMV)。Ethos-U的全连接引擎与卷积引擎共享MAC阵列,但采用不同的数据流模式。卷积引擎强调空间复用(同一权重被多个输入窗口共享),而全连接引擎强调输出并行:每个MAC单元独立计算一个输出神经元的部分和,所有输出神经元并行计算。

例如,一个输入维度为512、输出维度为256的全连接层,硬件会将512个输入值广播到256个MAC单元,每个MAC单元对应一个输出神经元,权重矩阵按列加载。这种模式下,计算延迟 = 输入维度 × 时钟周期 / MAC并行度。由于全连接层通常位于模型末端,其延迟占比虽小,但权重加载的DMA传输时间可能成为瓶颈,尤其是当权重超过片上SRAM容量时。

4.2.3 激活函数与池化:专用硬件单元

ReLU、LeakyReLU、最大池化等算子不会被映射到MAC阵列,而是由专用的激活/池化引擎处理。该引擎位于卷积引擎之后,以流水线方式工作:卷积引擎输出部分和(Partial Sum),激活引擎立即执行ReLU截断或池化窗口操作,无需将中间结果写回DDR。

对于ReLU,硬件仅需比较数据符号位并清零负值,延迟为1个时钟周期。对于LeakyReLU,硬件通过查表或乘法器实现斜率缩放。最大池化则通过比较器树实现,在2x2窗口内进行3次比较即可得到最大值。这些算子与卷积的融合是零开销的,因为它们完全在数据流路径上执行。

优化启示:在Vela编译器中,尽量将ReLU、池化等算子与卷积融合。若模型中存在独立的激活层(如单独定义的ReLU层),编译器会自动将其融合到前一个卷积中。但若激活函数后接有跨层连接(如ResNet的add操作),则融合可能被阻断,导致额外的DDR读写。

4.3 数据流机制:DMA、片上缓冲与数据复用

NPU的数据流设计围绕减少DDR访问这一核心目标展开。Ethos-U内部集成了多个DMA控制器,负责在DDR与片上SRAM之间搬运数据。其数据流遵循以下原则:

  1. 分块(Tiling):Vela编译器将大尺寸特征图切分为多个Tile(如16x16x16),确保每个Tile及其对应权重能完全装入片上SRAM。
  2. 双缓冲(Double Buffering):DMA在搬运下一块数据的同时,当前块正在计算引擎中处理,实现传输与计算的重叠。
  3. 权重驻留(Weight Stationary):对于卷积层,权重一旦加载到SRAM,便在整个Tile计算期间保持不变,避免重复加载。
  4. 输出直写(Output Direct Write):计算完成的部分和直接通过DMA写回DDR,或作为下一层的输入直接留在SRAM中(若下一层能立即消费)。

以MobileNetV2的深度可分离卷积为例,其数据流如下:

1. DMA读取输入Tile (16x16x32) 到SRAM缓冲区A
2. 卷积引擎读取缓冲区A,执行3x3深度卷积
3. 激活引擎执行ReLU6,结果写入缓冲区B
4. DMA从缓冲区B读取数据,同时DMA预取下一Tile到缓冲区A
5. 1x1逐点卷积引擎读取缓冲区B,输出写回DDR

这种流水线使得计算单元的空闲率低于5%,前提是Tile尺寸设置合理且DMA带宽充足。

4.4 流水线机制:多级流水线与层间重叠

Ethos-U的流水线分为微流水线(Micro-Pipeline)和宏流水线(Macro-Pipeline)两个层级。微流水线指单个算子内部的阶段重叠,宏流水线指不同层之间的并行执行。

在微流水线层面,一个卷积操作被分为5个阶段:读取IFM、读取权重、MAC计算、激活处理、写回OFM。这5个阶段由不同的硬件单元并行执行,形成5级流水线。理想情况下,每周期可完成一个MAC操作,吞吐量等于MAC阵列的时钟频率。

在宏流水线层面,NPU允许当前层的计算与下一层的数据预取同时进行。例如,当第N层正在执行卷积计算时,DMA已经开始预取第N+1层的权重和输入数据。Vela编译器通过分析模型的数据依赖关系,自动插入流水线同步指令,确保数据依赖正确的同时最大化重叠度。

风险提示:宏流水线的重叠度受限于SRAM容量。若模型中间特征图过大,无法同时容纳当前层输出和下一层输入,则编译器必须插入同步屏障(Barrier),导致流水线停顿。此时,延迟预算优化应优先考虑减少中间特征图的位宽(如从int8降到int4)或调整网络结构(如减少通道数)。

4.5 案例拆解:基于延迟预算的算子映射优化实战

背景:某智能音箱产品需部署一个关键词唤醒模型(KWS),模型结构为:2个3x3卷积层(通道数32/64)+ 1个全连接层(128→10)。初始部署在Ethos-U55上,实测推理延迟为2.8ms,超出预算(2.0ms)40%。

初始现象与指标:

  • 使用Vela编译器默认配置,未进行任何优化。
  • 通过Arm Cycle Model分析,发现第一个卷积层(Conv1)的MAC利用率仅为62%。
  • DMA带宽利用率达到85%,接近饱和。

分析判断过程:

通过Vela的调试输出(--verbose)发现,Conv1的输入通道数为1(单声道音频特征),而MAC阵列的列数为16。这意味着MAC阵列中只有1/16的列被使用,其余15列空闲。同时,由于输入通道数过少,数据复用率低,DMA频繁搬运小数据块,导致带宽浪费。

实际操作步骤:

  1. 通道填充(Channel Padding):在模型输入端增加一个1x1卷积层,将输入通道从1扩展到16(使用零填充或复制),使MAC阵列满负荷运行。
  2. 权重重排:将全连接层的权重矩阵按16字节对齐,减少DMA读取次数。
  3. 激活融合:确认ReLU已融合到卷积中,避免额外的DDR往返。

结果对比:

优化项优化前优化后提升幅度
Conv1 MAC利用率62%94%+51%
DMA带宽利用率85%72%-15%
总延迟2.8ms1.9ms-32%

风险与代价:增加1x1卷积层引入了额外的计算量(约0.1ms),但换取了MAC利用率的显著提升。若模型对延迟极度敏感,可考虑将输入特征直接复制到16通道,而非使用卷积,但会增加SRAM占用。

复盘经验:NPU优化必须以MAC利用率为核心指标。当MAC利用率低于80%时,优先检查通道数是否对齐、Tile尺寸是否合理、是否存在数据依赖导致的流水线停顿。

4.6 常见误区与总结

误区1:认为NPU延迟与FLOPs成正比。实际上,数据搬运时间往往占据总延迟的40%-60%。减少FLOPs但增加DDR访问的优化(如过度剪枝)可能适得其反。
误区2:忽略量化参数对硬件的影响。Ethos-U的MAC阵列在int8下效率最高,若使用int16或混合精度,MAC利用率会下降50%以上。
误区3:认为所有算子都能融合。实际上,跨层连接(如残差Add)会强制中断流水线,导致额外的DDR读写。在设计模型时,应尽量减少此类分支。