模型优化技术

优化可提供无需重新训练模型的卷积神经网络 (CNN) 推理加速方法。

线性运算融合

许多卷积神经网络都包含 BatchNormalizationScaleShift 层(如 Resnet*、Inception*),它们可以表示为线性运算(加法和乘法)序列。例如,ScaleShift 层可以表示为 Mul → Add 序列。这些层可以融合到前面的 Convolution 层或 FullyConnected 层中,除非卷积出现在 Add 运算之后(由于卷积填充)。

用途

在模型优化器中,此项优化是默认开启的。如需禁用此项优化,可以将 --disable_fusing 参数传递给模型优化器。

优化介绍

此优化方法包括三个阶段:

  1. BatchNormalizationScaleShift 分解:在这个阶段,BatchNormalization 层分解为 Mul Add Mul Add 序列,ScaleShift 层分解为 Mul Add 层序列。

  2. 线性运算合并:在这个阶段,MulAdd 运算合并为单个 Mul Add 实例。 例如,如果拓扑中有 BatchNormalization ScaleShift 序列,则在第一阶段,该序列会被替换为 Mul Add。在下一阶段,如果没有 ConvolutionFullyConnected 层可以融合到下一个层,则后者会被替换为 ScaleShift 层。

  3. 线性运算融合:在这个阶段,该工具将 MulAdd 运算融合到 ConvolutionFullyConnected 层。 请注意,它会在图中向后和向前搜索 ConvolutionFullyConnected 层(不能向前融合到 Convolution 层的 Add 运算除外)。

使用示例

下图显示了 Caffe Resnet269 拓扑描绘的部分,其中 BatchNorm 层和 ScaleShift 层将融合到 Convolution 层。

../../../_images/resnet_269.svg

ResNet 优化(步长优化)

ResNet 优化是一种特定的优化,应用于 Caffe ResNet 拓扑(如 ResNet50、ResNet101、ResNet152)和基于 ResNet 的拓扑。此项优化是默认开启的,并且可通过 --disable_resnet_optimization 键禁用。

优化介绍

在下图中,您可以看到 Caffe ResNet50 模型的原始部分和优化部分。此项优化的主要思路是将大于 1 的步长从内核大小 = 1 的卷积层移到上层卷积层。此外,如果 Eltwise 层的输入形状在优化过程中发生了变化,则模型优化器会添加一个池化层来对齐它。

../../../_images/resnet_optimization.svg

在本例中,res3a_branch1res3a_branch2a 卷积层的步长移到了 res2c_branch2b 卷积层。此外,为了对齐 res2c Eltwise 的输入形状,该项优化插入了内核大小 = 1、步长 = 2 的池化层。

分组卷积融合

分组卷积融合是一种特定的优化,应用于 TensorFlow 拓扑。此项优化的主要思路是合并 Split 输出的卷积结果,然后按照与从 Split 输出这些结果的顺序相同的顺序,使用 Concat 运算重新合并它们。

../../../_images/groups.svg

禁用融合

模型优化器允许通过 --finegrain_fusing <node_name1>,<node_name2>,... (也支持正则表达式)对指定节点禁用优化。通过此键,您可以标记任何优化都不会触及的节点。

用法示例

在下图中,您可以看到 TensorFlow InceptionV4 拓扑的两个可视化中间表示 (IR)。 第一个是原始中间表示,将由模型优化器生成。 第二个中间表示将由模型优化器使用 --finegrain_fusing InceptionV4/InceptionV4/Conv2d_1a_3x3/Conv2D 键生成,您可以看到其中的 Convolution 并未通过 Mul1_3752Mul1_4061/Fused_Mul_5096/FusedScaleShift_5987 运算融合。\

../../../_images/inception_v4.svg