模型算子支持列表
使用限制说明
本章节主要介绍 D-Robotics 处理器支持的 Caffe 和 ONNX 算子情况,其他未列出的算子因 D-Robotics 处理器 bpu 硬件限制,暂不支持。
术语概念:
-
BPU 加速 :D-Robotics 处理器可以进行加速的算子(一定约束条件下),如果不满足约束条件,则会在 CPU 进行计算
-
CPU 计算 :当前已经在 D-Robotics ARM CPU 上进行优化的算子,支持 onnx opset10 与 opset11。
-
CPU 计算※ :暂时未集成的 CPU 算子。
其他注意事项:
-
RDK X3 所有 BPU 上运行的算子均遵守一般限制:input_batch ≤ 128。
-
RDK Ultra 和 RDK X5 所有 BPU 上运行的算子均遵守一般限制:1. 输入输出维度均为 4,对于支持非四维情况的 op,会在约束中显性标识; 2. shape:H,W,C ∈ [1, 65536],
N <= 4096;3. N x C x H x W <= 1G bytes。 -
支持
Caffe 1.0基础算子以及常用 扩展算子,支持onnxopset10和opset11算子,对于无法满足 BPU 加速约束条件的算子将会退化到 ARM CPU 进行计算。 -
Cast,Constant,Dropout,Reshape,Squeeze,Unsqueeze,Shape这些算子(OP)无法直接运行在 BPU 上,但在一些情况下(常量折叠)算法工具链会将其优化掉进而实现支持的效果。 -
标记为 PyTorch 的算子(OP)为官方的 opset11 不包含的算子,D-Robotics 算法工具链提供了导出脚本可以将其从 PyTorch 导出到 D-Robotics 自定义的 onnx OP 中。
-
基于 tensorflow-onnx(https://github.com/onnx/tensorflow-onnx )转换工具,支持将
tensorlfow1.*版本的算子稳定的转换到opset6-opset11版本的ONNX模型格式,但是Tensroflow2.*当前支持还属于实验版本。 -
关于 OP 主动量化被动量化的说明:一个符合本章节约束条件的 OP 仍然运行在 CPU 的主要原因是该 OP 属于被动量化 OP,算法工具链会根据 OP 的计算特性和 BPU 底层逻辑等多方面考虑设计量化逻辑,当前量化逻辑分为:主动量化,被动量化,手动量化。量化逻辑更多信息请阅读:算法工具链中的主动量化和被动量化逻辑 章节。
RDK X3 支持的 Caffe 算子列表
| caffe 算子名称 | CPU 计算/BPU 加速 | X3 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 | 仅支持 4 维 Conv 计算。 auto_pad 属性不支持。 type 约束支持:float, int32, int8。 pads 属性约束``[Hstart, Wstart, Hend, Wend]`(pads 长度等于 4)并且 Hstart == Hend,Wstart == Wend。 |
| 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 ∈ 4 。 stride_h ≦ stride_w 。 Dilation ∈ 1。 不支持配置 axis 属性。 | 不支持 output_shape 和 output_padding 参数; auto_pad 参数只支持 NOTSET 模式; 不支持 axis |
| MaxUnpool | CPU 计算 | --- | from_type 支持: - X:type 约束:仅支持 float 类型。 - I:Tensor(int64)。 to_type 支持:type 约束:仅支持 float 类型。 |
| 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 ∈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 支持,配置可选值为1、 across_channels 支持,配置可选值为1、 仅支持 Float32 类型的计算。 |
| BatchNorm | BPU 加速 | 无限制 | 无 |
| ELU | CPU 计算 | 不支持 | 无 |
| BNLL | CPU 计算 | 不支持 | 无 |
| PReLU | BPU 加速 | 无限制 | 无 |
| ReLU/LeakyRelu | BPU 加速 | 无限制 | 无 |
| Sigmoid | BPU 加速 | 对于一个输入维度为 1CHW 的 tensor,仅支持 min(8W4C 对齐后的 shape,32C 对齐后的 shape) <=8192的情况。 8W4C:实际运行时 tensor 的 W 维度 padding 至 8 的整数倍,C 维度 padding 至 4 的整数倍。 32C:实际运行时 tensor 的 C 维度 padding 至 32 的整数倍。 在两个对齐方式中取对齐后 shape 最小值,判断是否 <=8192。 | 无 |
| 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 等于 Mul 的情况 | 无 |
| AbsVal | CPU 计算 | 不支持 | 无 |
| Exp | BPU 加速 | 无限制 | 无 |
| Log | CPU 计算 | 不支持 | 无 |
| Power | BPU 加速 | 无限制 | 无 |
| Threshold | CPU 计算 | 不支持 | 无 |
| Reduction | CPU 计算 | 不支持 | operation 支持 SUM、ASUM、 SUMSQ、MEAN ; axis 支持; 仅支持 Float32 类型的计算。 |
| Softmax | CPU 计算 | 不支持 | 无 |
| ArgMax | BPU 加速 | 仅支持 axis=1,c<=64 。 不支持配置 top_k != 1 | 无 |
| Concat | BPU 加速 | 输入输出 Channel:C<=2048 | 无 |
| 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 | -- |
| Normalize | CPU 计算 | 不支持 | type 约束:仅支持 float 类型。 |
| PassThrough | BPU 加速 | 支持 mode=DCR 和 mode=CRD。 仅支持 H 和 W 方向的重新排列,并且仅支持 blocksize=2 的重排列。 举例:NxCxHxW -> Nx(4C)x(H/2)x(W/2)。 | type 约束:仅支持 float 类型。 |
| CReLU | CPU 计算 | 不支持 | type 约束:仅支持 float 类型。 |
| RReLU | CPU 计算 | 不支持 | 无 |
| Permute | CPU 计算 | 不支持 | - 支持 nhwc2nchw,perm:[0, 3, 1, 2]。 - 支持 nchw2nhwc,perm:[0, 2, 3, 1]。 - 支持指定 perm 维度转换,数据类型仅支持 float,int8,int32。 |
| MatMul | BPU 加速 | 对于两个输入分别为 featuremap 和 weight 的场景(即 featuremap 与常量相乘) 其中第一个输入是 featuremap,第二个输入是 weight,以下几种场景均可优化到 BPU 上运行: - K vs KxN、K vs 1xKxN、K vs 1x1xKxN - MxK vs K、MxK vs KxN、MxK vs 1x1xKxN - 1xMxK vs K、1xMxK vs 1xKxN - 1x1xMxK vs K、1x1xMxK vs 1xKxN、1x1xMxK vs 1x1xKxN - BxMxK vs KxN (B>=1) - 1xBxMxK vs KxN (B>=1) - AxBxMxK vs KxN (A>1,B>1) - 其中第一个输入是 weight,第二个输入是 featuremap,以下场景可优化到 BPU 上运行: - 1xBxMxK vs 1x1xKxN (B>1) 对于两个输入均为 featuremap 的场景(即两个 featuremap 相乘),以下场景可优化到 BPU 上运行: - 1xBxMxK vs 1x1xKxN (B>=1) | type 约束:仅支持 float 类型。 |
| Upsample | BPU 加速 | 输入 featuremap 需为四维 NCHW,并且只支持在 H 和 W 维度上进行 resize; 放大系数 factor 支持 2 的幂数倍如 2,4,8,16,32 等; 支持 H 维度和 W 维度的放大系数不同但需要满足 H_factor <= W_factor | 无 |
| ROIPooling | CPU 计算 | 不支持 | 无 |
| PSROIPooling | CPU 计算 | 不支持 | 无 |
RDK X3 支持的 ONNX 算子列表
| ONNX 算子名称 | CPU 计算/BPU 加速 | X3 BPU 支持约束 | CPU 支持约束 |
|---|---|---|---|
| Abs | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Acos | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Acosh | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Add | BPU 加速 | 输入 channel 大小 M<= 2048 支持以下几种情况: 1. Add 的两个输入 shape 为 NCHW 和 NCHW; 2. Add 的两个输入 shape 为 NCHW 和 NC11(Add 的两个输入都需要是其它 op 的输出); 3.作为 resnet 中的 short-cut 子结构的 Add,会被融合到上一个 conv 中加速计算。 | - 支持相同输入 shape 计算。 - 支持输入 1 是标量或者输入 2 是标量的计算。 - 支持 broadcast 计算,最大维度是 5。 |
| And | CPU 计算 | -- | - 支持相同输入 shape 计算。 - 支持输入 1 是标量或者输入 2 是标量的计算。 - 支持 broadcast 计算,最大维度是 5。 |
| ArgMax | BPU 加速 | 1. 输入维度为四维输入 NCHW。 2. 仅支持沿 C 维度进行 argmax,即 axis=1。 3. C <= 64 | type 约束:仅支持 float 类型。 |
| ArgMin | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Asin | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Asinh | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Atan | CPU 计算 | -- | type 约束:仅支持 float 类型 。 |
| Atanh | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| AveragePool | BPU 加速 | Kernel HxW=[1, 7]x[1, 7], Stride ∈185 | auto_pad 属性不支持。 仅支持四维 Tensor 计算。 |
| BatchNormalization | BPU 加速 | 优化阶段会被融合到上一个 conv 中支持 | type 约束:仅支持 float 类型。 支持第 1 个维度是 channel 的数据排布方式计算。 |
| BitShift | CPU 计算※ | -- | -- |
| Cast | CPU 计算 | -- | from_type 支持 double, float, bool, int64, uint32, int32, uint16, int16, uint8, int8。 to_type 支持 double, float, bool, int64, uint32, int32, uint16, int16, uint8, int8。 |
| Ceil | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Clip | BPU 加速 | 无限制。 | type 约束:仅支持 float 类型。 仅有 2 个输入时,默认为 min 参数。 |
| Compress | CPU 计算※ | -- | -- |
| Concat | BPU 加速 | 输入输出 Channel:C<=2048。 | -- |
| ConcatFromSequence | CPU 计算※ | -- | -- |
| Constant | BPU 加速 | 会通过常量折叠将其优化为数值存储 | 目前不支持 sparse_tensor 属性。 type 约束:仅支持 float 类型。 |
| ConstantOfShape | BPU 加速 | 会通过常量折叠将其优化为数值存储 | type 约束支持:float,int32,int8。 |
| 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 取值范围为:2。 Dilation 取值范围:只支持设置为 2 的幂次方,且必须能够被 stride 整除。 h_dilated 和 w_dilated 可以不同但要求 h_diated<=w_dilated 。 单个 Kernel 总体大小限制: HxWxC <= 32768 | 仅支持 4 维 Conv 计算。 auto_pad 属性不支持。 type 约束支持:float,int32,int8。 pads 属性约束:[Hstart, Wstart, Hend, Wend](pads 长度等于 4)并且 Hstart==Hend,Wstart==Wend。 |
| 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)} | auto_pad 属性不支持。 type 约束支持:float,int32,int8。 |
| Cos | BPU 加速 | 对于一个输入维度为 1CHW 的 tensor,仅支持 CxHxW <= 8192的情况 | type 约束:仅支持 float 类型。 |
| Cosh | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| CumSum | CPU 计算 | -- | from_type: x:type 约束仅支持 float 类型。 axis:type 约束仅支持 int32 类型。 to_type:type 约束仅支持 float 类型。 |
| DepthToSpace | BPU 加速 | 支持 mode=DCR 和 mode=CRD。 仅支持 H 和 W 方向的重新排列,并且仅支持 blocksize=2 的重排列。 举例:NxCxHxW -> Nx(C/4)x(2H)x(2W) | from_type 支持: - type 约束仅支持 float 类型。 - 仅支持 4 维度 Tensor 计算。 to_type 支持: - type 约束仅支持 float 类型 。 - 仅支持 4 维度 Tensor 计算。 |
| DequantizeLinear | CPU 计算 | -- | -- |
| Det | CPU 计算※ | -- | -- |
| Div | BPU 加速 | 1. 只支持两个输入均为 featuremap(不支持输入来自于常量); 2. 对 input shape 的约束请参考 Mul 算子 | - 支持相同输入 shape 计算。 - 支持输入 1 是标量或者输入 2 是标量的计算。 - 支持 broadcast 计算,最大维度是 5。 |
| Dropout | BPU 加速 | 该算子推理阶段不参加计算, 会被移除优化 | -- |
| Einsum | CPU 计算※ | -- | -- |
| Elu | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Equal | CPU 计算 | -- | - 支持相同输入 shape 计算。 - 支持输入 1 是标量或者输入 2 是标量的计算。 - 支持 broadcast 计算,最大维度是 5。 |
| Erf | CPU 计算 | -- | type 约束:支持 float、double 数据类型。 |
| Exp | BPU 加速 | -- | type 约束:仅支持 float 类型。 |
| Expand | CPU 计算 | -- | -- |
| EyeLike | CPU 计算 | -- | -- |
| Flatten | CPU 计算 | -- | -- |
| Floor | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| GRU | CPU 计算 | -- | - direction 属性仅支持 forward 类型。 - type 约束:仅支持 float 类型。 - 仅支持输入个数是 3、4、6。 - 输出个数是 2。 |
| Gather | CPU 计算 | -- | from_type 支持: - input:type 约束支持: float,int64,int32,int8,uint64,uint32,uint8。 - indices:type 约束支持 int32, int64。 to_type 支持:type 约束支持: float,int64,int32,int8,uint64,uint32,uint8。 |
| GatherElements | CPU 计算 | -- | -- |
| GatherND | CPU 计算 | -- | from_type 支持: - input:type 约束支持 float,int32,int8。 - indices:tensor(int64)。 to_type 支持:type 约束支持 float,int32,int8。 |
| 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。 | type 约束:仅支持 float 类型。 |
| GlobalAveragePool | BPU 加速 | 假设输入 shape 为 NCHW, 则输入宽高需满足 HxW <= 8192 | 无 |
| GlobalLpPool | CPU 计算 | -- | - type 约束:支持 float 和 double 类型。 - 仅支持四维 Tensor 计算。 |
| GlobalMaxPool | BPU 加速 | 假设输入 shape 为 NCHW, 则输入宽高取值范围为 HxW=[1,1024]x[1,1024] | - type 约束仅支持 float 类型。 - 仅支持四维 Tensor。 |
| Greater | CPU 计算 | -- | - 支持相同输入 shape 计算。 - 支持输入 1 是标量或者输入 2 是标量的计算。 - 支持 broadcast 计算,最大维度是 5。 |
| HardSigmoid | CPU 计算 | -- | type 约束仅支持 float 类型。 |
| Hardmax | CPU 计算※ | -- | -- |
| Identity | CPU 计算 | -- | -- |
| If | CPU 计算※ | -- | -- |
| InstanceNormalization | CPU 计算 | -- | - type 约束仅支持 float 类型。 - 支持第 1 个维度是 channel 的数据排布方式计算。 |
| IsInf | CPU 计算※ | -- | -- |
| IsNaN | CPU 计算※ | -- | -- |
| LRN | CPU 计算 | -- | - type 约束仅支持 float 类型。 - 仅支持四维 Tensor。 |
| LSTM | BPU 加速 | 仅支持 batch_size=1 | - 不支持属性设置。 - type 约束仅支持 float 类型。 - 仅支持输入个数是 3、4、8。 - 输出个数是 2。 |
| LeakyRelu | BPU 加速 | 无 | 无 |
| Less | CPU 计算 | -- | - 支持相同输入 shape 计算。 - 支持输入 1 是标量或者输入 2 是标量的计算。 - 支持 broadcast 计算,最大维度是 5。 |
| LessOrEqual | CPU 计算 | - 支持相同输入 shape 计算。 - 支持输入 1 是标量或者输入 2 是标量的计算。 - 支持 broadcast 计算,最大维度是 5。 | |
| Log | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| LogSoftmax | CPU 计算 | -- | type 约束:仅支持 float 类型。 |
| Loop | CPU 计算※ | -- | -- |
| LpNormalization | CPU 计算 | -- | - p 范数仅支持 1 或者 2。 - type 约束支持 double 类型和 float 类型。 |
| LpPool | CPU 计算 | -- | - auto_pad 属性不支持。 - type 约束支持 double 类型和 float 类型。 - 仅支持 4 维计算。 |
| MatMulInteger | CPU 计算※ | -- | -- |
| MatMul | BPU 加速 |