4.5. X3算子支持列表

4.5.1. 支持的Caffe算子列表

caffe算子名称 CPU计算/BPU加速 XJ3 BPU支持约束 CPU支持约束
Convolution BPU加速 Kernel宽高取值范围:HxW=[1,7]x[1,7] 输入输出Channel取值范围(one group) <= 2048(对于非dilated、group、depthwise conv等普通卷积,可以放宽至<=4096) stride无限制 Dilation取值范围:只支持设置为2的幂次方,且必须能够被stride整除。h_dilated和w_dilated可以不同但要求h_diated<=w_dilated 单个Kernel总体大小限制: HxWxC <= 32768 不支持配置axis,默认为1 auto_pad参数只支持NOTSET模式
Deconvolution BPU加速 Kernel 宽高取值范围:HxW=[2,14]x[2,14] 输入输出Channel数值取值范围:C <= 2048 Padding宽高取值范围:HxW=[0,(Kernel_H-1)/2]x[0,(Kernel_W-1)/2] Stride取值范围:Stride ∈ {2, 4} stride_h ≦ stride_w Dilation ∈ {(1, 1)} 不支持配置axis属性 不支持output_shape和output_padding参数; auto_pad参数只支持NOTSET模式 不支持axis
Pooling BPU加速 共有四种Pooling算子即MaxPooling,AveragePooling,GlobalMaxPooling,GlobalAveragePooling。对四种Pooling的约束分别为: MaxPooling: Kernel宽高的取值范围为:[1, 64]x[1,64] Stride取值范围为:[1,185] Padding值需要大于等于零 AveragePooling: Kernel HxW=[1, 7]x[1, 7], Stride ∈{1, 185} GlobalAveragePooling: 假设输入shape为NCHW, 则输入宽高需满足 HxW <= 8192 GlobalMaxPooling: 假设输入shape为NCHW, 则输入宽高取值范围为HxW=[1,1024]x[1,1024]
SPP CPU计算 不支持 支持pyramid_height,2^n 次pooling, n<7;pooling kernel 小于等于 255 支持pool,配置可选值为{0,1}
InnerProduct BPU加速 InnerProduct将被转化为Conv实现 假设InnerProduct的输入feature map的shape为NCHW 1. 如果HW均小于等于7,则Gemm的限制等同于Conv 2. 如果H和W均为1,那么C的限制为 <= 16384;否则 C的大小限制为 <= 2048 3. 如果Gemm后是一个BPU支持的节点,Gemm会进行低精度int8输出,此时的输入宽高限制为: H x W/8 x C/4 <= 1024 4. 如果Gemm后是一个非BPU支持的节点,Gemm会进行高精度int32输出,此时的输入宽高限制为: H x W/8 x C/4 < 2048 不支持配置axis属性
LRN CPU计算 不支持 local_size 支持、alpha支持、beta 支持、norm_region 支持,配置可选值{ACROSS_CHANNELS, WITHIN_CHANNEL }、k 支持
MVN CPU计算 不支持 normalize_variance支持,配置可选值为{0, 1}、across_channels支持,配置可选值为{0, 1}、支持
BatchNorm BPU加速 无限制
ELU CPU计算 不支持
BNLL CPU计算 不支持
PReLU BPU加速 无限制
ReLU/LeakyRelu BPU加速 无限制
Sigmoid BPU加速 无限制
TanH BPU加速 无限制
Eltwise BPU加速 operation目前支持Add和Mul,暂不支持减。 Add: 输入channel大小 M<= 2048 支持以下几种情况: 1. Add的两个输入shape为NCHW和NCHW 2. Add的两个输入shape为NCHW和NC11(Add的两个输入都需要是其它op的输出) Mul: Mul的两个输入都需要是四维并且C的大小需要 <= 2048。 同时仅支持如下shape的相乘: 1. (1xCxHxW vs 1xCxHxW) 2. (1xCxHxW vs 1xCx1x1) 3. (1xCxHxW vs 1x1x1x1)
Bias BPU加速 参考Eltwise等于Add的情况
Scale BPU加速 参考Eltwise等于Sub的情况
AbsVal CPU计算 不支持
Exp CPU计算 不支持
Log CPU计算 不支持
Power CPU计算 不支持
Threshold CPU计算 不支持
Eltwise BPU加速 operation目前支持Add和Mul,暂不支持减。 Add: 输入channel大小 M<= 2048 支持以下几种情况: 1. Add的两个输入shape为NCHW和NCHW 2. Add的两个输入shape为NCHW和NC11(Add的两个输入都需要是其它op的输出) Mul: Mul的两个输入都需要是四维并且C的大小需要 <= 2048。 同时仅支持如下shape的相乘: 1. (1xCxHxW vs 1xCxHxW) 2. (1xCxHxW vs 1xCx1x1) 3. (1xCxHxW vs 1x1x1x1)
Bias BPU加速 参考Eltwise等于Add的情况
Scale BPU加速 参考Eltwise等于Sub的情况
AbsVal CPU计算 不支持
Exp CPU计算 不支持
Log CPU计算 不支持
Power CPU计算 不支持
Threshold CPU计算 不支持
Reduction CPU计算 不支持 operation 支持 SUM、ASUM、 SUMSQ、MEAN ;axis 支持,配置可选值为{0, 3};支持
Softmax BPU加速 支持配置,支持C维度 (默认使用CPU支持,通过在yaml中配置run_on_bpu实现BPU支持)
ArgMax BPU加速 仅支持 axis=1,c<=64 不支持配置top_k != 1
Concat BPU加速 无限制
Split BPU加速 无限制
Slice BPU加速 无限制
Reshape CPU计算 不支持(一些场景下可以融合) shape 支持[1,4]个 shape_dim 配置 ; axis 支持[-4,3]范围内可配,不支 持 N 维度,默认值 0,遵循 caffe 规则 ; num_axes 支持[-1,3]范围内可配,默认 值-1 表示对 axis 起始的所有 轴进行变换
Flatten CPU计算 不支持(一些场景下可以融合) axis 取值范围[-4,3],默认值 为 1,-4 与 0 含义相同。 只支持End_axis == -1。
Crop CPU计算 不支持
Dropout BPU加速 无限制
LSTM BPU加速 仅支持batch=1 --
Upsample BPU加速 输入featuremap需为四维NCHW,并且只支持在H和W维度上进行resize; 放大系数factor支持2的幂数倍如2,4,8,16,32等;支持H维度和W维度的放大系数不同但需要满足H_factor <= W_factor
ROIPooling CPU计算 不支持
PSROIPooling CPU计算 不支持

备注:

  • 支持 Caffe 1.0 基础算子以及常用扩展算子 对于无法BPU加速约束条件的算子将会退化到ARM CPU进行加速

4.5.2. 支持的ONNX算子列表

ONNX算子名称 CPU计算/BPU加速 XJ3 BPU支持约束 CPU支持约束 备注
Abs CPU计算 --
Acos CPU计算 -- --
Acosh CPU计算 -- --
Add BPU加速 输入channel大小 M<= 2048 支持以下几种情况: 1. Add的两个输入shape为NCHW和NCHW 2. Add的两个输入shape为NCHW和NC11(Add的两个输入都需要是其它op的输出) 上层融合/替换
And CPU计算 -- --
ArgMax BPU加速 1. 输入维度为四维输入NCHW 2. 仅支持沿C维度进行argmax,即axis=1 3. C <= 64
ArgMin CPU计算 -- --
Asin CPU计算 -- --
Asinh CPU计算 -- --
Atan CPU计算 -- --
Atanh CPU计算 -- --
AveragePool BPU加速 Kernel HxW=[1, 7]x[1, 7], Stride ∈{1, 185}
BatchNormalization BPU加速 无限制 上层融合/替换
BitShift CPU计算※ -- --
Cast CPU计算 -- from_type支持int8, uint8, int32, int64, float, bool. to_type支持int32, int64, float, int8, uint8, uint32
Ceil CPU计算 --
Clip BPU加速 min=0, max任意大于0值
Compress CPU计算※ -- --
Concat BPU加速 无限制
ConcatFromSequence CPU计算※ -- --
Constant CPU计算 -- 目前不支持sparse_tensor作为输入
ConstantOfShape CPU计算 -- --
Conv BPU加速 Kernel宽高取值范围:HxW=[1,7]x[1,7] 输入输出Channel取值范围(one group) <= 2048(对于非dilated、group、depthwise conv等普通卷积,可以放宽至<=4096) stride无限制,,但对于Conv后接Add(resnet shortcut-connecting) Stride取值范围为:{1, 2} Dilation取值范围:只支持设置为2的幂次方,且必须能够被stride整除。h_dilated和w_dilated可以不同但要求h_diated<=w_dilated 单个Kernel总体大小限制: HxWxC <= 32768 auto_pad参数只支持NOTSET模式
ConvInteger CPU计算※ -- --
ConvTranspose BPU加速 Kernel 宽高取值范围:HxW=[2,14]x[2,14] 输入输出Channel数值取值范围:C <= 2048 Padding宽高取值范围:HxW=[0,(Kernel_H-1)/2]x[0,(Kernel_W-1)/2] Stride取值范围:Stride ∈ {2, 4} stride_h ≦ stride_w Dilation ∈ {(1, 1)} 不支持output_shape和output_padding参数 auto_pad参数只支持NOTSET模式
Cos CPU计算 -- --
Cosh CPU计算 -- --
CumSum CPU计算 -- --
DepthToSpace BPU加速 支持mode=DCR 和 mode=CRD 仅支持H和W方向的重新排列,并且仅支持blocksize=2的重排列。 举例:NxCxHxW -> Nx(C/4)x(2H)x(2W)
DequantizeLinear CPU计算※ -- --
Det CPU计算※ -- --
Div CPU计算 --
Dropout CPU计算 无限制 会被优化调用,不参与推理
Einsum CPU计算※ -- --
Elu CPU计算 --
Equal CPU计算 --
Erf CPU计算※ -- --
Exp CPU计算 --
Expand CPU计算 -- --
EyeLike CPU计算※ -- --
Flatten CPU计算 -- axis 取值范围[-4,3],默认值 为 1,-4 与 0 含义相同。 表示最后一条 轴。只支持end_axis == -1。
Floor CPU计算 --
GRU CPU计算 -- --
Gather CPU计算 -- --
GatherElements CPU计算※ -- --
GatherND CPU计算 -- --
Gemm BPU加速 Gemm将被转化为Conv实现 假设Gemm的输入feature map的shape为NCHW 1. 如果HW均小于等于7,则Gemm的限制等同于Conv 2. 如果H和W均为1,那么C的限制为 <= 16384;否则 C的大小限制为 <= 2048 3. 如果Gemm后是一个BPU支持的节点,Gemm会进行低精度int8输出,此时的输入宽高限制为: H x W/8 x C/4 <= 1024 4. 如果Gemm后是一个非BPU支持的节点,Gemm会进行高精度int32输出,此时的输入宽高限制为: H x W/8 x C/4 < 2048 --
GlobalAveragePool BPU加速 假设输入shape为NCHW, 则输入宽高需满足 HxW <= 8192
GlobalLpPool CPU计算※ -- --
GlobalMaxPool BPU加速 假设输入shape为NCHW, 则输入宽高取值范围为HxW=[1,1024]x[1,1024]
Greater CPU计算 -- --
HardSigmoid CPU计算 -- --
HardSwish CPU计算
Hardmax CPU计算※ -- --
HzChannelShuffle CPU计算
Identity CPU计算 --
If CPU计算※ -- --
InstanceNormalization CPU计算 -- --
IsInf CPU计算※ -- --
IsNaN CPU计算※ -- --
LRN CPU计算 --
LSTM BPU加速 仅支持batch_size=1 --
LeakyRelu BPU加速 作为卷积的激活函数
Less CPU计算※ -- --
LessOrEqual CPU计算
Log CPU计算 --
LogSoftmax CPU计算 --
Loop CPU计算※ -- --
LpNormalization CPU计算※ -- --
LpPool CPU计算※ -- --
MatMulInteger CPU计算※ -- --
MatMul BPU加速 对于两个输入分别为featuremap和weight的场景,仅支持处理一维和二维矩阵,可以将其理解为gemm(约束请参考gemm op) 对于两个输入均为featuremap的场景,需要两个featuremap维度均为四维并且支持如下场景: 1. 1x1xMxK vs 1x1xKxN 2. 1xBxMxK vs 1x1xKxN
Max CPU计算 --
MaxPool BPU加速 Kernel宽高的取值范围为:[1, 64]x[1,64] Stride取值范围为:[1,185] Padding值需要大于等于零 1. dilation只支持1x1 2. 只支持数据行优先存储
MaxRoiPool CPU计算 --
MaxUnpool CPU计算 -- --
Mean CPU计算※ -- --
Min CPU计算※ -- --
Mod CPU计算※ -- --
Mul BPU加速 Mul的两个输入都需要是四维并且C的大小需要 <= 2048。 同时仅支持如下shape的相乘: 1. (1xCxHxW vs 1xCxHxW) 2. (1xCxHxW vs 1xCx1x1) 3. (1xCxHxW vs 1x1x1x1) 注意:输入的取值不能为0。
Multinomial CPU计算※ -- --
Neg CPU计算※ -- --
NonZero CPU计算 -- --
Not CPU计算※ -- --
OneHot CPU计算※ -- --
Or CPU计算 -- --
PRelu BPU加速 无限制 广播模式只支持channel维度 做为卷积的激活函数
Pad BPU加速 仅支持mode=Constant 仅支持H,W维度的pad 1. mode只支持constant 2. 只支持h和w方向的padding 3. 只支持正向padding(add padding) 4. 只支持4维输入
Pow CPU计算 --
QLinearConv CPU计算※ -- --
QLinearMatMul CPU计算※ -- --
QuantizeLinear CPU计算※ -- --
RNN CPU计算 -- --
RandomNormal CPU计算※ -- --
RandomNormalLike CPU计算※ -- --
RandomUniform CPU计算※ -- --
RandomUniformLike CPU计算※ -- --
Range CPU计算
Reciprocal CPU计算※ -- --
ReduceL1 CPU计算※ -- --
ReduceL2 CPU计算※ -- --
ReduceLogSum CPU计算 -- --
ReduceLogSumExp CPU计算※ -- --
ReduceMax CPU计算 -- axes支持0, 1或者等于输入数据的维数
ReduceMean BPU加速 input featuremap需为四维,并且axes=[2, 3] axes支持0, 1或者等于输入数据的维数
ReduceMin CPU计算 -- --
ReduceProd CPU计算 -- --
ReduceSum CPU计算 -- axes支持0, 1或者等于输入数据的维数
ReduceSumSquare CPU计算 -- axes支持0, 1或者等于输入数据的维数
Relu BPU加速 无限制 做为卷积的激活函数
Reshape CPU计算 --
Resize BPU加速 1. 输入featuremap需为四维NCHW,并且只支持在H和W维度上进行resize; 2. 属性mode支持nearest和linear两种模式; 3. 仅支持放大,不支持缩小; 4. 对于mode=nearest,放大系数factor支持2的幂数倍如2,4,8,16,32等;支持H维度和W维度的放大系数不同但需要满足H_factor <= W_factor 5. 对于onnx opset=11,属性coordinate_transformation_mode支持half_pixel, pytorch_half_pixel, asymmetric和align_corners 1. 支持nearest, linear 和 bilinear三种模式 2. coordinate_transformation_mode支持half_pixel, asymmetric和align_corners三种
ReverseSequence CPU计算※ --
Round CPU计算※ -- --
Scan CPU计算※ -- --
Scatter (deprecated) CPU计算※ -- --
ScatterElements CPU计算 -- --
ScatterND CPU计算 -- --
Selu CPU计算 -- --
SequenceAt CPU计算※ -- --
SequenceConstruct CPU计算※ -- --
SequenceEmpty CPU计算※ -- --
SequenceErase CPU计算※ -- --
SequenceInsert CPU计算※ -- --
SequenceLength CPU计算※ -- --
Shape CPU计算 -- --
Shrink CPU计算※ -- --
Sigmoid BPU加速 对于一个输入维度为1CHW的tensor,仅支持CxHxW <= 8192的情况
Sign CPU计算 --
Sin CPU计算 -- --
Sinh CPU计算 -- --
Size CPU计算※ -- --
Slice BPU加速 无限制
Softmax BPU加速 默认运行在CPU上,可以通过run_on_bpu参数控制,但softmax仅符合以下规格可以在BPU上运行: 1. axis仅支持等于1
Softplus BPU加速 对于一个输入维度为1CHW的tensor,仅支持CxHxW <= 8192的情况
Softsign CPU计算 -- --
SpaceToDepth BPU加速 支持mode=DCR 和 mode=CRD 仅支持H和W方向的重新排列,并且仅支持blocksize=2的重排列。 举例:NxCxHxW -> Nx(4C)x(H/2)x(W/2)
Split BPU加速 1. 只支持输入大小为NCHW; 2. 原始输入的长度必须是每个被切分的tensor长度的倍数 3. 只支持沿着C,H,W维度的切分,也就是axis支持等于1,2,3 4. split数应可以整除
SplitToSequence CPU计算※ -- --
Sqrt CPU计算 -- --
Squeeze CPU计算 -- 上层融合/替换
StringNormalizer CPU计算※ -- --
Sub BPU加速 --
Sum BPU加速 限制条件等同于Add -- 上层融合/替换
Tan CPU计算 -- --
Tanh BPU加速 对于一个输入维度为1CHW的tensor,仅支持CxHxW <= 8192的情况
TfIdfVectorizer CPU计算※ -- --
ThresholdedRelu CPU计算 -- --
Tile CPU计算 -- --
TopK CPU计算 -- --
Transpose CPU计算 此OP只能运行在CPU上 只支持h\w转换
Unique CPU计算※ -- --
Unsqueeze CPU计算 --
Upsample (deprecated) 暂不支持 -- --
Where CPU计算 -- --
Xor CPU计算※ -- --
Function CPU计算※ -- --
Celu CPU计算※ -- --
DynamicQuantizeLinear CPU计算※ -- --
GreaterOrEqual 暂不支持 -- --
MeanVarianceNormalization CPU计算※ -- --
GridSample(PyTorch) BPU加速 --

备注:

  • BPU加速 :地平线AI芯片可以进行加速的算子(一定约束条件下),如果不满足约束条件,则会在CPU进行计算

  • CPU计算 :当前已经在地平线ARM CPU上进行优化的算子,支持onnx opset10opset11

  • CPU计算※ :暂时未集成的CPU算子,可根据需求来进行CPU端开发支持。

  • 转换工具链目前仅支持onnx opset10opset11 算子

  • Cast , Constant , Dropout , Reshape , Squeeze , Unsqueeze , Shape 这些Op无法直接运行在BPU上,但在一些情况下(常量折叠)工具链会将其优化掉进而实现支持的效果。

  • 关于Tensorflow:基于tensorlfow-onnx(https://github.com/onnx/tensorflow-onnx)转换工具,支持将 tensorlfow1.* 版本的算子稳定的转换到opset6-opset11版本的ONNX模型格式,但是 Tensroflow2.* 当前支持还属于实验版本。 标记为PyTorch的op为官方的opset11不包含,工具链提供了导出脚本可以将其从PyTorch导出到地平线自定义的onnx op中