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与opset11CPU计算※:暂时未集成的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中