4、NPU工作原理解析:卷积、全连接、激活函数等算子在NPU上的映射方式,以及数据流和流水线机制
在TinyML模型的部署优化中,理解NPU(神经网络处理单元)的内部工作机制是进行延迟预算优化的前提。与CPU的冯·诺依曼架构或GPU的SIMT架构不同,Arm Ethos-U系列NPU采用了一种面向极致能效比的专用数据流架构。它并非逐指令执行计算,而是将神经网络模型编译为特定的运算图(Compute Graph),通过硬件调度器将算子映射到固定的计算阵列上。本章将深入拆解卷积、全连接、激活函数等核心算子如何在NPU上完成映射,并剖析其独特的数据流与流水线机制,帮助开发者从“调参”层面上升到“架构理解”层面。
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)逐条解析这些描述符,并直接配置对应的计算引擎开始工作。
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次比较即可得到最大值。这些算子与卷积的融合是零开销的,因为它们完全在数据流路径上执行。
4.3 数据流机制:DMA、片上缓冲与数据复用
NPU的数据流设计围绕减少DDR访问这一核心目标展开。Ethos-U内部集成了多个DMA控制器,负责在DDR与片上SRAM之间搬运数据。其数据流遵循以下原则:
- 分块(Tiling):Vela编译器将大尺寸特征图切分为多个Tile(如16x16x16),确保每个Tile及其对应权重能完全装入片上SRAM。
- 双缓冲(Double Buffering):DMA在搬运下一块数据的同时,当前块正在计算引擎中处理,实现传输与计算的重叠。
- 权重驻留(Weight Stationary):对于卷积层,权重一旦加载到SRAM,便在整个Tile计算期间保持不变,避免重复加载。
- 输出直写(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编译器通过分析模型的数据依赖关系,自动插入流水线同步指令,确保数据依赖正确的同时最大化重叠度。
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频繁搬运小数据块,导致带宽浪费。
实际操作步骤:
- 通道填充(Channel Padding):在模型输入端增加一个1x1卷积层,将输入通道从1扩展到16(使用零填充或复制),使MAC阵列满负荷运行。
- 权重重排:将全连接层的权重矩阵按16字节对齐,减少DMA读取次数。
- 激活融合:确认ReLU已融合到卷积中,避免额外的DDR往返。
结果对比:
| 优化项 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| Conv1 MAC利用率 | 62% | 94% | +51% |
| DMA带宽利用率 | 85% | 72% | -15% |
| 总延迟 | 2.8ms | 1.9ms | -32% |
风险与代价:增加1x1卷积层引入了额外的计算量(约0.1ms),但换取了MAC利用率的显著提升。若模型对延迟极度敏感,可考虑将输入特征直接复制到16通道,而非使用卷积,但会增加SRAM占用。
复盘经验:NPU优化必须以MAC利用率为核心指标。当MAC利用率低于80%时,优先检查通道数是否对齐、Tile尺寸是否合理、是否存在数据依赖导致的流水线停顿。
4.6 常见误区与总结
误区2:忽略量化参数对硬件的影响。Ethos-U的MAC阵列在int8下效率最高,若使用int16或混合精度,MAC利用率会下降50%以上。
误区3:认为所有算子都能融合。实际上,跨层连接(如残差Add)会强制中断流水线,导致额外的DDR读写。在设计模型时,应尽量减少此类分支。