支持量化的层及约束

本章节给出不同框架可量化的层以及相关约束。

总体说明:

  • 若网络模型输入数据类型或权重数据类型为Float16或混合精度类型(Float32/Float16共存),会关闭如下算子的量化功能: AvgPool、Pooling、AvgPoolV2、MaxPool、MaxPoolV3、Add、Eltwise、BatchMatMulV2(两路输入都为变量tensor)。
  • INT16数据量化过程中,发现整网精度下降,可以通过精度比对工具,逐层比对原始模型和量化后模型输出误差(例如以余弦相似度作为标准,需要相似度达到0.99以上),找到误差较大的层,然后通过简易配置文件中的dst_type参数将该层修改为INT8量化,重新进行量化。
  • Caffe框架在如下产品形态已不演进,不保证功能可用:

    Atlas A3 训练系列产品/Atlas A3 推理系列产品

    Atlas A2 训练系列产品/Atlas A2 推理系列产品

    IPV350

全量化

均匀量化支持的层及约束(Caffe框架)

支持的层类型 约束 对应Ascend IR定义的层类型
InnerProduct:全连接层 transpose属性为false,axis为1 FullyConnection
Convolution:卷积层 filter维度为4 Conv2D
Deconvolution:反卷积层 dilation为1、filter维度为4 Deconvolution
Pooling - mode为1,全量化(weight+tensor),global_pooling为false,不支持移位N操作
- mode为0,只做tensor量化
Pooling
Eltwise 只做tensor量化且operation=1 Eltwise

均匀量化支持的层及约束(TensorFlow框架)

如下表格不适用于IPV350,其约束请参见IPV350支持的层及约束

支持的层类型 约束 对应Ascend IR定义的层类型
MatMul:全连接层 - transpose_a为False,transpose_b为False,adjoint_a为False,adjoint_b为False
- weight的输入来源不含有placeholder等可动态变化的节点
MatMulV2
Conv2D:卷积层 weight的输入来源不含有placeholder等可动态变化的节点 Conv2D
DepthwiseConv2dNative:Depthwise卷积层 weight的输入来源不含有placeholder等可动态变化的节点 DepthwiseConv2D
Conv2DBackpropInput dilation为1,weight的输入来源不含有placeholder等可动态变化的节点 Conv2DBackpropInput
BatchMatMulV2 - adj_x=False
- 如果第二路输入为常量const,则要求为2维
- 当两路输入都为变量tensor时,仅支持INT8对称量化
BatchMatMulV2
AvgPool 不支持移位N操作 AvgPool
Conv3D dilation_d为1 Conv3D
MaxPool 只做tensor量化 MaxPool、MaxPoolV3
Add 只做tensor量化,且只支持单路输入的量化 Add

针对BatchMatMulV2量化层,两路输入都为变量tensor量化场景,只在以下产品能获得收益,其他产品量化后精度会下降:

Atlas A3 训练系列产品/Atlas A3 推理系列产品

Atlas A2 训练系列产品/Atlas A2 推理系列产品

Atlas 200I/500 A2 推理产品

均匀量化支持的层及约束(ONNX框架)

如下表格不适用于IPV350,其约束请参见IPV350支持的层及约束

支持的层类型 约束 对应Ascend IR定义的层类型
Conv:卷积层 - filter维度为5的情况下,要求dilation_d为1
- weight的输入来源不含有placeholder等可动态变化的节点
Conv2D、Conv3D
Gemm:广义矩阵乘 - transpose_a=false
- weight的输入来源不含有placeholder等可动态变化的节点
MatMulV2
ConvTranspose:转置卷积 - dilation为1、filter维度为4
- weight的输入来源不含有placeholder等可动态变化的节点
Conv2DTranspose
MatMul - 如果第二路输入为常量const,则要求为2维
- 当两路输入都为变量tensor时,仅支持INT8对称量化
- weight的输入来源不含有placeholder等可动态变化的节点
BatchMatMulV2
AveragePool global_pooling为false,不支持移位N操作 AvgPoolV2
MaxPool 只做tensor量化 MaxPool、MaxPoolV3
Add 只做tensor量化,且只支持单路输入的量化 Add

针对MatMul量化层,两路输入都为变量tensor量化场景,只在以下产品能获得收益,其他产品量化后精度会下降:

Atlas A3 训练系列产品/Atlas A3 推理系列产品

Atlas A2 训练系列产品/Atlas A2 推理系列产品

Atlas 200I/500 A2 推理产品

均匀量化支持的层及约束(IPV350)

框架 支持的层类型 约束 对应Ascend IR定义的层类型
TensorFlow MatMul:全连接层 - transpose_a为False, transpose_b为False,adjoint_a为False,adjoint_b为False
- weight的输入来源不含有placeholder等可动态变化的节点
MatMulV2
TensorFlow Conv2D:卷积层 weight的输入来源不含有placeholder等可动态变化的节点 Conv2D
TensorFlow Conv2DBackpropInput dilation为1,weight的输入来源不含有placeholder等可动态变化的节点 Conv2DBackpropInput
TensorFlow DepthwiseConv2dNative weight的输入来源不含有placeholder等可动态变化的节点 DepthwiseConv2D
ONNX ConvTranspose - dilation为1、filter维度为4
- weight的输入来源不含有placeholder等可动态变化的节点
Conv2DTranspose

仅权重量化

该版本不支持仅权重量化特性。

仅权重量化特性,仅支持以下产品类型:

Atlas 推理系列产品

Atlas A2 训练系列产品/Atlas A2 推理系列产品

表 2 仅权重量化场景支持的层及约束

Ascend IR定义的层类型 仅权重量化权重ARQ中channel_wise=true 仅权重量化权重ARQ中asymmetric=true或false 权重和数据都量化权重ARQ中channel_wise=true 权重和数据都量化权重ARQ中asymmetric=true 约束
MatMulV2 true × × 第二路的输入来源不含有placeholder等可动态变化的节点。
BatchMatMulV2 true × × 第二路的输入来源不含有placeholder等可动态变化的节点。
FFN true和false × × - FFN算子的expert_tokens输入不为空。
- FFN算子的两个权重为Float16的常量。
- FFN算子的antiquant_scale1、antiquant_scale2、antiquant_offset1、antiquant_offset2四个输入为空。
- 权重不支持权重共享。

其中:

  • √表示支持,×表示该场景量化会异常。
  • 权重ARQ中channel_wise=true:表示每个channel独立量化,量化因子不同。
  • 权重ARQ中asymmetric
    • true:表示权重量化使用非对称量化
    • false:表示权重量化使用对称量化。
    • true和false表示权重量化支持对称量化和非对称量化。
  • FFN算子量化仅Atlas A2 训练系列产品/Atlas A2 推理系列产品支持。