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上进行优化的算子,支持onnxopset10
与opset11
CPU计算※
:暂时未集成的CPU算子,可根据需求来进行CPU端开发支持。转换工具链目前仅支持onnx
opset10
和opset11
算子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中