模型推理库融合算子优化调研 - yuanlehome/Hackathon GitHub Wiki

目标调研其他算子库的算子融合现况

一、准备调研的仓库一览

二、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仓库位置

https://github.com/oneapi-src/oneDNN/blob/dev-graph/doc/programming_model/ops_and_patterns.md#fusion-patterns

融合算子调研

算子融合类型 描述
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仓库位置

https://github.com/openvinotoolkit/openvino/tree/master/src/common/transformations/src/transformations/common_optimizations

融合算子调研

算子融合类型 描述
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操作