---
title: 工具实现的融合功能
description: "当前该工具主要实现的融合功能，分为如下几类（如下融合场景中涉及的单个算子，需要先满足各个压缩场景比如量化、组合压缩等的约束条件）："
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/amct/atlasamct_16_0243.html
sourcePath: /source/zh/canncommercial/900/devaids/amct/atlasamct_16_0243.html
indexId: 54d5ae0ba8a23427b828d974cb4d3dadc90b2e076f080720a43e6901de597ee665
---
# 工具实现的融合功能

当前该工具主要实现的融合功能，分为如下几类（如下融合场景中涉及的单个算子，需要先满足各个压缩场景比如量化、组合压缩等的约束条件）：

- Conv+BN融合：

  - AMCT在量化前会对模型中的"Conv2D/Conv3D+BatchNorm"结构做Conv+BN融合，融合后的"BatchNorm"层会被删除。
  - AMCT在量化前会识别模型中的"Conv2D+BatchToSpace+BN"结构，检测到Channel一致时会调整为"Conv2D+BN+BatchToSpace"结构，然后进行Conv+BN融合，融合后的"BatchNorm"层会被删除。
- Depthwise_Conv+BN融合：AMCT在量化前会对模型中的"DepthwiseConv2dNative+BatchNorm"结构做Depthwise_Conv+BN融合，融合后的"BatchNorm"层会被删除。
- OP+(BiasAdd)+Mul融合：AMCT在量化前会对模型中的“Conv2D/Conv3D/MatMul/DepthwiseConv2dNative/Conv2DBackpropInput+Mul”和“Conv2D/MatMul/DepthwiseConv2d/Conv2DBackpropInput+BiasAdd+Mul”结构做OP+(BiasAdd)+Mul融合，融合后的“Mul”层会被删除。
  该场景下，要求Mul的另外一路输入为Const类型，且Shape为空。

- Group_conv+BN融合：如果模型中使用"Split+多路Conv2D/Conv3D+ ConcatV2（或Concat，且Concat在C轴）"表示Group_conv，AMCT在量化前会对模型中"Group_conv+BatchNorm"结构做融合，融合后的"BatchNorm"层会被删除。
  BN支持融合的算子类型为FusedBatchNorm、FusedBatchNormV2和FusedBatchNormV3。

- requant融合（Relu6无法做Requant融合，需替换为Relu）：由于Relu6算子在Relu的基础上增加了对6以上数值的截断，同时量化过程中也会对输入浮点数进行截断，故Relu6+Ascendquant与Relu+Ascendquant存在等价的场景可以进行替换。基于该背景AMCT对量化部署模型中的Relu6+Ascendquant算子等价替换为Relu+Ascendquant。
- OP+Add融合（算子替换）：当Add/AddV2算子的一路为常量，且不能与placeholder节点的关联，另一路为如下类型的算子，Add/AddV2会替换成BiasAdd算子，以便进行后续的Bias量化：

  - Conv2d/Conv3d：Add是标量，或者多维数组，或者最后一个轴和cout轴长度对齐的一维数组。
  - DepthwiseConv2dNative：Add是标量，或者多维数组，或者最后一个轴和cout轴长度对齐的一维数组。
  - Conv2DBackpropInput：Add是标量，或者多维数组，或者最后一个轴和cout轴长度对齐的一维数组。
  - MatMul：Add与Matmul的cout轴长度对齐，Add算子其他轴均是1。
  - BatchMatMul：Add是常量、一维或者其他轴长度均为1，最后一个轴长度与cout对齐。
- MatMul+BN融合：

  - MatMul算子要满足如下条件，并且第二个Reshape算子输出的shape和MatMul输出Tensor shape要一致，示例如图1所示。

    - 不带biasadd，format为NHWC，shape不固定
    - 不带biasadd，format为NCHW，shape不固定
    - 不带biasadd，format为NHWC，shape固定
    - 不带biasadd，format为NCHW，shape固定
    - 带biasadd，format为NHWC，shape不固定
    - 带biasadd，format为NCHW，shape不固定
    - 带biasadd，format为NHWC，shape固定
    - 带biasadd，format为NCHW，shape固定
图1 MatMul+BN融合场景

  - BN支持融合的算子类型为FusedBatchNorm、FusedBatchNormV2和FusedBatchNormV3。
- BN小算子融合为FusedBatchNormV3大算子：仅训练后量化支持，并且只有Conv+BN或者Conv+BiasAdd+BN结构才会触发BN小算子融合为大算子，若TensorFlow版本为1.15.0，则只支持BN小算子输入为4维的场景；若TensorFlow版本为2.6.3，则支持BN小算子输入为4维、5维的场景，并且5维场景下上述结构中的Conv算子必须为Conv3D。AMCT
  对tf.keras.layers.BatchNormalization(https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization)
  产生的小算子结构的BN进行匹配，并且将匹配到的小算子BN结构替换为大算子的BN结构，具体支持的小算子BN结构的场景如下所示：
  -     tf.keras.layers.BatchNormalization(https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization)
接口满足：入参fused=False，调用参数inputs，training=False，融合前后网络结构图为：
  -     tf.keras.layers.BatchNormalization(https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization)
接口满足：入参fused=False、center=False，调用参数inputs，training=False，融合前后网络结构图为：
  -     tf.keras.layers.BatchNormalization(https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization)
接口满足：入参fused=False，scale=False，调用参数inputs，training=False，融合前后网络结构图为：
  -     tf.keras.layers.BatchNormalization(https://www.tensorflow.org/api_docs/python/tf/keras/layers/BatchNormalization)
接口满足：入参fused=False，scale=False，center=False，调用参数inputs，training=False，融合前后网络结构图为：
