概述

产品定位

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

更多推荐