支持的融合功能
量化过程中会对模型中的某些结构做算子融合,融合后图结构得到优化,从而提升网络推理性能,本节对使用到的融合功能进行详细介绍。
- Caffe框架:
- Conv+BN+Scale融合,AMCT在量化前会对模型中的"Convolution+BatchNorm+Scale"结构做Conv+BN+Scale融合,融合后的"BatchNorm"、"Scale"层会被删除。
- DeConv+BN+Scale融合,AMCT在量化前会对模型中的"Deconvolution+BatchNorm+Scale"结构做DeConv+BN+Scale融合,融合后的"BatchNorm"、"Scale"层会被删除。
- TensorFlow框架:
- Conv+BN融合:AMCT在量化前会对模型中的"Conv2D/Conv3D+BatchNorm"结构做Conv+BN融合,融合后的"BatchNorm"层会被删除。
- Depthwise_Conv+BN融合:AMCT在量化前会对模型中的"DepthwiseConv2dNative+BatchNorm"结构做Depthwise_Conv+BN融合,融合后的"BatchNorm"层会被删除。
- Conv2DBackpropInput+BN融合:AMCT在量化前会对模型中的"Conv2DBackpropInput+BatchNorm"结构做Conv2DBackpropInput+BN融合,融合后的"BatchNorm"层会被删除。
- Split+Conv+Concat融合:AMCT在量化前会对模型中的分组卷积Split+Conv(多个)+Bias(非必须)+Concat结构做group_conv融合,减少校准流程的计算量并优化量化后模型的内存和性能。其中Split算子包含Split和SplitV,卷积算子包含Conv2d,Concat算子包含Concat和ConcatV2。
要求:Split算子的split_dim和Concat算子的concat_dim与卷积的Cout轴index一致;各个卷积算子量化配置和算子属性要一致。
- ONNX框架:
- Conv+BN融合,AMCT在量化前会对模型中的"Conv+BatchNormalization"结构做Conv+BN融合,融合后的"BatchNorm"层会被删除。
- ConvTranspose+BN融合,AMCT在量化前会对模型中的"ConvTranspose+BatchNormalization"结构做ConvTranspose+BN融合,融合后的"BatchNorm"层会被删除。
- requant融合场景中的Relu6算子替换成Relu(Relu6无法做Requant融合,需替换为Relu):由于Relu6算子在Relu的基础上增加了对6以上数值的截断,同时量化过程中也会对输入浮点数进行截断,故AscendDequant+Relu6+AscendQuant与AscendDequant+Relu+AscendQuant存在等价的场景可以进行替换。基于该背景AMCT对量化部署模型中的AscendDequant+Relu6+AscendQuant结构等价替换为AscendDequant+Relu+AscendQuant。
该场景下需要满足限制条件才可以进行替换,条件为(127-offset)/scale<6,其中scale/offset为quant中取出的量化参数。
- BatchNorm+Mul+Add融合(适用于TensorFlow框架和ONNX框架)
AMCT在量化前会先对模型中的 “BatchNorm+Mul” 结构做“BN+Mul”融合,融合后的 “Mul” 层会被删除;然后对模型中的 “BatchNorm+Add” 结构做“BN+Add”融合,融合后的 “Add” 层会被删除。
- BN小算子融合为BatchNorm大算子(适用于TensorFlow框架和ONNX框架)。
AMCT对小算子结构的BN进行匹配,并将匹配到的小算子BN结构替换为大算子的BN结构。BN小算子结构融合的前提条件包括:
- BN结构中的data节点必须为可量化节点(Conv2D、DepthwiseConv2D、MatMulV2、Conv3D)。
- 如果结构中有除data、scale、offset、mean、variance和输出节点之外的节点与该结构外的节点连接,则不做融合。
对于没有offset的BN结构,融合时会构造一个全0的offset节点;对于没有scale的BN结构,融合时会构造一个全1的scale节点。具体支持的小算子BN结构的场景如下所示:
- bn_branch类小算子融合成BN大算子
AMCT对bn_branch小算子结构的双BN结构进行匹配,并将匹配到的小算子结构替换为大算子的BN结构。如果结构中存在以下三种场景:两个BN分支的输入数据来源不同、结构输出为训练BN输出、推理BN的is_traing参数为True,则不做融合。算子融合过程会保留原结构中的推理BN大算子,并删除多余的Switch等小算子结构的节点,并重新添加保留BN算子的输入输出边,实现小算子融合成大算子。具体支持的小算子BN结构的场景如下所示:
父主题: 自动量化