[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)
简介
现在主要用于通过实操进行onnx简化库的每种pass的特性和效果。因为Pass实在太多,因此这里挑了一些效果显著的Pass进行呈现。
左边的是原始模型,右边的是特定Pass优化后的模型
OnnxOptimizer各Pass的实操和特性说明
adjust_add
- 前:常量输入是A,动态输入是B
- 后:常量输入是B, 动态输入是A
- 特性:把动态输入变成Add算子的第一个input
eliminate_common_subexpression
- 前:含有两个公共的表达式Y(Mul(X,Sigmoid(X)))
- 后:合并只有一个
- 特性:合并公共的结构
eliminate_if_with_const_cond
- 前:含有If算子,存在子图
- 后:没有If算子,子图被暴露
- 特性:cond确定的If算子被去除
eliminate_nop_cast
- 前:有一个Cast算子,to=float32,input_dtype=float32
- 后:没有Cast算子
- 特性:to=input_dtype的Cast被消除
eliminate_nop_flatten
- 前:存在Flatten算子
- 后:没有Flatten算子
- 特性:对shape不起作用的Flatten算子被消除
eliminate_nop_monotone_argmax
- 前:存在Y=ArgMax(Exp(X))这样的结构
- 后:只有Y=ArgMax(X)
- 特性:类似于Exp,只要是输出/输入是正相关的激活函数接入ArgMax算子后,该激活函数可以被消除而不影响结果
eliminate_nop_with_unit
- 前:存在很多乘1.0、加0.0等无效操作
- 后:去除了很多无效的操作
- 特性:消除掉同0并的And、同1乘的Mul、同0或的Or、同0加的Add、减0的Sub、除1的Div、方1的Pow、 无效的Concat
eliminate_shape_gather
- 前:Y=Gather(Shape(X))
- 后:Y=2
- 特性:X的Shape已知,那么Y就是已知的。
fuse_add_bias_into_conv
- 前:B=Add(Conv2d(X,Y), A)
- 后:B=Conv2d(X,Y,A)
- 特性:把Add常量融合进Conv2d中
fuse_bn_into_conv
- 前:Y=BN(Conv2d(X))
- 后:Y=Conv2d(X)
- 特性:把BN融合进Conv2d中,主要因为重构了Conv2d的weight和bias
fuse_consecutive_concats
- 前:存在很多axes一致的连续concat操作
- 后:只有一个concat
- 特性:合并很多axes一致的连续concat操作为一个
fuse_consecutive_log_softmax
- 前:Z=log(softmax(X))
- 后:X=logsoftmax(X)
- 特性:合并算子成为一个算子
fuse_qkv
- 前:普通的产生qkv的结构,拥有三个矩阵乘
- 后:合并为一个矩阵乘,后续用split分开
- 特性:对qkv结构特定优化
fuse_transpose_into_gemm
- 前:存在transpose执行矩阵转置操作
- 后:转置操作被gemm的transA/B属性替代
- 特性:消除transpose算子
总结
结束了,已经搞定了onnx官方的简化库的基本细节了。后面再续其他有趣的东东。