概述
产品定位
Arm Ethos-U 系列是 Arm 为微处理器系统实现边缘计算设计的 NPU IP 核,旨在以极低的功耗和芯片面积高效加速机器学习推理任务,推荐和Cortex-M处理器搭配,当前包括U55、U65、U85三款产品。
本文以U65进行介绍,U65 支持最高 1TOP/s 算力,支持 TensorFlow Lite架构,要求权重 8bit 量化,可以部署在裸机或 RTOS 系统。官方提供 Vela 编译器可以将模型转化为指令流高效在 NPU 上部署,同时可以使用CMSIS-NN 库简化开发流程。

应用场景
官方针对U65提供了 Corstone-315 物联网参考设计平台,方案是 Cortex M85+Ethos U65+Mali C55,M85 是专门面向机器学习的 MCU,支持最新的 Helium 技术,C55 是 ISP。以目标检测为例,U65 只能计算中间过程,前处理 resize 和格式转换还需要 ISP 实现,后处理排序和 NMS 还需要处理器实现,甚至对于网络中一些 U65 不支持的算子也需要处理器实现。

成熟产品可以参考恩智浦 i.MX 93 处理器,整体方案为 Cortex A55+M33+Ethos-U65异构架构。
硬件架构
功能模块
NPU包含Central Control(CC)、DMA controller、Weight decoder、MAC unit和Output unit等子模块,下面分别介绍。
• Central Control :解析命令流为具体任务,排队并分派给 DMA 、权重解码器、MAC单元和输出单元
• DMA controller :通过AXI主接口进行数据搬运,包括读命令流、读写权重和偏置、读输入特征图(IFM)、写输出特征图(OFM)和内存到内存搬运(用于优化加速运算)
• Weight decoder :权重解码器,u65 输入权重为压缩编码格式,经DMA搬运到IP内部解码再分发至MAC单元待参与运算。
• MAC unit :读取特征图(IFM)执行点积和累加运算,对应卷积、深度卷积、向量乘等算子。
• Output unit:对输出特征图(OFM)执行缩放、偏置和激活函数处理,然后写到外部存储,激活函数支持ReLU、ReLU1、ReLU6、Leaky ReLU、tanh、sigmoid、LUT(实际后几个都是LUT实现的);输出运算支持加/减/乘、最值、绝对值、左/右移前导零计数。

外部接口
• 时钟复位 :模块为单一时钟域。
• APB 4 从接口 :用于寄存器配置。
• AXI 5 主接口x2 :用于读取指令块、读取权重、读写中间数据,可以通过寄存器配置哪些区域通过哪个AXI接口实现。
• Q-Channel :低功耗握手接口,参见 amba spec。
• IRQ:中断,指示运算完成。
数据类型
特征图格式
IP在外部采用NHWC(批次、高、宽、通道)格式,也就是TensorFlow Lite的标准格式,内部采用NHCWB16格式,将每16个通道打包为Block以提升访问效率。
对于NHWC,要求N=1,每个元素大小1字节或2字节,元素 (y, x, c) 的地址为 BASE + ySTRIDE_Y + x*STRIDE_X + c*ElemSize,BASE是基地址,STRIDE是偏移,BASE和STRIDE在命令流中可以看到定义。
数据类型与精度
支持如下数据类型
| 数据类型 | 范围/取值 |
|---|---|
| 支持的激活与权重组合 | • 无符号8位激活 + 无符号8位权重:支持按tensor配置激活和权重的无符号零点,范围 0--255 • 有符号8位激活 + 有符号8位权重:支持按tensor配置激活的有符号零点,范围 -128 至 +127; • 有符号16位激活 + 有符号8位权重:激活和权重均为对称 |
| 逐输出通道偏置与缩放激活值 | • 8位激活值:支持逐输出通道偏置和缩放 • 16位激活值:支持逐输出通道偏置和缩放 |
| 累加器格式 | 32位累加器, 40位累加器, 16位浮点累加器(s5.10) |
| 位宽 | 8×16位操作的运行速度是 8×8 位操作的一半 |
| Tensor维度 | • 高度范围:1--65536 • 宽度范围:1--65536 • 深度(通道数)范围:1--65536 |
算子支持
算子支持如下,在支持的基础上还有额外约束条件。
ABS、ADD、ARG_MAX、AVERAGE_POOL_2D、BATCH_MATMUL、CONCATENATION、CONV_2D、DEPTHWISE_CONV_2D、EXP、EXPAND_DIMS、FULLY_CONNECTED、HARD_SWISH、LEAKY_RELU、LOG、LOGISTIC、MAXIMUM、MAX_POOL_2D、MEAN、MINIMUM、MIRROR_PAD、MUL、NEG、PACK、PAD、PADV2、PRELU、QUANTIZE、REDUCE_MAX、REDUCE_MIN、RELU、RELU6、RELU_0_TO_1、RELU_N1_TO_1、RESHAPE、RESIZE_BILINEAR、RESIZE_NEAREST_NEIGHBOR、REVERSE_V2、RSQRT、SLICE、SOFTMAX、SPLIT、SPLIT_V、SQUARED_DIFFERENCE、SQUEEZE、STRIDED_SLICE、SUB、SUM、TANH、TILE、TRANSPOSE、TRANSPOSE_CONV、UNIDIRECTIONAL_SEQUENCE_LSTM、UNPACK
卷积
NPU允许最大 64x64 的 2D 卷积和 1x4096 的 1D 卷积,所以实际网络需要拆成若干Block再进行计算,对于 8 位激活值,32 位累加器不会溢出;对于 16 位激活值,40 位累加器不会溢出。
| 参数 | 要求 |
|---|---|
| 卷积核 | 1 <= kernel_x*kernel_y <= 64*64 1 <= kernel_y <= 64 |
| 精度 | 权重类型: {int8, uint8} |
| 步长 | 1 <= stride_x <= 3 1 <= stride_y <= 3 |
| 膨胀卷积 | 1x1, 1x2, 2x1, 2x2 |
| 上采样限制 | 2x2 |
| pad填充 | 顶部/左侧 0--31, 底部/右侧 0--32 |
| 融合激活函数 | {int8, uint8, int16}: ReLU, ReLUX, tanh, sigmoid, LUT |
| 权重顺序 | 按深度优先、按部分核优先 |
| 缩放 | 逐输出通道的缩放和偏置参数 |
| 累加器 | fp(s5.10), int32, int40 |
深度卷积
深度卷积有一个 H×W×C 的矩阵,其中大小为 H×W 的卷积核独立地应用于每个通道。每一层只应用一个卷积核(depth_multiplier=1)。
| 参数 | 要求 |
|---|---|
| 卷积核 | 1 <= kernel_x*kernel_y <= 64*64 1 <= kernel_y <= 64 |
| Precision | 权重类型: {int8, uint8} |
| 步长 | 1 <= stride_x <= 3 1 <= stride_y <= 3 |
| 膨胀卷积 | 1x1, 1x2, 2x1, 2x2 |
| 上采样限制 | 2x2 |
| pad填充 | 顶部/左侧 0--31, 底部/右侧 0--32 |
| 融合激活函数 | {int8, uint8, int16}: ReLU, ReLUX, tanh, sigmoid, LUT |
| Depth multiplier | 1 |
| 缩放 | 逐输出通道的缩放和偏置参数 |
| 累加器 | fp(s5.10), int32, int40 |
池化
| 参数 | 要求 |
|---|---|
| 卷积核 | 带填充的平均池化: 1 <= kernel_x <= 8 1 <= kernel_y <= 8 不带填充的平均池化 和 最大池化: 1 <= kernel_x * kernel_y <= 256*256 1 <=kernel_y <= 256 |
| 精度 | 不带填充的平均池化: {uint8, int8, int16} → {uint8, int8, int16},任意配对均可 带填充的平均池化 或 最大池化: 输出特征图类型必须等于输入特征图类型 支持类型:{int8, uint8, int16} |
| 步长 | 1 <= stride_x <= 3 1 <= stride_y <= 3 |
| 输入上采样 | 平均池化:2×2 最近邻插值, 或 2×2 零插入 最大池化:2×2 最近邻插值 |
| pad填充 | 平均池化:顶部/左侧 0--3, 底部/右侧 0--4 最大池化:顶部/左侧 0--127, 底部/右侧 0--128 |
| 融合激活函数 | {int8, uint8, int16}: ReLU, ReLUX, tanh, sigmoid, LUT |
| 缩放 | 带pad的平均池化 或 最大池化:无缩放 不带pad的平均池化:可选择逐通道缩放+偏置,或全局缩放 |
| 累加器 | 所有池化: int32 不带填充的平均池化: int32, int40 |