工具实现的融合功能
当前该工具主要实现的融合功能,分为如下几类(如下融合场景中涉及的单个算子,需要先满足各个压缩场景比如量化、组合压缩等的约束条件):
- 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固定
- BN支持融合的算子类型为FusedBatchNorm、FusedBatchNormV2和FusedBatchNormV3。
- MatMul算子要满足如下条件,并且第二个Reshape算子输出的shape和MatMul输出Tensor shape要一致,示例如图1所示。
- 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产生的小算子结构的BN进行匹配,并且将匹配到的小算子BN结构替换为大算子的BN结构,具体支持的小算子BN结构的场景如下所示:
- tf.keras.layers.BatchNormalization接口满足:入参fused=False,调用参数inputs,training=False,融合前后网络结构图为:
- tf.keras.layers.BatchNormalization接口满足:入参fused=False、center=False,调用参数inputs,training=False,融合前后网络结构图为:
- tf.keras.layers.BatchNormalization接口满足:入参fused=False,scale=False,调用参数inputs,training=False,融合前后网络结构图为:
- tf.keras.layers.BatchNormalization接口满足:入参fused=False,scale=False,center=False,调用参数inputs,training=False,融合前后网络结构图为:
- tf.keras.layers.BatchNormalization接口满足:入参fused=False,调用参数inputs,training=False,融合前后网络结构图为:
父主题: 参考信息