---
title: 支持的融合功能
description: "量化过程中会对模型中的某些结构做算子融合，融合后图结构得到优化，从而提升网络推理性能，本节对使用到的融合功能进行详细介绍。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/programug/graphdevg/atlasag_25_0046.html
sourcePath: /source/zh/canncommercial/900/programug/graphdevg/atlasag_25_0046.html
indexId: cfb81ef1a4b141a19a3aa1a28061a7062d55893153062ac1aa818ed564c8fd0b70
---
# 支持的融合功能

量化过程中会对模型中的某些结构做算子融合，融合后图结构得到优化，从而提升网络推理性能，本节对使用到的融合功能进行详细介绍。

- 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小算子结构融合的前提条件包括：

  1. BN结构中的data节点必须为可量化节点（Conv2D、DepthwiseConv2D、MatMulV2、Conv3D）。
  2. 如果结构中有除data、scale、offset、mean、variance和输出节点之外的节点与该结构外的节点连接，则不做融合。
对于没有offset的BN结构，融合时会构造一个全0的offset节点；对于没有scale的BN结构，融合时会构造一个全1的scale节点。具体支持的小算子BN结构的场景如下所示：

  - 无offset，is_training=False，data_format=NHWC，输入节点为Const类型，融合前后网络结构图为：

  - 无offset，is_training=False，data_format=NCHW，输入节点为Const类型，融合前后网络结构图为：

  - 无scale和offset，is_training=False，data_format=NHWC，输入节点为Const类型，融合前后网络结构图为：

  - 无scale和offset，is_training=False，data_format=NCHW，输入节点为Const类型，融合前后网络结构图为：

  - 无scale，is_training=False，data_format=NHWC，输入节点为Const类型，融合前后网络结构图为：

  - 无scale，is_training=False，data_format=NCHW，输入节点为Const类型，融合前后网络结构图为：

  - is_training=False，data_format=NHWC，输入节点为Const类型，融合前后网络结构图为：

  - is_training=False，data_format=NCHW，输入节点为Const类型，融合前后网络结构图为：

  - 无offset，is_training=False，data_format=NHWC，输入节点为Variable类型，融合前后网络结构图为：

  - 无offset，is_training=False，data_format=NCHW，输入节点为Variable类型，融合前后网络结构图为：

  - 无scale和offset，is_training=False，data_format=NHWC，输入节点为Variable类型，融合前后网络结构图为：

  - 无scale和offset，is_training=False，data_format=NCHW，输入节点为Variable类型，融合前后网络结构图为：

  - 无scale，is_training=False，data_format=NHWC，输入节点为Variable类型，融合前后网络结构图为：

  - 无scale，is_training=False，data_format=NCHW，输入节点为Variable类型，融合前后网络结构图为：

  - is_training=False，data_format=NHWC，输入节点为Variable类型，融合前后网络结构图为：

  - is_training=False，data_format=NCHW，输入节点为Variable类型，融合前后网络结构图为：

  - 一种简化后的BN结构，无offset，data_format=NHWC，输入节点为Variable类型，融合前后网络结构图为：

  - 一种简化后的BN结构，无offset，data_format=NCHW，输入节点为Variable类型，融合前后网络结构图为：

  - 一种简化后的BN结构，无scale和offset，data_format=NHWC，输入节点为Variable类型，融合前后网络结构图为：

  - 一种简化后的BN结构，无scale和offset，data_format=NCHW，输入节点为Variable类型，融合前后网络结构图为：
- bn_branch类小算子融合成BN大算子
  AMCT对bn_branch小算子结构的双BN结构进行匹配，并将匹配到的小算子结构替换为大算子的BN结构。如果结构中存在以下三种场景：两个BN分支的输入数据来源不同、结构输出为训练BN输出、推理BN的is_training参数为True，则不做融合。算子融合过程会保留原结构中的推理BN大算子，并删除多余的Switch等小算子结构的节点，并重新添加保留BN算子的输入输出边，实现小算子融合成大算子。具体支持的小算子BN结构的场景如下所示：
