模型推理库融合算子优化调研 - yuanlehome/Hackathon GitHub Wiki
目标调研其他算子库的算子融合现况
一、准备调研的仓库一览
-
OnnxRuntime:https://github.com/microsoft/onnxruntime/tree/main/onnxruntime/core/optimizer
-
AITemplate:https://github.com/facebookincubator/AITemplate/tree/main/python/aitemplate/compiler/transform
-
FastTransformer:https://github.com/NVIDIA/FasterTransformer
二、OnnxRuntime调研
ORT仓库位置
https://github.com/microsoft/onnxruntime/tree/main/onnxruntime/core/optimizer
融合算子调研
算子融合类型 | 描述 |
---|---|
attention_fusion | 把琐碎的qkv之间的运算融合成一个attention kernel |
bias_dropout_fusion | 把Add + DropOut + optional Add 这个操作融合成一个BiasDropoutFusion |
bias_gelu_fusion | 把Add + Gelu的操作融合成一个BiasGelu |
bias_softmax_fusion | 把Softmax(Input + Bias)这个操作融合 |
conv_add_fusion | 把conv和add操作进行合并 |
conv_bn_fusion | 把conv和归一化操作进行合并 |
conv_mul_fusion | 把conv和乘法操作进行合并 |
div_mul_fusion | 把1/a * b这种操作融合成b/a |
dynamic_quantize_matmul_fusion | 把动态量化和int gemm融合 |
embed_layer_norm_fusion | 融合embedding和mask处理 |
fast_gelu_fusion | 把有多子图结构的gelu用常量展开等方法合并成一个kernel |
gather_fusion | 通过使用Split代替多个Gather操作,可以减少对内存的访问次数 |
gather_slice_fusion | 把2gather + 1slice的操作融合成一个split操作 |
gelu_fusion | 把gelu算子进行融合 |
gemm_activation_fusion | 把矩阵乘和激活融合 |
gemm_sum_fusion | 把矩阵乘和加法融合 |
gemm_transpose_fusion | 把矩阵乘和专置融合 |
isinf_reducesum_fusion | Cast --> IsInf --> Cast --> ReduceSum --> Greater to IsAllFinite --> Not // IsAllFinite这个操作直接检查输入数据中是否所有值都是有限的(即没有无穷大(Inf)或非数(NaN)值)。如果所有值都是有限的,则输出为True;否则,输出为False。 |
layer_norm_fusion | 把layernorm搞成一个算子 |
matmul_activation_fusion | 矩阵乘激活融合 |
matmul_bn_fusion | 矩阵乘norm融合 |
matmul_add_fusion | 矩阵乘加法融合 |
matmul_scale_fusion | 多个矩阵乘融合 |
matmul_transpose_fusion | 矩阵乘专置融合 |
not_where_fusion | 通过融合消除掉not + where中的not |
pad_fusion | 把pad操作和后续乘法算子融合 |
quick_gelu_fusion | 把x*sigmoid(x)转换成一个kernel |
relu_clip_fusion | 把relu和clip进行融合 |
reshape_fusion | 融合DistilBert中的复杂reshape操作 |
skip_layer_norm_fusion | 融合Add + LayerNorm操作 |
Paddle中缺少的算子标号列举:
4,7,8,12,13,16,17,18,25,26,28,29
三、AITemplate调研
AITemplate仓库位置
https://github.com/facebookincubator/AITemplate/tree/main/python/aitemplate/compiler/transform
融合算子调研
算子融合类型 | 描述 |
---|---|
fuse_bmm_permute | batch矩阵乘+调换位置(021)融合 |
fuse_conv_elementwise | 卷积和elementwise算子融合 |
fuse_duplicate_fused_elementwise | 对融合好的elementwise算子,其中完全一样的elementwise算子进行再一次融合操作 |
fuse_expand_bmm | 通过利用批量矩阵乘法(bmm)的广播能力,消除了不必要的 expand 操作,从而简化了计算图并提高了计算效率。 |
fuse_group_ops | 水平融合算子 |
fuse_mm_elementwise | gemm和elementwise融合算子 (gemm + mul, gemm + act, gemm + bias) |
fuse_mm_reshape_permute | 矩阵乘 reshape 调换位置(0213)融合 |
fuse_parallel_gemms | 把多次矩阵乘融合成bmm |
fuse_permute_bmm_and_gemm | 把这样的算子进行融合[permute021 + bmm] and [permute(0, 1) + gemm] |
fuse_split | 融合split 和 group_gemm |
Paddle中缺少的算子标号列举:
1,3,7,8,9
四、FastTransformer调研
融合算子调研
ft中多是一些attention处理算子,和低精度融合算子。写的较为松散,没有pass不是很好整理。
五、oneDNN调研
oneDNN仓库位置
融合算子调研
算子融合类型 | 描述 |
---|---|
Convolution Post-ops | 卷积+add+bn+激活/二元操作 |
ConvTranspose Post-ops | 卷积转置+add+激活/二元操作 |
Interpolate Post-ops | 插值操作+激活/二元操作 |
MatMul Post-ops | 矩阵乘法+add+激活/二元操作 |
Reduction Post-ops | reduce操作+激活/二元操作 |
Unary Post-ops | 二元操作+激活/二元操作 |
Pooling Post-ops | 池化+二元操作 |
Batch Normalization Post-ops | bn+relu |
Misc Post-ops | 取倒数+乘法/重排+加法 |
Quantized Convolution Post-ops | 量化+解量化+conv+add+激活/二元操作+量化 |
Quantized ConvTranspose Post-ops | 量化+解量化+conv转置+add+激活/二元操作+量化 |
Quantized MatMul Post-ops | 量化+解量化+matmul+add+激活/二元操作+量化 |
Quantized Unary Post-ops | 解量化+激活+量化 |
Quantized Pooling Post-ops | 解量化+池化+量化/解量化+池化+add+量化 |
Misc Quantized Post-ops | 解量化+重排+量化/解量化+重排+add+量化 |
ConvolutionBackpropFilters Post-ops | conv反传+add反传 |
Misc Post-ops | ReLU反传+BN反传 |
MHA | **MatMul + [Multiply |
MLP | matmul + 激活 |
Quantized MHA | **Dequantize, Dequantize, Dequantize + MatMul + [Multiply |
Quantized MLP | 解量化+matmul+激活+量化 |
MHA Training | 多头注意力正向反向传播 |
MLP Training | MLP训练融合 |
Paddle中缺少的算子标号列举:
2,9,10-23 OneDNN里很多训练和量化的算子
六、PyTorch调研
找不到PyTorch具体融合pass的位置
七、OpenVINO调研
openvino仓库位置
融合算子调研
算子融合类型 | 描述 |
---|---|
add_fake_quantize_fusion | 量化和加法融合算子 |
batch_to_space_fusion | Reshape/Transpose -> DepthToSpace -> StridedSlice -> Reshape/Transpose融合 |
broadcast_elementwise_fusion | 传播+elementwise算子融合 |
concat_fusion | concat+concat融合 |
augru_fusion | 把augru这个算子融合 |
clamp_fusion | maximum+minimum/minimum+maximum融合 |
concat_reduce_fusion | elementwise+squeeze/concat+minmax融合 |
conv_mul_fusion | 卷积+乘法,分组卷积+乘法,卷积反传+乘法,分组卷积反传+乘法融合 |
depth_to_space_fusion | reshape+将深度通道分割成空间维度(Transpose)+reshape融合 |
divide_fusion | 乘法+除常数融合 |
fq_mul_fusion | 伪量化+乘法融合 |
fq_mul_fusion | 伪量化+reshape |
gelu_fusion | gelu算子融合 |
gru_cell_fusion | gru + matmul/add/激活/乘法/减法 融合 |
hsigmoid_fusion | 把三种方法替换为hsigmoid |
hswish_fusion | relu+div换为hswish,mul / x*hsigmoid(x)换为hswish/把clamp换为hswish |
interpolate_sequence_fusion | 两个interpolate进行融合 |
leaky_relu_fusion | Multiply和Maximum融合为一个LeakyReLU操作 |
lin_op_sequence_fusion | 识别并融合连续的两个Multiply操作为一个 |
lstm_cell_fusion | lstm算子融合成一个 |
matmul_multiply_fusion | 矩阵乘+乘法融合 |
mish_fusion | 把分散的mish算子进行融合 |
mul_conv_fusion | 矩阵乘法+卷积融合 |
mul_fake_quantize_fusion | 乘法+伪量化融合 |
mvn_fusion | 把均值方差操作融合 |
nearst_neighbour_upsampling_fusion | 将复杂的最近邻上采样操作序列替换为单一的Interpolate操作 |
nonzero_horizontal_fusion | 通过合并对相同输入执行的NonZero操作 |
normalize_l2_fusion | 把l2正则融合成一个节点 |
pad_fusion | pad+池化/卷积/反向卷积/分组卷积/分组反向卷积 |
prelu_fusion | 把prelu融合成一个算子 |
random_uniform_fusion | 将对RandomUniform输出的线性变换预先融合到RandomUniform的参数 |
reduce_reshape_fusion | reduce+reshape |
relu_fake_quantize_fusion | relu+伪量化融合 |
reshape_sequence_fusion | 融合连续的 Reshape 操作 |
sequence_fusion | 把RNN/LSTM/GRU融合 |
shuffle_channels_fusion | reshape+在通道维度上重新排列数据(transpose)+reshape融合 |
softmax_fusion | softmax算子融合 |
softplus_fusion | softplus算子融合 |
softplus_to_mish_fusion | 把softplus+tanh转为mish算子 |
space_to_batch_fusion | Reshape/Transpose+Pad+SpaceToDepth+Reshape/Transpose的操作序列替换为单一的SpaceToBatch操作 |
split_concat_pair_to_interpolate_fusion | split+concat融合为interpolate |
split_squeeze_concat_fusion | 替换由Split、Squeeze/Reshape和Concat组成的操作序列 |
subtract_fusion | 加法之后乘-1或取负的操作优化成减法 |
swish_fusion | xsigmoid(x) / xsigmoid(beta * x) / 和swish被拆开的几种形式进行融合 |
Paddle中缺少的算子标号列举:
1,2,5-7,15-17,25-27,29,31,32,36,39,40,41,42,43,44
需要支持的算子一览
一、需要支持的OnnxRuntime算子
算子融合类型 | 描述 |
---|---|
bias_gelu_fusion | 把Add + Gelu的操作融合成一个BiasGelu |
bias_softmax_fusion | 把Softmax(Input + Bias)这个操作融合 |
conv_mul_fusion | 把conv和乘法操作进行合并 |
div_mul_fusion | 把1/a * b这种操作融合成b/a |
gather_fusion | 通过使用Split代替多个Gather操作,可以减少对内存的访问次数 |
gather_slice_fusion | 把2gather + 1slice的操作融合成一个split操作 |
gemm_transpose_fusion | 把矩阵乘和转置融合 |
matmul_bn_fusion | 矩阵乘norm融合 |
not_where_fusion | 通过融合消除掉not + where中的not |
pad_fusion | 把pad操作和后续乘法算子融合 |
quick_gelu_fusion | 把x*sigmoid(x)转换成一个kernel |
relu_clip_fusion | 把relu和clip进行融合 |
skip_layer_norm_fusion | 融合Add + LayerNorm操作 |