模型算子支持列表
使用限制说明
本章节主要介绍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加速 |