本文为 RKNN2 V2.5.0 对应平台的算子参考,供 ArmSoM 开发者选型与模型适配时查阅。不能据此认定所有 ArmSoM 板卡均支持这些算子;需按板卡 SoC、实际 Toolkit2、Runtime、NPU 驱动及 BSP 版本核对。原稿没有统一指定适用 Linux 内核,本文未进行 ArmSoM 硬件验证。
来源:本地中英文《RKNN2 算子支持与约束参考》V2.5.0。中文依中文稿;英俄德依英文稿。两稿分别为 374/384 页。各平台限制独立保留,不将一个平台的支持结论推广到另一个平台。英文稿 I/O 原图与输出表仍含中文,本文保留其来源并另附可编辑的本地化表格。ConvTranpose 等原稿拼写及 LSTM/GRU 原始公式保留;不要将本文公式视为 SDK 实现修正。
原稿页码: CN 151–163; EN 155–168.
算子参考系列目录
RKNN2 V2.5.0 · RK3566/RK3568:基础与卷积
RKNN2 V2.5.0 · RK3566/RK3568:循环网络、运算与池化
RKNN2 V2.5.0 · RK3566/RK3568:形状、切片与转置
RKNN2 V2.5.0 · RK3566/RK3568:激活、归一化与扩展算子
RKNN2 V2.5.0 · RK3588:循环网络、运算与池化
RKNN2 V2.5.0 · RK3588:形状、切片与转置
RKNN2 V2.5.0 · RK3588:激活、归一化与扩展算子
RKNN2 V2.5.0 · RK3562:循环网络、运算与池化
RKNN2 V2.5.0 · RK3562:形状、切片与转置
RKNN2 V2.5.0 · RK3562:激活、归一化与扩展算子
RKNN2 V2.5.0 · RV1103/RV1106:基础与卷积
RKNN2 V2.5.0 · RV1103/RV1106:循环网络、运算与池化
RKNN2 V2.5.0 · RV1103/RV1106:形状、切片与转置
RKNN2 V2.5.0 · RV1103/RV1106:激活、归一化与扩展算子
RKNN2 V2.5.0 · RK3576/RV1126B:基础与卷积
RKNN2 V2.5.0 · RK3576/RV1126B:循环网络、运算与池化
RKNN2 V2.5.0 · RK3576/RV1126B:形状、切片与转置
RKNN2 V2.5.0 · RK3576/RV1126B:激活、归一化与扩展算子
RKNN2 V2.5.0 · RK2118:循环网络、运算与池化
RKNN2 V2.5.0 · RK2118:形状、切片与转置
RKNN2 V2.5.0 · RK2118:激活、归一化与扩展算子
RKNN2 V2.5.0 · RV1103B/RV1106B:基础与卷积
RKNN2 V2.5.0 · RV1103B/RV1106B:循环网络、运算与池化
RKNN2 V2.5.0 · RV1103B/RV1106B:形状、切片与转置
Relu
将输入张量的负值设为零,正值保持不变
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
- 广播支持
- 无
输出列表
- output:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T1:int8(Tensor),float16(Tensor)
其他支持
- 多核联合:暂不支持
Clip/ReLU6
将输入张量的值裁剪到[0,6]范围内
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
- 广播支持
- 无
输出列表
- output:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T1:int8(Tensor),float16(Tensor)
其他支持
- 多核联合:暂不支持
PRelu
将输入张量的负值按可学习参数缩放,正值保持不变
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer/per-channel
- 广播支持
- 无
输出列表
- output:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer/per-channel
属性列表
- slope:PRelu系数
- 仅支持单个标量或C维度系数
数据类型约束
- T1:int8(Tensor),float16(Tensor)
其他支持
- 多核联合:暂不支持
LeakyRelu
将输入张量的负值按固定比例缩放,正值保持不变
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
- 广播支持
- 无
输出列表
- output:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T1:int8(Tensor),float16(Tensor)
其他支持
- 多核联合:暂不支持
Reshape
在不改变输入数据和元素数量的情况下,返回一个具有指定形状的张量。
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
输出列表
- output:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T1:int8(Tensor),float16(Tensor)
属性列表
- shape:int
- 指定输出张量的形状
其他支持
- 多核联合:尚不支持
Resize
调整输入张量的大小。一般来说,它将输出张量中的每个值计算为输入张量中邻域(即采样位置)的加 权平均值
输入列表
- X:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
- roi(optional):T2
- 目前暂不支持
- scales(optional):T2
- 沿每个维度的缩放比例数组
- sizes(optional):T3
- 输出张量的目标大小
输出列表
- Y:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T1:int8(Tensor),float16(Tensor)
- T2:float(Tensor)
- T3:int64(Tensor)
属性列表
- antialias:int(默认值为0)
- 目前不支持设置
- axes:int[]
- 目前不支持设置
- coordinate_transformation_mode:strings(默认值为”half_pixel”)
- 目前仅支持half_pixel,pytorch_half_pixel,align_corners三种
- cubic_coeff_a:float(默认为-0.75)
- 目前不支持设置
- exclude_outside:int(默认值为0)
- 目前不支持设置
- extrapolation_value:float(默认为0)
- 目前不支持设置
- keep_aspect_ratio_policy:strings(默认值为”stretch”)
- 目前不支持设置
- mode:strings(默认值为”nearest”)
- 目前仅支持nearest和linear两种可配置
- nearest_mode:strings(默认值为”round_prefer_floor”)
- 目前不支持设置 支持说明 目前仅支持宽高方向的整数倍缩放,且缩放倍数为2-8的整数倍,如果是(1,c,1,1)则支持放大到(1,c,h, w)
Slice
获得当前向量的一个切片,具体规则和numpy切片相同
输入列表
- input_tensor:T
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
输出列表
- output:T
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T:int8(Tensor),float16(Tensor)
属性列表
- starts:int(Tensor)
- 切分的起始位置:无限制
- ends:int(Tensor)
- 切分的终止位置:无限制
- axes:int(Tensor)
- 选取切分的轴:支持任意0~3轴,支持同时多轴选择
- steps:int(Tensor)
- 选取切分对应轴的步长
- 当height*width==1&&channel%subc==0&&starts[1]%subc==0&&ends[1]%subc==0&&steps[1]<=subc时,steps可以不为1,否则只有steps==[1,1,1,1]时,才可 通过NPU运行SliceOP
Softmax
该运算符计算给定输入的归一化指数值:
Softmax(input, axis) = exp(input − max(input, axis)) / Σ_axis exp(input −max(input, axis))
“axis”属性表示Softmax执行的维度。输出张量具有相同的形状并包含相应输入的Softmax值。
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 受限于transpose的规格限制
- shape:[batch,channel,height,width]
输出列表
- output:T1
- shape:[batch,channel,height,width]
数据类型约束
- T1:int8(Tensor),float16(Tensor)
属性列表
- axis:int
- 做softmax的轴:1,3,即channel和width方向
exSoftmax13
该运算符计算给定输入的归一化指数值:
exSoftmax13(input, axis) = exp(input − max(input, axis)) / Σ_axis exp(input −max(input, axis))
“axis”属性表示Softmax执行的维度。输出张量具有相同的形状并包含相应输入的Softmax值。
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 受限于transpose的规格限制
- shape:[batch,channel,height,width]
输出列表
- output:T1
- shape:[batch,channel,height,width]
数据类型约束
- T1:int8(Tensor),float16(Tensor)
属性列表
- axis:int64
- 做softmax的轴:1,3,即channel和width方向
exSoftmaxMask
该运算符计算给定输入的归一化指数值:
input(x, mask_t, mask_value) =
x + (mask_t - 1) * inf if mask_value = 0
x + mask_t * (-inf) elif mask_value = 1
exSoftmaxMask(input, axis) = exp(input - max(input, axis)) / Σ_axis(exp(input - max(input, axis)))
“axis”属性表示Softmax执行的维度。输出张量具有相同的形状并包含相应输入的Softmax值。
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 受限于transpose的规格限制
- shape:[batch,channel,height,width]
- mask(optional):T1
- shape:[1,channel,height,width]
- channel∈(0,8192]
- width: · axis=1,无限制; · axis=3/-1,width∈(0,8192]
- shape:[1,channel,height,width]
输出列表
- output:T1
- shape:[batch,channel,height,width]
数据类型约束
- T1:int8(Tensor),float16(Tensor)
属性列表
- axis:int64
- 做softmax的轴:1,3,即channel和width方向
- mask_value:int64
- 需要mask的值:0,1
Split
将向量沿着axis方向分成num_outputs个向量,split用于指定切分后向量在axis方向上的大小
输入列表
- input_tensor:T
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
输出列表
- output:T
- 一或多个输出向量,由num_outputs属性决定
- shape:根据切分情况决定
- 量化支持
- per-layer
数据类型约束
- T:int8(Tensor),float16(Tensor)
属性列表
- axis:int
- axis∈{0,1,2,3}
- num_outputs:int
- split:int(Tensor)
Sub
- 执行元素级二进制减法(C=A-B),支持多向Numpy样式的广播
输入列表
- A:T1,T2
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
- 广播支持
- [b,c,1,1]
- [scalar]
- B:T1,T2
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
- 广播支持
- [b,c,1,1]
- [scalar]
输出列表
- C:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T1:int8(Tensor),float16(Tensor)
- T2:float(constTensor)
Tile
通过平铺给定的张量构造张量,这与Numpy中的函数tile相同,但没有广播
输入列表
- input:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
- repeats:T2
- shape:[batch,channel,height,width]
输出列表
- output:T1
- shape:[batch,channel,height,width]
- 量化支持
- per-layer
数据类型约束
- T1:int8(Tensor),float16(Tensor)
- T2:int64(Tensor)
Transpose
对输入张量进行转置
输入列表
- X:T1
- shape:[n1,c1,h1,w1]
- 详细约束规则见属性列表
- 量化支持
- per-layer
- shape:[n1,c1,h1,w1]
输出列表
- Y:T1,T2
- shape:[n2,c2,h2,w2]
- 详细约束规则见属性列表
- 量化支持
- per-layer
- shape:[n2,c2,h2,w2]
属性列表
- perm转置的轴顺序: 不同perm参数限制如下:(其中p=268435456,q=65536)
- perm=[0,1,2,3]
- 无限制
- perm=[0,1,3,2]
- T1:h1%16=0,h1w1<16p,h1w1<2q
- T2:h1%8=0,h1w1<8p,h1w1<2q
- perm=[0,2,3,1]
- T1:c1<8192,h1w1%8=0,w1c1<p*16
- T2:c1<8192,h1w1%8=0,w1c1<p*8
- perm=[0,2,1,3]
- T1:h1%16=0,h1w1<16p,h1w1<2q,c1*w1<p
- T2:h1%8=0,h1w1<8p,h1w1<2q,c1*w1<p
- perm=[0,3,1,2]
- T1,T2:h1w1<p,w1<8192,h1c1<p
- perm=[0,3,2,1]
- T1:h1%16=0,h1w1<16p,h1w1<2q,c1<p*16
- T2:h1%8=0,h1w1<8p,h1w1<2q,c1<p*8
- perm=[1,0,2,3]
- T1:h1w1<16p,n1<8192,h1*w1<p
- T2:h1w1<8p,n1<8192,h1*w1<p
- perm=[1,0,3,2]
- T1:h1%16=0,c1h1w1<16p,h1w1<2*q
- T2:h1%8=0,c1h1w1<8p,h1w1<2*q
- perm=[1,2,0,3]
- T1:n1w1<p16,c1h1w1<p,w1%16=0
- T2:n1w1<p8,c1h1w1p,w1%8=0
- perm=[1,2,3,0]
- T1:h1w1<p,n1<p16,c1h1w1<p16,n1w1<p*16
- T2:h1w1<p,n1<p8,c1h1w1<p8,n1w1<p*8
- perm=[1,3,0,2]
- T1:c1w1<8192,n1h1<p,w1%16=0
- T2:c1w1<8192,n1h1<p,w1%8=0
- perm=[1,3,2,0]
- T1:c1h1w1<p,n1*h1<p,w1<8192,w1%16=0
- T2:c1h1w1<p,n1*h1<p,w1<8192,w1%8=0
- perm=[2,1,0,3]
- T1,T2:c1<8192,c1h1w1<p,n1*w1<p
- perm=[2,1,3,0]
- T1:c1h1w1<p,n1w1<p16,c1<8192,n1*w1%4=0
- T2:c1h1w1<p,n1w1<p8,c1<8192,n1*w1%4=0
- perm=[2,0,3,1]
- T1,T2:c1<8192,c1h1w1<p
- perm=[2,0,1,3]
- T1:n1c1h1w1<p,h1w1%16=0
- T2:n1c1h1w1<p,h1w1%8=0
- perm=[2,3,1,0]
- T1:c1h1w1<p,n1c1<p,h1w1<8192,h1*w1%16=0
- T2:c1h1w1<p,n1c1<p,h1w1<8192,h1*w1%8=0
- perm=[2,3,0,1]
- T1,T2:h1w1<8192,n1c1<p
- perm=[3,0,2,1]
- T1:h1w1<p,n1c1<8192,c1h1<p,n1w1<8192,n1*w1%16=0
- T2:h1w1<p,n1c1<8192,c1h1<p,n1w1<8192,n1*w1%8=0
- perm=[3,0,1,2]
- T1:h1w1<p,n1c1<8192,c1h1<p,n1w1<8192,n1h1w1%16=0
- T2:h1w1<p,n1c1<8192,c1h1<p,n1w1<8192,n1h1w1%8=0
- perm=[3,2,0,1]
- T1,T2:h1w1<p,n1c1<8192,n1c1w1<p
- perm=[3,2,1,0]
- T1:c1h1w1<p,h1w1<8192,2h1w1<q,n1c1<p*16,h1%16=0
- T2:c1h1w1<p,h1w1<8192,2h1w1<q,n1c1<p*8,h1%8=0
- perm=[3,1,0,2]
- T1,T2:h1w1<p,c1w1<8192,n1*h1<p
- perm=[3,1,2,0]
- T1,T2:h1w1<p,n1c1<8192,n1h1<p,n1c1*w1<p
- perm=[0,1,2,3]
数据类型约束
- T1:int8(Tensor)
- T2:int16(Tensor),float16(Tensor)
其他支持
- 多核联合:暂不支持
