Skip to content

阅前须知Ⅰ. IPU SDK 支持

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中这样描述:

    layer {
        bottom: "layer85-conv"
        top: "layer86-upsample"
        name: "layer86-upsample"
        type: "Upsample"
        upsample_param {
            scale: 2
        }
    }
    
    scale参数与Deconvolution的Stride含义相同。但需注意Upsample相当于权重全为1的Deconvolution算子。

  • ROIPooling算子在prototxt中这样描述:

    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
        }
    }
    
    Roi_pooling_param仅支持pooled_w,pooled_h和spatial_scale。Float模型的rois输入为rpn层输出的坐标,Fixed和Offline模型的rois输入为rpn层输出坐标乘spatial_scale值后再量化到int16后送入模型。

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:仅支持0
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:不支持
Clip 无限制
Concat 1和Q版本最大支持256个tensor concat,其余版本最大支持10000
Constant value:支持,其余属性不支持
Conv conv1d:
All tensor size < 2^31
auto_pad: 支持,SAME_UPPER, SAME_LOWER or VALID
dilations:无限制
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:无限制
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:无限制
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 alpha:无限制
Equal 无限制
Erf 无限制
Exp 无限制
Expand 无限制
Flatten axis:无限制
Floor 无限制
GRU activation_alpha:不支持
activation_beta:不支持
activations:只支持sigmoid/tanh
clip:不支持
direction:支持forward和bidirectional
layout:只支持为0
linear_before_offset:支持0和1
Gather axis:无限制<br
s6不知第二个输入是variable tensor
GatherElements axis:无限制
Gelu approximate:只支持为None
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:无限制
Identity 此算子在转换过程中会被移除掉
InstanceNormalization epsilon:无限制
LSTM activation_alpha:不支持
activation_beta:不支持
activations:只支持sigmoid/tanh
clip:不支持
direction:只支持forward和bidirectional
input_forget:只支持为0
layout:只支持为0
LayerNormal axis:不支持0
epsilon:无限制
stash_type:不支持
LayerNormalization axis:不支持0
epsilon:无限制
stash_type:不支持
LeakyRelu alpha:无限制
输入<=4维
Less 无限制
Log 无限制
LogSoftmax 无限制
MatMul 无限制
Max 无限制
MaxPool auto_pad:支持,SAME_UPPER, SAME_LOWER or VALID
ceil_mode:仅支持0
kernel_shape:支持
pads:支持
strides:支持
storage_order:不支持
若kernel size为h*w,需满足
FilterW <= 255,FilterH <= 255
MeanVarianceNormalization 输入只支持四维
axes:无限制
Min 无限制
Mul 无限制
Neg 无限制
Not 无限制
PRelu 无限制
Pad mode:支持constant/reflect
value:无限制
不支持axes作为输入
Pow 无限制
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 allowzero:只支持为0,不支持output shape里面有0值
Resize 只支持对hw做resize
antialias:只支持为0
axes:无限制
coordinate_transformation_mode:支持align_corners/asymmetric/half_pixel/pytorch_half_pixel,SDK版本S6和S2不支持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 无限制
ScatterElements reduction:只支持为None
axis:无限制
ScatterND reduction:只支持为None
Shape end:无限制
start:无限制
Sigmoid 无限制
Sin 无限制
Slice axes:无限制
ends:无限制
starts:无限制
Softmax axis:无限制
Softplus 无限制
SpaceToDepth blocksize:无限制
Split axis:无限制
split:1和Q版本最大支持256,其余版本最大支持10000
num_outputs:不支持
Sqrt 无限制
Squeeze axes:无限制
Sub 无限制
Sum 只支持两个输入
Tanh 无限制
Tile 无限制
TopK axis:无限制
largest:只支持为1
sorted:无限制
k:无限制
Transpose perm:无限制
Unsqueeze 无限制
Upsample 只支持在HW维度上做Upsample,并且scale要相同
mode:支持nearest和linear
height_scale:无限制
width_scale:无限制
scales:无限制
Where 无限制

4. SigmaStar IPU SDK对模型的限制

  • 对于指定维度的Softmax,我们只支持对最内维度的操作(多余多维Tensor的Softmax运算,我们只支持Softmax制定在最内维度做)。

  • 除第一层Conv外,其他层的Conv DI维度(即NHWC 中C这个维度)越大效率会越高,最大支援2048。

  • Math类算子(包括Add、Sub、Mul、Div等元素操作的算子),如果右操作数是scaler(单个数字) 或者 1 维向量(HW维度数据相同,C维度不同),效率会更高。

  • 网络结构中尽量减少一个算子的输出被多个算子作为输入的情况,如ResNet的残差结构,GoogLeNet的Inception模块等。可参考构建BW友好型模型

5. 模型性能优化规则

(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)模型结构优化

  • case1: Pad + Conv2D/DepthwiseConv

  • ——conv或DepthwiseConv前的pad会被合并到卷积中,pad几乎不占用时间。

示例:

友好型示例

  • case2: Conv2D/DepthwiseConv + 单口elt

  • ——conv后的单口elt会被合并,目前支持单口mul,单口add,单口div(会被转换成单口mul),且如果elt连续,则会被一起合并(见示例一和示例二),双口的elt则不会被合并(见示例三)。

示例一:

友好型示例

示例二:

友好型示例

示例三:

友好型示例

  • case3: Conv2D/DepthwiseConv + BatchNorm

  • ——Mul和Add算子会和卷积一起运算。我们会把BatchNorm转换成Mul+Add, 所以可以合并。

  • case4: Pad + avgPooling

  • ——pool前的pad会被合并,但是pool后的pad不会被合并 (globalpool会被转成对应的avg或max, 故也会与pad合并)

示例:

友好型示例

  • case5: 连续的transpose会自动合并为一个。

示例:

友好型示例

  • case6: 连续的单口的相同elementwise算子会合并。

  • ——elt的type需相同,输入可以不同

示例:

友好型示例

  • case7: 单独的单口mul和单口add,会变成MultAdd单一的算子。

  • ——输入最内维需相等。

示例:

友好型示例

注意:这里单口意思为一个数据是constant的情况

  • case8: 模型中间的conv + 单口elt + relu

  • ——只有模型中间层的结构会被合并,若连接了模型输出则不会被合并(但会进行内存优化,详见内存优化部分的说明)。

示例:

友好型示例

  • case9: 模型中间的conv + batchnorm + relu

  • 参考case8。

示例:

友好型示例

  • case10: 模型中间的conv + relu

  • 参考case8。

示例:

友好型示例

(5)模型内存优化

  • case1: Conv2D/DepthwiseConv2d + elementwise

  • ——conv后的elt会被融合,融合指tensor共享一块memory,目前支持mul(单口、双口),add(单口、双口), div(单口,不支持双口),且环形elt也会参与融合

示例一:

友好型示例

示例二:

友好型示例

  • case2: Conv2D/DepthwiseConv2d + relu

  • ——conv后的relu会被融合

示例:

友好型示例

  • case3: 结构优化结合内存优化

  • ——如conv后的elt会被结构优化,而conv后的relu会被内存优化,见示例。

示例:

友好型示例

(6)构建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数据量太大

不友好型示例二

上图展示了三种常见的模型结构图,其中图一所示的结构符合模型优化规则,图二、图三所示的结构将影响模型性能。构建模型时请尽可能减少图二、图三结构的使用。