[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)

简介

现在主要用于通过实操进行onnx简化库的每种pass的特性和效果。因为Pass实在太多,因此这里挑了一些效果显著的Pass进行呈现。

左边的是原始模型,右边的是特定Pass优化后的模型

OnnxOptimizer各Pass的实操和特性说明

adjust_add

  • 前:常量输入是A,动态输入是B
  • 后:常量输入是B, 动态输入是A
  • 特性:把动态输入变成Add算子的第一个input
    [Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第1张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第2张图片

eliminate_common_subexpression

  • 前:含有两个公共的表达式Y(Mul(X,Sigmoid(X)))
  • 后:合并只有一个
  • 特性:合并公共的结构

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第3张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第4张图片

eliminate_if_with_const_cond

  • 前:含有If算子,存在子图
  • 后:没有If算子,子图被暴露
  • 特性:cond确定的If算子被去除

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第5张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第6张图片

eliminate_nop_cast

  • 前:有一个Cast算子,to=float32,input_dtype=float32
  • 后:没有Cast算子
  • 特性:to=input_dtype的Cast被消除

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第7张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第8张图片

eliminate_nop_flatten

  • 前:存在Flatten算子
  • 后:没有Flatten算子
  • 特性:对shape不起作用的Flatten算子被消除

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第9张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第10张图片

eliminate_nop_monotone_argmax

  • 前:存在Y=ArgMax(Exp(X))这样的结构
  • 后:只有Y=ArgMax(X)
  • 特性:类似于Exp,只要是输出/输入是正相关的激活函数接入ArgMax算子后,该激活函数可以被消除而不影响结果

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第11张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第12张图片

eliminate_nop_with_unit

  • 前:存在很多乘1.0、加0.0等无效操作
  • 后:去除了很多无效的操作
  • 特性:消除掉同0并的And、同1乘的Mul、同0或的Or、同0加的Add、减0的Sub、除1的Div、方1的Pow、 无效的Concat

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第13张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第14张图片

eliminate_shape_gather

  • 前:Y=Gather(Shape(X))
  • 后:Y=2
  • 特性:X的Shape已知,那么Y就是已知的。

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第15张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第16张图片

fuse_add_bias_into_conv

  • 前:B=Add(Conv2d(X,Y), A)
  • 后:B=Conv2d(X,Y,A)
  • 特性:把Add常量融合进Conv2d中

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第17张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第18张图片

fuse_bn_into_conv

  • 前:Y=BN(Conv2d(X))
  • 后:Y=Conv2d(X)
  • 特性:把BN融合进Conv2d中,主要因为重构了Conv2d的weight和bias

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第19张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第20张图片

fuse_consecutive_concats

  • 前:存在很多axes一致的连续concat操作
  • 后:只有一个concat
  • 特性:合并很多axes一致的连续concat操作为一个

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第21张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第22张图片

fuse_consecutive_log_softmax

  • 前:Z=log(softmax(X))
  • 后:X=logsoftmax(X)
  • 特性:合并算子成为一个算子

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第23张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第24张图片

fuse_qkv

  • 前:普通的产生qkv的结构,拥有三个矩阵乘
  • 后:合并为一个矩阵乘,后续用split分开
  • 特性:对qkv结构特定优化

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第25张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第26张图片

fuse_transpose_into_gemm

  • 前:存在transpose执行矩阵转置操作
  • 后:转置操作被gemm的transA/B属性替代
  • 特性:消除transpose算子

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第27张图片[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)_第28张图片

总结

结束了,已经搞定了onnx官方的简化库的基本细节了。后面再续其他有趣的东东。

你可能感兴趣的:(Learn,机器学习)