7. IPU Toolchain 算子支持
1. Caffe支持算子¶
算子 | 备注 |
---|---|
ArgMax | only support top 1 |
Axpy | |
BatchNorm | |
Concat | 最大1024个tensor concat |
Convolution | 限制条件:All tensor size < 2^31 若kernel size 为 do*h*w*di 则h * w < 64 group为1时:转换成Depthwise Convolution; group为C时:转换为Convolution; group为 (1, C) 时:拆解成GroupConv round(di/16)*round(do/16) < 512 * 1024 |
ConvolutionDepthwise | 原生支持Kernel_size为3*3,6*6,9*9,其余情况转换成Convolution处理限制条件:Pad范围:[0, 1] |
CReLU | 输入<=4维 |
ContinuationIndicator | |
Crop | |
Deconvolution | All tensor size < 2^31 若kernel size 为 do*h*w*di,h * w < 64 round(di/16)*round(do/16) < 512 * 1024 |
Dropout | |
Eltwise | 其中PROD和SUM,对于输入的两个tensor,当为4维向量时,满足下面条件 1. NCHW ,const 2. NCHW ,C维向量 3. NCHW ,NCHW 当为5维向量时,满足 1. NCDHW ,const 2. NCDHW ,NCDHW |
Flatten | |
InnerProduct | 若weight size do*di round(di/16)*round(do/16) < 512 * 1024 |
Permute | |
Pooling | 若kernel size为h*w 1.AVGPooling (1).FilterW <= 255,FilterH <= 255, (2).AvePooling_U8:FilterMax(FilterW*FilterH) = 12288, (3).AvePooling_S16:FilterMax(FilterW*FilterH) = 12288 2.MaxPooling: 需FilterW <= 255,且FilterMax(FilterW*FilterH) = 6029312 |
PriorBox | |
Power | 仅支持指数为正整数 |
Reshape | |
Reverse | |
ROIPooling | ROIPooling的rois输入维度为(N×5),当后段网络全部是InnerProduct时,N才可以设置大于1,如果后段网络中有卷积时,N仅可以设置为1,第二段网络需要循环执行N次。使用方法和限制详见下方Please Note。 |
ReLU | 输入<=4维 |
PRuLU | 输入<=4维 |
Sigmoid | |
Slice | |
Scale | 对于输入的两个tensor,shape满足下面条件 1. 4维向量,NCHW 2. NCHW ,const 3. NCHW ,C维向量 4. NCHW ,NCHW 当为5维向量时,满足 1. NCDHW ,const 2. NCDHW ,NCDHW |
Softmax | 如需对指定维度进行运算,将要计算的维度转置到最后的维度(最内维度),最大支持32*512=16384 |
Splite | |
ShuffleChannel | |
Tanh | 输入<=4维 |
Threshold | 只支持4维输入 |
Tile | |
Upsample | Upsample算子在caffe中没有,可以手动将Deconvolution修改成Upsample 只支持4维输入 Only support same scale on H and W |
Reorg | 只支持stride = 2 |
LSTM | 支持单向,双向 |
Please Note:
-
Upsample算子在prototxt中这样描述:
scale参数与Deconvolution的Stride含义相同。但需注意Upsample相当于权重全为1的Deconvolution算子。layer { bottom: "layer85-conv" top: "layer86-upsample" name: "layer86-upsample" type: "Upsample" upsample_param { scale: 2 } }
-
ROIPooling算子在prototxt中这样描述:
Roi_pooling_param仅支持pooled_w,pooled_h和spatial_scale。Float模型的rois输入为rpn层输出的坐标,Fixed和Offline模型的rois输入为rpn层输出坐标乘spatial_scale值后再量化到int16后送入模型。layer { name: "roi_pool5" type: "ROIPooling" bottom: "conv5_3" bottom: "rois" top: "pool5" roi_pooling_param { pooled_w: 7 pooled_h: 7 spatial_scale: 0.0625 } }
2. TensorFlow支持算子¶
算子 | 备注 |
---|---|
Convolution | 限制条件:Kernel_size:H * W < 64 |
DepthwiseConv2dNative | 原生支持Kernel_size为3*3,6*6,9*9,其余情况转换成Convolution处理 |
FullyConnected | |
Max pooling | |
Average Pooling | |
ReLU | |
PReLU | |
ReLU6 | |
LeakyReLU | |
Sigmoid | |
Less | |
Log | |
Greater | |
GreaterEqual | |
Equal | |
Add | |
Sub | |
Mul | |
RealDiv | 仅支持第二个操作数为常量Tensor |
FloorDiv | 仅支持第二个操作数为常量Tensor |
Maximum | |
Minimum | |
Mean | |
Max | |
Sqrt | |
Sin | |
Cos | |
Rsqrt | |
Round | |
Softmax | 如需对指定维度进行运算,将要计算的维度转置到最后的维度(最内维度) |
FusedBatchNorm | |
Exp | |
Align | |
ConcatV2 | |
Fill | |
Gather | 仅支持第二个操作数indices为常量Tensor |
GatherV2 | |
Pack | |
Pad | |
SpaceToBatchND | |
BatchToSpaceND | |
Zeroslike | |
Split | |
Slice | |
Unpack | |
Tile | |
Reshape | |
Transpose | |
Resize_bilinear | |
Resize_NearestNeighbor | |
Batch_matmul | |
TopKV2 | |
Tanh | |
Concatenation | |
Argmax | |
Logistic | |
TransposeConv | |
Square | |
StrideSlice | |
Abs | |
Sum | |
Cast |
3. Onnx支持算子¶
算子 | 备注 |
---|---|
Abs | 无限制 |
Add | 无限制 |
And | 无限制 |
ArgMax | axis:无限制 keepdims:无限制 select_last_index:只能被设置为0 |
ArgMin | axis:无限制 keepdims:无限制 select_last_index:只能被设置为0 |
Atan | 无限制 |
AveragePool | auto_pad:支持,SAME_UPPER, SAME_LOWER or VALID ceil_mode:支持 kernel_shape: 若kernel_shape为h*w,需满足FilterW <= 255,FilterH <= 255 pads:支持两个维度,都是[0,255] strides:支持两个维度,都是[0,255] count_include_pad:无限制 dilation:只支持为1 |
BatchNormalization | epsilon: 无限制 momentum: 不支持 training_mode: 不支持 is_test:不支持 spatial:不支持 |
Cast | to: 支持float32/float64/int64/int32/bool saturate:不支持 |
Ceil | 无限制 |
Clip | 无限制 |
Concat | 最大支持10000个tensor concat |
Constant | 无限制 |
ConstantOfShape | 无限制 |
Conv | conv1d: All tensor size < 2^31 auto_pad: 支持,SAME_UPPER, SAME_LOWER or VALID dilations:支持,两个维度,都是[0, 31] group:小于等于C kernel_shape:支持,h * w < 64 pads:支持,四个维度,都是[0,15] strides:支持,两个维度,都是[0, 31] conv2d: All tensor size < 2^31 auto_pad: 支持,SAME_UPPER, SAME_LOWER or VALID dilations:支持,两个维度,都是[0, 31] group:小于等于C kernel_shape:支持,h * w < 64 pads:支持,四个维度,都是[0,15] strides:支持,两个维度,都是[0, 31] conv3d: All tensor size < 2^31 auto_pad: 支持,SAME_UPPER, SAME_LOWER or VALID dilations:支持,两个维度,都是[0, 31] group:不支持 kernel_shape:支持,h * w < 255,d维无限制 pads:支持h,w,d三个维度六个方向,都是[0, 15] strides:支持h,w两个维度,都是[0, 31],d维只支持1 |
ConvTranspose | All tensor size < 2^31 auto_pad: 支持,SAME_UPPER, SAME_LOWER or VALID dilations:只支持为 1 group:只支持1或者C kernel_shape:支持,h * w < 255 output_padding:支持 output_shape:不支持 pads:支持,四个维度,都是[0,15], 每个维度pad值需相等 strides:支持,两个维度,都是[0, 31] |
Cos | 无限制 |
CumSum | exclusive:只支持设置为0 reverse:只支持设置为0 |
DepthToSpace | blocksize:支持,各个维度可以整除blocksize mode:DCR or CRD |
Div | 无限制 |
Dropout | is_test:不支持 ratio:不支持 seed:不支持 |
Einsum | equation:无限制 支持单双操作数,不支持省略维度格式的表达式 |
Elu | 无限制 |
Equal | 无限制 |
Erf | 无限制 |
Exp | 无限制 |
Expand | 仅支持第一个输入是variable tensor 无限制 |
Flatten | 无限制 |
Floor | 无限制 |
GRU | activation_alpha:不支持 activation_beta:不支持 activations:只支持sigmoid/tanh clip:不支持 direction:支持forward和bidirectional layout:只支持为0 linear_before_offset:支持0和1 输入中sequence_lens只支持为空tensor,不支持variable |
Gather | axis:无限制 indices输入支持const和 variable |
GatherElements | axis:无限制 indices输入只支持const |
GatherND | 无限制 |
Gelu | approximate:支持None和tanh |
Gemm | alpha:无限制 beta:无限制 transA:无限制 transB:无限制 |
GlobalAveragePool | kernel_shape: 若kernel_shape为h*w,需满足FilterW <= 255,FilterH <= 255 pads:支持两个维度,都是[0,255] strides:支持两个维度,都是[0,255] |
GlobalMaxPool | kernel_shape: 若kernel_shape为h*w,需满足FilterW <= 255,FilterH <= 255 pads:支持两个维度,都是[0,255] strides:支持两个维度,都是[0,255] |
Greater | 无限制 |
GreaterOrEqual | 无限制 |
HardSigmoid | alpha:无限制 beta:无限制 |
HardSwish | 无限制 |
Identity | 此算子在转换过程中会被移除掉 |
InstanceNormalization | epsilon:无限制 |
LSTM | activation_alpha:不支持 activation_beta:不支持 activations:只支持sigmoid/tanh clip:不支持 direction:只支持forward和bidirectional input_forget:只支持为0 layout:只支持为0 输入中sequence_lens只支持为空tensor,不支持variable |
LayerNormal | axis:不支持0 epsilon:无限制 stash_type:不支持 |
LayerNormalization | axis:不支持0 epsilon:无限制 stash_type:不支持 |
LeakyRelu | alpha:无限制 输入<=4维 |
Less | 无限制 |
LessOrEqual | 无限制 |
Log | 无限制 |
LogSoftmax | 无限制 |
MatMul | 无限制 |
Max | 无限制 |
MaxPool | auto_pad:支持,SAME_UPPER, SAME_LOWER or VALID ceil_mode:支持 kernel_shape:支持 pads:支持 strides:支持 storage_order:不支持 若kernel size为h*w,需满足 FilterW <= 255,FilterH <= 255 |
MeanVarianceNormalization | 输入只支持四维 axes:无限制 |
Min | 无限制 |
Mod | 无限制 fmod只能为0 |
Mul | 无限制 |
Neg | 无限制 |
Not | 无限制 |
Or | 无限制 |
PRelu | 无限制 |
Pad | mode:支持constant/reflect value:无限制 不支持axes作为输入 |
Pow | 无限制 |
RNN | activation_alpha:不支持 activation_beta:不支持 activations:只支持tanh clip:不支持 direction:只支持forward和bidirectional layout:只支持为0 输入中sequence_lens只支持为空tensor,不支持variable |
Range | 无限制 |
Reciprocal | 无限制 |
ReduceL2 | axes:无限制 keepdims:无限制 noop_with_empty_axes:只支持为0 |
ReduceMax | axes:无限制 keepdims:无限制 noop_with_empty_axes:只支持为0 |
ReduceMean | axes:无限制 keepdims:无限制 noop_with_empty_axes:只支持为0 |
ReduceMin | axes:无限制 keepdims:无限制 noop_with_empty_axes:只支持为0 |
ReduceSum | axes:无限制 keepdims:无限制 noop_with_empty_axes:只支持为0 |
Relu | 无限制 |
Reshape | 仅第一个输入支持variable tensor allowzero:只支持为0,不支持output shape里面有0值 |
Resize | 只支持对hw做resize antialias:只支持为0 axes:无限制 coordinate_transformation_mode:支持align_corners/asymmetric/half_pixel/pytorch_half_pixel mode:支持nearest或者linear cubic_coeff_a:不支持 exclude_outside:只支持为0 extrapolation_value:不支持 keep_aspect_ratio_policy:不支持 nearest_mode:支持,[round_prefer_floor,floor,round_prefer_ceil] |
Round | 无限制 |
Scatter | 无限制 |
ScatterElements | indices支持是const tensor和variable tensor axis:无限制 reduction:只支持为None |
ScatterND | indices支持是const tensor和variable tensor reduction:只支持为None |
Shape | end:无限制 start:无限制 |
Sigmoid | 无限制 |
Sign | 无限制 |
Sin | 无限制 |
Slice | 仅第一个输入支持是variable tensor axes:无限制 ends:无限制 starts:无限制 |
Softmax | 无限制 |
Softplus | 无限制 |
SpaceToDepth | blocksize:无限制 |
Split | axis:无限制 split:1和Q版本最大支持256,其余版本最大支持10000 num_outputs:支持 |
Sqrt | 无限制 |
Squeeze | axes:无限制 |
Sub | 无限制 |
Sum | 只支持两个输入 |
Tanh | 无限制 |
Tile | 无限制 |
TopK | axis:无限制 largest:只支持为1 sorted:只支持为1 k:无限制 |
Transpose | 仅第一个输入支持是variable tensor perm:无限制 |
Unsqueeze | 无限制 |
Upsample | 只支持在HW维度上做Upsample,并且scale要相同 mode:支持nearest和linear height_scale:无限制 width_scale:无限制 scales:无限制 |
Where | 无限制 |
4. SGS_CHALK支持算子¶
SGS_CHALK各算子具体使用方法请参考: sgs_chalk模块API
算子 | 备注 |
---|---|
Abs | |
Add | |
Alpha_Blending | |
ArgMin | |
Argmax | |
Atan | |
Atan2 | |
AveragePool2d | |
AveragePool3d | |
BatchMatMul | |
BatchToSpaceND | |
BoxDecoder | |
BoxDecoder2 | |
Cast | |
Ceil | |
Clip | |
Concatenation | |
CondGreat | |
CondLess | |
Conv2d | |
Conv3d | |
Conv3dImageConcat | |
Cos | |
Cumsum | |
CustomNotEqual | |
CustomPow | |
CustomizedMaxpool2d | |
DepthWiseConv2d | |
Dilation | |
Div | |
Elu | |
Equal | |
Erf | |
Exp | |
Expand_dims | |
Fill | |
Floor | |
Fullyconnected | |
GRU | |
Gather | |
GatherElements | |
GatherND | |
Gelu | |
Greater | |
GreaterEqual | |
GroupConv2d | |
HardSwish | |
Input | |
Instancenorm | |
L2Norm | |
LSTM | |
LSTM_caffe | |
Layernorm | |
LeakyRelu | |
Less | |
LessEqual | |
Log | |
LogicalAnd | |
LogicalNot | |
LogicalOr | |
Logistic | |
MaxPool2d | |
MaxPool3d | |
Maximum | |
Mean | |
MeanVarianceNorm | |
Minimum | |
MirrorPad | |
Mod | |
Mul | |
MultiplyAdd | |
Negative | |
NotEqual | |
Pack | |
Pad | |
PhaseModify | |
PostProcess_Max | |
PostProcess_Unpack | |
Prelu | |
RNN | |
RSqrt | |
Range | |
Reciprocal | |
ReduceMax | |
ReduceMin | |
Relu | |
Relu1 | |
Relu6 | |
Relu_N1_TO_1 | |
Reshape | |
ResizeBilinear | |
ResizeNearestNeighbor | |
RootSumSquares2 | |
Round | |
ScatterElements | |
ScatterND | |
Score_Filter | |
Select | |
Shape | |
Sign | |
Silu | |
Sin | |
Slice | |
Softmax | |
Softplus | |
SpaceToBatchND | |
Split | |
Split_V | |
Sqrt | |
Square | |
Squeeze | |
StridedSlice | |
Sub | |
Sum | |
TFLite_Detection_NMS | |
Tanh | |
Tile | |
TopK | |
Transpose | |
TransposeConv2d | |
Unpack | |
WiggleErr |
5. IPU Toolchain对模型的限制¶
对于指定维度的Softmax,我们只支持对最内维度的操作(多余多维Tensor的Softmax运算,我们只支持Softmax制定在最内维度做)。
除第一层Conv外,其他层的Conv DI维度(即NHWC 中C这个维度)越大效率会越高,最大支援2048。
Math类算子(包括Add、Sub、Mul、Div等元素操作的算子),如果右操作数是scaler(单个数字) 或者 1 维向量(HW维度数据相同,C维度不同),效率会更高。
网络结构中尽量减少一个算子的输出被多个算子作为输入的情况,如ResNet的残差结构,GoogLeNet的Inception模块等。可参考构建BW友好型模型
6. 模型性能优化规则¶
(1)对于卷积的性能优化
kernel size 3x3 最好,特别对于首层。
kernel size 1x1 的时候,input tensor 最内维度shape值对齐到16 最好。
(2)对于DMA算子
concatenation算子比pack算子性能更好。
split比slice算子性能更好。
尽量减少在最内维上做transpose。
单口elementwise 算子的const 操作数最好是右操作数,即input[1]。
(3)综合部分
Tensor的维度为4最好。
Tensor最内维的shape值对齐到32最好。
Softmax最好只对最内维度操作。
ReduceMax、ReduceMin、ReduceSum最好坍塌的纬度是相邻的。
(4)构建BW友好的AI模型
BW友好的AI模型指模型数据尽可能不占用系统总线BW资源,BW计算公式如下:
BW = Input BW + Output BW + Const BW + Variable BW
其中,可以通过减少variable bw来提升模型性能,variable bw将受以下两点影响:
(1) tensor数据量太大
(2) tensor的生命周期太长
示例一:BW友好型
示例二:tensor的生命周期太长
示例三:tensor数据量太大
上图展示了三种常见的模型结构图,其中图一所示的结构符合模型优化规则,图二、图三所示的结构将影响模型性能。构建模型时请尽可能减少图二、图三结构的使用。