S100/S100P ONNX算子BPU约束列表

下方表格中:

lhs:left-hand side,指运算中的左操作数。

rhs:right-hand side,指运算中的右操作数。

注解
  1. DeformConv算子本身存在一定特殊性, 我们通过特定的自定义算子的方法实现了对 torchvision::deformconv 的直接支持, 如有需要请联系地平线技术支持人员获取相关说明。
  2. GroupNormalization算子在从Pytorch框架导出到ONNX时, 会被框架自动拆分成多个子算子到原始ONNX模型中, 我们支持对这些子算子的BPU计算,从而实现了对GroupNormalization算子的支持。
ONNX Operator NameBPU Support Constraints
Absif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
otherwise:
input:
Type: int8, int16, float16
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Acosif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Acoshif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Addlhs:
Type: int8, int16, int32, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
others:
When inputs are of integer or quantized type, if the result overflows, it will saturate to the maximum or minimum value of the result data type.
Andlhs:
Type: int8, int16, bool8, float16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]
ArgMaxinput:
Type: int8, int16, int32, float16, float32
Shape: [*]
Dim: if type is int8, int16 or float16, reduce axis dim size ∈ [1, 32767]
Element : if type is int8 or int16, reduce Elements size ∈ [1, 65535]
dims:
If type is int32, float16, float32, only support one dim.
output:
Type: int8, int16, int32
Shape: reduce dim will be 1 or fused depend on keepDims
ArgMininput:
Type: int8, int16, int32, float16, float32
Shape: [*]
Dim: if type is int8, int16 or float16, reduce axis dim size ∈ [1, 32767]
Element : if type is int8 or int16, reduce Elements size ∈ [1, 65535]
dims:
If type is int32, float16, float32, only support one dim.
output:
Type: int8, int16, int32
Shape: reduce dim will be 1 or fused depend on keepDims
Asinif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Asinhif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Atanif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Atanhif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
AveragePoolinput:
Type: int8, int16
Shape: [*,H,W,C] or [*,L,C]
output:
The input and output types need to be the same.
kernel:
Shape: [KL] or [KH,KW], only support 1d or 2d now
Dim: 1d: KL ∈ [1, 256], KL*bitWidth/8 <= 24576; 2d: KH, KW ∈ [1, 256], KH*KW*bitWidth/8 <= 24576
stride:
Shape: [SH,SW] or [SL]
Dim: SH, SW, SL ∈ [1, 256]
pad:
Shape: [PH_BEGIN,PW_BEGIN,PH_END,PW_END] or [PL_BEGIN,PL_END]
PH_BEGIN,PW_BEGIN,PL_BEGIN,PH_END,PW_END,PL_END ∈ [-255, 256]
dilation:
Shape: 1d: [DW]; 2d: [DH, DW]
Dim: 1d: DW ∈ {1}; 2d: DH, DW ∈ {1}
BatchNormalizationN/A, collapsed in graph optimization phase
BitwiseAndlhs:
Type: int8, int16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
BitwiseNotinput:
Type: int8, int16
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
BitwiseOrlhs:
Type: int8, int16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
BitwiseXorlhs:
Type: int8, int16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Castinput:
Type: int8, int16, int32, float16, float32, bool8
Shape: [*]
output:
Type: int8, int16, int32, float16, float32, bool8. Not support combinations (float16,float32→bool8).
Shape: [*]
Ceilif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
otherwise:
input:
Type: int8, int16, float16
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Celuif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Clipif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
otherwise:
input:
Type: int8, int16, float16
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Concatinput:
Type: No limits
Arg Number: input number ∈ [1, 1024]
Dim: all dims < 131072
Size: size < 2G
output:
The input and output types need to be the same.
Dim: all dims < 131072
Size: size < 2G
ConstantN/A, collapsed in graph optimization phase
ConstantOfShapeN/A, collapsed in graph optimization phase
Convinput:
--conv 1d--
Type: int8, int16
Shape: [*,L,C]
Dim: * ∈ [1, 4096]; L,C ∈ [1, 65536]
--conv 2d--
Type: int8, int16
Shape: [*,H,W,C]
Dim: * ∈ [1, 4096]; H,W,C ∈ [1, 65536]
--conv 3d--
Type: int8
Shape: [*,D,H,W,C]
Dim: * ∈ [1, 128]; D,H,W ∈ [1, 65536]; C ∈ [1, 4096];
weight:
--conv 1d--
Type: int8, int16
Shape: [N,KL,C]
Dim: C ∈ [1, 8192]; KL ∈ [1, 31]; N ∈ [1, 65536] if fout is the last layer of conv else [1, 8192]
Size: KL × C ∈ [1, 65535]
--conv 2d--
Type: int8, int16
Shape: [N,KH,KW,C]
Dim: C ∈ [1, 8192]; KH,KW ∈ [1, 31]; N ∈ [1, 65536] if fout is the last layer of conv else [1, 8192]
Size: KH × KW × C ∈ [1, 65535]
--conv 3d--
Type: int8
Shape: [N,KD,KH,KW,C]
N ∈ [1, 65535]; KD,KH,KW ∈ [1, 9]; Dim: C ∈ [1, 4096];
Size: KD × KH × KW × C ∈ [1, 131072]
bias:
Type: float32
output:
--conv 1d--
Type: int8, int16, int32
Shape: [*,L,C]
Dim: * ∈ [1, 4096]; L,C ∈ [1, 65536]
--conv 2d--
Type: int8, int16, int32
Shape: [*,H,W,C]
Dim: * ∈ [1, 4096]; H,W,C ∈ [1, 65536]
--conv 3d--
Type: int8, int16, int32
Shape: [*,D,H,W,C]
Dim: * ∈ [1, 128]; D,H,W ∈ [1, 65536]; C ∈ [1, 4096];
stride:
--conv 1d--
Shape: [SL]
Dim: SL ∈ [1, 256]; SL ∈ {1} if dilation > 1
--conv 2d--
Shape: [SH,SW]
Dim: SH,SW ∈ [1, 256]; SH,SW ∈ {1} if dilation > 1
--conv 3d--
Shape: [SD,SH,SW]
Dim: SD,SH,SW must be 1 or 2 and equal to each other.
pad:
--conv 1d--
Shape: [P_left,P_right]
Dim: P_left,P_right ∈ (-L, 256]
--conv 2d--
Shape: [P_top,P_left,P_bottom,P_right]
Dim: P_top,P_bottom ∈ (-H, 256], P_left,P_right ∈ (-W, 256]
--conv 3d--
Shape: [P_front, P_top, P_left, P_back, P_bottom, P_right]
Dim: P_front,P_back ∈ [0, KD/2], P_top,P_bottom ∈ [0, KH/2], P_left,P_right ∈ [0, KW/2]
groupNum:
Fin.c is divisible by group number, conv 3d only support 1
dilation:
--conv 1d--
Shape: [DL]
Dim: DL ∈ [1, 18]
--conv 2d--
Shape: [DH,DW]
Dim: DH,DW ∈ [1, 18]
--conv 3d--
Shape: [DD,DH,DW]
DD,DH,DW = 1
others:
--conv 1d--
Stride only support odd number and 2 when conv is a int16 depthwise conv
If groupNum > 1, for each group, fin.c' ∈ [1, 65535], KL × fin.c' ∈ [1, 65535]
--conv 2d--
Stride only support odd number and 2 when conv is a int16 depthwise conv
If groupNum > 1, for each group, fin.c' ∈ [1, 65535], KH × KW × fin.c' ∈ [1, 65535]
Fin.c' = fin.c × min(lcm(fout.c × (lcm(fin.c, 4) / fin.c), 8) / fout.c, groupNum)
ConvTransposeinput:
--convtranspose 1d/2d--
Type: int8, int16; input and weight cannot both be int16
1d_Shape: [*,W,C]
1d_Dim: * ∈ [1, 128]; W ∈ [1, 65536]; C ∈ [1, 2048]
2d_Shape: [*,H,W,C]
2d_Dim: * ∈ [1, 128]; H,W ∈ [1, 65536]; C ∈ [1, 2048]
--convtranspose 3d--
Type: int8
3d_Shape: [*,D,H,W,C]
3d_Dim: * ∈ [1, 128]; D,H,W ∈ [1, 65536]; C ∈ [1, 2048]
weight:
--convtranspose 1d/2d--
Type: int8, int16; input and weight cannot both be int16
1d_Shape: [N,KW,C]
1d_Dim: N,C ∈ [1, 2048]; KW ∈ [1, 14]
1d_Size: KW × C ∈ [1, 65535]
2d_Shape: [N,KH,KW,C]
2d_Dim: N,C ∈ [1, 2048]; KH,KW ∈ [1, 14]; KH,KW cannot both be 1
2d_Size: KH × KW × C ∈ [1, 65535]
--convtranspose 3d--
Type: int8
3d_Shape: [N,KD,KH,KW,C]
3d_Dim: N,C ∈ [1, 2048]; KD,KH,KW ∈ [1, 14]; KD,KH,KW cannot all be 1
3d_Size: KD × KH × KW × C ∈ [1, 131072]
bias:
Type: float32
output:
Type: int8, int16, int32
stride:
1d_Shape: [SW]
1d_Dim: SW ∈ [1, 14];
2d_Shape: [SH,SW]
2d_Dim: SH,SW ∈ [1, 14];
3d_Shape: [SD,SH,SW]
3d_Dim: SD,SH,SW ∈ [1, 14];
pad:
1d_Shape: [P_left,P_bottom]
1d_Dim: P_left,P_bottom ∈ [0, 256]
2d_Shape: [P_top,P_left,P_bottom,P_right]
2d_Dim: P_top,P_left,P_bottom,P_right ∈ [0, 256]
3d_Shape: [P_front,P_top,P_left,P_back,P_bottom,P_right]
3d_Dim: P_front,P_top,P_left,P_back,P_bottom,P_right ∈ [0, 256]
groupNum:
Fin.c is divisible by group number, conv 3d only support 1
dilation:
1d_Shape: [DW]
1d_Dim: DW ∈ {1}
2d_Shape: [DH,DW]
2d_Dim: DH,DW ∈ {1}
3d_Shape: [DD,DH,DW]
3d_Dim: DD,DH,DW ∈ {1}
Cosif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Coshif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
CumSuminput:
Type: int8, int16, float16, float32
Shape: [*, dim[axis], *]
Dim: * ∈ [1, 65536]; dim[axis] ∈ [1, 8192]
output:
Type: int8, int16, int32, float16, float32. only support combinations (int8→int8,int16,int32), (int16→int16,int32), (float16→float16), (float32→float32)
The Shape and Dim is same as input
exclusive:
If type is float16, float32, only support exclusive == 0, otherwise, exclusive is 0 or 1
reverse:
If type is float16, float32, only support reverse == 0, otherwise, exclusive is 0 or 1
DeformConvinput:
Type: int8
Shape: [*,H,W,C]
Dim: H,W ∈ [1, 1024]; H × W ≤ 720 × 1024; other dims ∈ [1, 65536]
offset:
Type: int16
Shape: [*,OH,OW,2 × offsetGroupNum × KH × KW]
Size: 2 × offsetGroupNum × KH × KW ∈ [2, 256], OH × KH × OW × KW ≤ 720 × 1024
mask:
Type: int8
Shape: [*,OH,OW,offsetGroupNum × KH × KW]
Size: offsetGroupNum × KH × KW ∈ [1, 128]
The value of mask is usually [0, 1]
weight:
Type: int8
Shape: [N,KH,KW,C]
Dim: C ∈ [1, 8192]; KH,KW ∈ [1, 8]; N ∈ [1, 4096]
Size: KH × KW × C ∈ [1, 65535]
bias:
Type: float32
output:
Type: int8, int16, int32
Other constraints: Same as fin
stride:
Shape: [SH,SW]
Dim: SH,SW ∈ [1]
pad:
Shape: [P_top,P_left,P_bottom,P_right]
Dim: P_top,P_bottom ∈ [-H/2, 256], P_left,P_right ∈ [-W/2, 256]
groupNum:
Fin.c is divisible by group number
offsetGroupNum:
Fin.c is divisible by offset group number
Size: offsetGroupNum ∈ [1, 2]
dilation:
Shape: [DH,DW]
Dim: DH,DW ∈ [1]
others:
For each group, fin.c ∈ [1, 8192], KH × KW × fin.c ∈ [1, 65535], fin.c = C when group = 1
DepthToSpaceinput:
Type: No limits
output:
The input and output types need to be the same.
Divlhs:
Type: quantized type support int8, int16, int32, others support int16, int32, float16, float32
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
For quantized type, support (int8,int16,int32→int8,int16,int32), others the input and output types need to be the same.
Shape: [*]
rounding_mode:
For integer, only support TRUNC, For float, only support NONE.
others:
When inputs are of integer or quantized type, if the result overflows, it will saturate to the maximum or minimum value of the result data type.
DropoutN/A, collapsed in graph optimization phase
Eluif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Equallhs:
Type: int8, int16, int32, float16, float32, bool8
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]
Erfif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Expif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Expandinput:
Type: No limits
output:
The input and output types need to be the same.
EyeLikeinput:
Type: int8, int16, int32, float16, float32, bool8
Shape: [*]
output:
Type: int8, int16, int32, float16, float32, bool8. Not support combinations (float16,float32→bool8).
Shape: [*]
Floorif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
otherwise:
input:
Type: int8, int16, float16
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
GRUinput:
Type: int8, int16
Dim: all dims < 2097152
size < 2G
output:
Type: The input and output types need to be the same.
Gatherinput:
Type: int8, int16, int32, float16, float32
Shape: [*]
Input will transpose to [N, W, C]. W is inputShape[dim], N is the product of inputShape[:dim], C is the product of inputShape[dim+1:].
N, C ∈ [1, 1048576], W ∈ [1, 4096]. If input type is int8, int16, W ∈ [1, 32768].
index:
Type: int8, int16, int32; Unsupported negative indices.
Shape: [*] index value should not be larger than 32768. And the reduce multiple of all index dims of shape should in range [1, 737280(720*1024)], because all dims
Will be reduced to W dim of indices and output. If W of fout is larger than 737280, this op will be split too many sub-ops.
output:
The input and output types need to be the same.
GatherElementsinput:
Type: int8, int16, int32, float16, float32
Shape: [*]
Input will transpose to [N, W, C]. W is inputShape[dim], N is the product of inputShape[:dim], C is the product of inputShape[dim+1:].
N, C ∈ [1, 1048576]. N × C should not be larger than 1048576
W ∈ [1, 4096]. If input type is int8, int16, W ∈ [1, 32768].
indices:
Type: int8, int16, int32; Unsupported negative indices.
Shape: [*] indices value should not be larger than 32768
Indices will transpose to [N, D, C]. D is indicesShape[dim], N is the product of indicesShape[:dim], C is the product of indicesShape[dim+1:].
N, C ∈ [1, 1048576], D ∈ [1, 737280(720*1024)].
IndicesShape[i] <= inputShape[i] for all dimensions i != dim.
output:
The input and output types need to be the same.
GatherNDinput:
Type: int8, int16, int32, float16, float32
Shape: [*]
If gather1d, W = inputShape[batchDim], W ∈ [1, 4096]. If input type is int8, int16 W ∈ [1, 32768]
If gather2d, H = inputShape[batchDim], W = inputShape[batchDim+1], H, W ∈ [1, 4096]. If input type is int8, int16, H, W ∈ [1, 32768]. H and W cannot both be greater than 4096 at the same time.
B is product of inputShape[0: batchDim], B ∈ [1, 1048576].
C is product of inputShape[batchDim+D:], C ∈ [1, 1048576].
indices:
Type: int8, int16, int32; Unsupported negative indices.
Shape: [*, D] indices value should not be larger than 32768. D ∈ [1, 2].
Size: I is product of indicesShape[batchDim: batchDim+D], I ∈ [1, 737280].
output:
Shape: [*]
The input and output types need to be the same.
batchDim:
The number of batch dimensions. The gather of indexing starts from dimension of input[batchDim:]
Geluif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Gemmlhs:
Type: int8, int16
Shape: [M,K]
Dim: M,K ∈ [1, 8192]
rhl:
Type: int8, int16
Shape: [K,N]
Dim: K ∈ [1, 8192], N ∈ [1, 1048576]
output:
Type: int8, int16, int32
Shape: [M,N]
Other constraints: Same as lhs and rhs
GlobalAveragePoolinput:
Type: int8, int16 float16, float32
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: int8, int16, float16, float32. only support combinations (int8→int8,int16), (int16→int16), (float16→float16), (float32→float32)
Shape: reduce dim will be 1 or fused depend on keepDim
dims:
If type is float16 or float32, only support one dim.
GlobalMaxPoolinput:
Type: int8, int16, int32, float16, float32
Shape: [*]
Dim: if type is int8 or int16, reduce axis dim size ∈ [1, 65535]
Element : if type is int8 or int16, reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
Shape: reduce dim will be 1 or fused depend on keepDim
Greaterlhs:
Type: int8, int16, int32, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]
GreaterOrEquallhs:
Type: int8, int16, int32, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]
GridSampleinput:
Type: int8
Shape: [*,H,W,C]
Dim: H ∈ [1, 32768], W ∈ [1, 32768], other dims ∈ [1, 65536].
NOTE: H and W cannot both be greater than 4096 at the same time.
grid:
Type: int16
Shape: [*,H,W,2]
output:
Same as input except Dim constraints
mode:
Only support bilinear and nearest
padding_mode:
Only support zeros and border
GroupNormalizationinput:
Type: int8, int16
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
HardSigmoidif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
HardSwishif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
IdentityN/A, collapsed in graph optimization phase
InstanceNormalizationinput:
Type: int8, int16
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
LSTMinput:
Type: int8, int16
Dim: all dims < 2097152
size < 2G
output:
Type: The input and output types need to be the same.
LayerNormalizationinput:
Type: int8, int16
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
LeakyReluif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
otherwise:
input:
Type: int8, int16, float16
Shape: [*]
output:
Type: int8, int16, float16. only support combinations (int8→int8), (int16→int8,int16), (float16->float16)
Shape: [*]
Lesslhs:
Type: int8, int16, int32, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]
LessOrEquallhs:
Type: int8, int16, int32, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]
Logif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
LogSoftmaxinput:
Type: int8, int16
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
MatMullhs:
Type: int8, int16
Shape: [*,M,C]
Dim: * ∈ [1, 4096], M,C ∈ [1, 8192]
rhl:
Type: int8, int16
Shape: [*,C,N]
Dim: * ∈ [1, 4096]; C ∈ [1, 8192], N ∈  [1, 1048576]
output:
Type: int8, int16, int32
Shape: [*,M,N]
Other constraints: Same as lhs and rhs
Maxlhs:
Type: int8, int16, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
MaxPoolinput:
Type: int8, int16
Shape: [*,H,W,C]
output:
The input and output types need to be the same.
kernel:
Shape: [KL] or [KH,KW], only support 1d or 2d now
Dim: 1d: KL ∈ [1, 256], KL*bitWidth/8 <= 24576; 2d: KH, KW ∈ [1, 256], KH*KW*bitWidth/8 <= 24576
stride:
Shape: [SH,SW] or [SL]
Dim: SH, SW, SL ∈ [1, 256]
pad:
Shape: [PH_BEGIN,PW_BEGIN,PH_END,PW_END] or [PL_BEGIN,PL_END]
PH_BEGIN,PW_BEGIN,PL_BEGIN,PH_END,PW_END,PL_END ∈ [-255, 256]
dilation:
Shape: 1d: [DW]; 2d: [DH, DW]
Dim: 1d: DW ∈ {1}; 2d: DH, DW ∈ {1}
Minlhs:
Type: int8, int16, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Mishif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Modlhs:
Type: int16, int32. Not support quantized type.
Shape: [*]
Value range: must be none-negative.
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
Value range: must be positive.
output:
The input and output types need to be the same.
Shape: [*]
Mullhs:
Type: int8, int16, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: int8, int16, int32, float16, float32. only support (int8,int16→int8,int16,int32), (float16→float16), (float32→float32).
Shape: [*]
others:
When inputs are of integer or quantized type, if the result overflows, it will saturate to the maximum or minimum value of the result data type.
Neginput:
Type: int8, int16, int32, float16
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Notinput:
Type: int8, int16, bool8, float16
Shape: [*]
output:
Type: bool8
Shape: [*]
Orlhs:
Type: int8, int16, bool8, float16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]
PRelulhs:
Type: int8, int16
Shape: [*]
rhs:
The type and shape is same as lhs
output:
The type and shape is same as lhs
PadN/A, collapsed in graph optimization phase
Powif exponent is an initializer with a single element 2, and the qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if exponent is an initializer with a single element 2, and the qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Reciprocalif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
otherwise:
input:
Type: int8, int16, float16, float32
Shape: [*]
output:
Type: int8, int16, float16, float32. only support combinations (int8→int8), (int16→int8,int16), (float16->float16), (float32->float32)
Shape: [*]
ReduceL2input:
Type: int8, int16
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
ReduceMaxinput:
Type: int8, int16, int32, float16, float32
Shape: [*]
Dim: if type is int8 or int16, reduce axis dim size ∈ [1, 65535]
Element : if type is int8 or int16, reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
Shape: reduce dim will be 1 or fused depend on keepDim
ReduceMeaninput:
Type: int8, int16 float16, float32
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: int8, int16, float16, float32. only support combinations (int8→int8,int16), (int16→int16), (float16→float16), (float32→float32)
Shape: reduce dim will be 1 or fused depend on keepDim
dims:
If type is float16 or float32, only support one dim.
ReduceMininput:
Type: int8, int16, int32, float16, float32
Shape: [*]
Dim: if type is int8 or int16, reduce axis dim size ∈ [1, 65535]
Element : if type is int8 or int16, reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
Shape: reduce dim will be 1 or fused depend on keepDim
ReduceSuminput:
Type: int8, int16 float16, float32
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: int8, int16, float16, float32. only support combinations (int8→int8,int16), (int16→int16), (float16→float16), (float32→float32)
Shape: reduce dim will be 1 or fused depend on keepDim
dims:
If type is float16 or float32, only support one dim.
Reluinput:
Type: int8, int16, int32, float16 if type is int32, this op must be fusible to a Conv op
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Reshapeinput:
Type: No limits
output:
The input and output types need to be the same.
Resizeinput:
--case 1: int8--
Type: int8
Shape: [*,H,W,C]
--case 2: float16, int16--
Type: float16, int16(with per tensor quant info)
Shape: [*,H,W,C]
Dim: H ∈ [1, 32768], W ∈ [1, 32768], C ∈ [1, 65536], other dims ∈ [1, 16384]. H and W cannot both be greater than 4096 at the same time. KN*KH*KW*KC*bitWidth/8 <= 786432
output:
The input and output types need to be the same.
mode:
If Type is int8, support nearest and bilinear
If Type is float16 or int16, only support bilinear
padValue:
If Type is int8, when padvalue is not equal to 0 and quantized, input only supports per tensor quantization
step:
If Type is int8, the integer part of step ∈ [-256, 255]
If Type is float16 or int16, step ∈ [-8, 8]
expansionMode:
If Type is int8, support border and constant
If Type is float16 or int16, only support border
Roundif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Seluif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
ShapeN/A, collapsed in graph optimization phase
Sigmoidif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Signif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
otherwise:
input:
Type: float16
Shape: [*]
output:
The shape and type is same as input
Sinif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Sinhif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
SizeN/A, collapsed in graph optimization phase
Sliceif starts/ends/axes/steps are constant:
input:
Type: No limits
Dim: all dims < 2097152
output:
Type: The output datatype must be the same as the input
Dim: all dims < 2097152
Softmaxinput:
Type: int8, int16
Shape: [*]
Dim: reduce axis dim size ∈ [1, 65535]
Element : reduce Elements size ∈ [1, 65535]
output:
Type: The input and output types need to be the same.
Softplusif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
otherwise:
input:
Type: int8, int16
Shape: [*]
output:
Type: int8, int16. only support combinations (int8→int8), (int16→int8,int16)
Shape: [*]
SpaceToDepthinput:
Type: No limits
output:
The input and output types need to be the same.
Splitinput:
Type: No limits
Dim: all dims < 2097152
output:
The input and output types need to be the same.
The input and output constraints are the same.
Sqrtif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
otherwise:
input:
Type: int8, int16, float16, float32
Shape: [*]
output:
Type: int8, int16, float16, float32. only support combinations (int8→int8), (int16→int8,int16), (float16->float16), (float32->float32)
Shape: [*]
Sublhs:
Type: int8, int16, float16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
others:
When inputs are of integer or quantized type, if the result overflows, it will saturate to the maximum or minimum value of the result data type.
Sumlhs:
Type: int8, int16, int32, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
others:
When inputs are of integer or quantized type, if the result overflows, it will saturate to the maximum or minimum value of the result data type.
Tanif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
Tanhif qtype is int8:
input:
Type: int8, int16
table:
The table and input types need to be the same.
output:
The input and output types need to be the same.
if qtype is int16:
input:
Type: int16
range:
Type: int16
Shape: [N + 2, 4]
N: * ∈ [1, 64]
entry:
Type: int16
Shape: [N, 64]
N: * ∈ [1, 64]
output:
Type: int16
ThresholdedReluinput:
Type: int8, int16, float16
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Tileinput:
Type: No limits
output:
The input and output types need to be the same.
TopKinput:
Type: int8, int16, int32, float16, float32
output:
The type of output value is same as input, and indices is integer type.
k:
K <= 1024
others:
The combined size in bytes of the op's operands and outputs must be no more than 4.8MB.
Transposeinput:
Type: No limits
output:
The input and output types need to be the same.
Trilulhs:
Type: int8, int16, float16, float32
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: int8, int16, int32, float16, float32. only support (int8,int16→int8,int16,int32), (float16→float16), (float32→float32).
Shape: [*]
others:
When inputs are of integer or quantized type, if the result overflows, it will saturate to the maximum or minimum value of the result data type.
Wherecondition:
Type: bool8
Shape: [*]
lhs:
Type: int8, int16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
The input and output types need to be the same.
Shape: [*]
Xorlhs:
Type: int8, int16, bool8, float16
Shape: [*]
rhs:
The lhs and rhs types need to be the same.
Shape: [*]
output:
Type: bool8
Shape: [*]