模型优化技术¶
优化可提供无需重新训练模型的卷积神经网络 (CNN) 推理加速方法。
线性运算融合¶
许多卷积神经网络都包含 BatchNormalization 和 ScaleShift 层(如 Resnet*、Inception*),它们可以表示为线性运算(加法和乘法)序列。例如,ScaleShift 层可以表示为 Mul → Add 序列。这些层可以融合到前面的 Convolution 层或 FullyConnected 层中,除非卷积出现在 Add 运算之后(由于卷积填充)。
用途¶
在模型优化器中,此项优化是默认开启的。如需禁用此项优化,可以将 --disable_fusing 参数传递给模型优化器。
优化介绍¶
此优化方法包括三个阶段:
BatchNormalization和ScaleShift分解:在这个阶段,BatchNormalization层分解为Mul → Add → Mul → Add序列,ScaleShift层分解为Mul → Add层序列。线性运算合并:在这个阶段,
Mul和Add运算合并为单个Mul → Add实例。 例如,如果拓扑中有BatchNormalization → ScaleShift序列,则在第一阶段,该序列会被替换为Mul → Add。在下一阶段,如果没有Convolution或FullyConnected层可以融合到下一个层,则后者会被替换为ScaleShift层。线性运算融合:在这个阶段,该工具将
Mul和Add运算融合到Convolution或FullyConnected层。 请注意,它会在图中向后和向前搜索Convolution和FullyConnected层(不能向前融合到Convolution层的Add运算除外)。
ResNet 优化(步长优化)¶
ResNet 优化是一种特定的优化,应用于 Caffe ResNet 拓扑(如 ResNet50、ResNet101、ResNet152)和基于 ResNet 的拓扑。此项优化是默认开启的,并且可通过 --disable_resnet_optimization 键禁用。
优化介绍¶
在下图中,您可以看到 Caffe ResNet50 模型的原始部分和优化部分。此项优化的主要思路是将大于 1 的步长从内核大小 = 1 的卷积层移到上层卷积层。此外,如果 Eltwise 层的输入形状在优化过程中发生了变化,则模型优化器会添加一个池化层来对齐它。
在本例中,res3a_branch1 和 res3a_branch2a 卷积层的步长移到了 res2c_branch2b 卷积层。此外,为了对齐 res2c Eltwise 的输入形状,该项优化插入了内核大小 = 1、步长 = 2 的池化层。
分组卷积融合¶
分组卷积融合是一种特定的优化,应用于 TensorFlow 拓扑。此项优化的主要思路是合并 Split 输出的卷积结果,然后按照与从 Split 输出这些结果的顺序相同的顺序,使用 Concat 运算重新合并它们。
禁用融合¶
模型优化器允许通过 --finegrain_fusing <node_name1>,<node_name2>,... (也支持正则表达式)对指定节点禁用优化。通过此键,您可以标记任何优化都不会触及的节点。
用法示例¶
在下图中,您可以看到 TensorFlow InceptionV4 拓扑的两个可视化中间表示 (IR)。
第一个是原始中间表示,将由模型优化器生成。
第二个中间表示将由模型优化器使用 --finegrain_fusing InceptionV4/InceptionV4/Conv2d_1a_3x3/Conv2D 键生成,您可以看到其中的 Convolution 并未通过 Mul1_3752 和 Mul1_4061/Fused_Mul_5096/FusedScaleShift_5987 运算融合。\