---
title: QAT模型适配CANN模型
description: "如果用户已经使用ONNX原生的QuanitzeLinear、DequantizeLinear算子实现量化功能（以下简称QAT模型），但是该模型无法使用ATC工具转成适配AI处理器的离线模型，则需要借助本节提供的功能，将该QAT模型适配成CANN量化模型格式。然后才能使用ATC工具，将CANN量化模型转成适配AI处理器的离线模型。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/amct/atlasamct_16_0148.html
sourcePath: /source/zh/canncommercial/900/devaids/amct/atlasamct_16_0148.html
indexId: c87b40d1b8291f6edaaca0d1404185eeb8173d9f42ba7eca1671ef720afe48eb65
---
# QAT模型适配CANN模型

如果用户已经使用ONNX原生的QuanitzeLinear、DequantizeLinear算子实现量化功能（以下简称QAT模型），但是该模型无法使用ATC工具转成适配AI处理器的离线模型，则需要借助本节提供的功能，将该QAT模型适配成CANN量化模型格式。然后才能使用ATC工具，将CANN量化模型转成适配AI处理器的离线模型。


**表1 支持的场景及约束**

| 场景 | 支持的层类型 | 约束 |
| --- | --- | --- |
| QuanitzeLinear\-DequantizeLinear图结构对被量化算子的输入和权重同时进行量化，输入侧量化算子替换成AscendQuant，对常量类型权重侧根据目标数据类型离线进行量化，输出侧插入AscendDequant算子进行反量化 | Conv Gemm ConvTranspose MatMul单输入 | 层约束请参见量化流程，支持的算子只支持输入数据类型为float32。 Conv、ConvTranspose：仅支持权重per\-channel、per\-tensor量化。 Gemm：仅支持权重per\-tensor量化 MatMul单输入：仅支持权重per\-tensor量化，权重仅支持2维常量 |
| QuanitzeLinear\-DequantizeLinear图结构对算子的其中一路或两路输入进行量化，在算子输入侧将量化算子替换为AscendQuant\-AscendAntiquant | Add | Add：仅支持per\-tensor量化，输入数据类型为float32 |
| QuanitzeLinear算子为非中间层output算子，且为单输出：模型适配时，不需要和DequantizeLinear配对，适配过程中会将QuantizeLinear算子替换成AscendQuant，对模型输出进行量化（单输出） | \- | \- |


注意：

- 若QuantizeLinear不为output算子：仅支持对QAT模型中包含QuantizeLinear和DequantizeLinear两类FakeQuant层结构的模型进行适配，且仅权重支持per-channel量化，成对的QuantizeLinear、DequantizeLinear层需要存在相同的量化因子。

#### 适配原理

适配原理如图1所示。蓝色部分为用户实现，灰色部分为用户调用AMCT提供的convert_qat_model实现，用户在ONNX QAT网络推理的代码中导入库，并在特定的位置调用相应API，即可实现适配功能。具体适配示例请参见样例列表。

图1 QAT模型适配CANN模型


#### 调用示例

本示例演示了如何将ONNX的QAT量化模型通过AMCT适配为CANN量化模型格式。

- 如下示例标有“由用户补充处理”的步骤，需要用户根据自己的模型和数据集进行补充处理，示例中仅为示例代码。
- 如下示例调用AMCT的部分，函数入参请根据实际情况进行调整。


1. 导入AMCT包，并通过设置环境变量日志级别。
  1 import amct_onnx as amct

2. （可选，由用户补充处理）在ONNX Runtime环境中验证推理脚本及环境。
  建议使用原始待量化的模型和测试集，在ONNX Runtime环境下推理，验证环境、推理脚本是否正常。

  推荐执行该步骤，请确保原始模型可以完成推理且精度正常；执行该步骤时，可以使用部分测试集，减少运行时间。

  1 user_do_inference(ori_model, test_data, test_iterations)

3. 调用AMCT中的convert_qat_model接口，执行模型适配。
  该接口内部会将待适配的模型解析为graph形式，完成图的预处理操作>修改解析后的图结构，插入AscendQuant、AscendDequant等算子，保存为量化模型。 1 2 3 model_file = "./pre_model/mobilenet_v2_qat.onnx" save_path="./results/model" amct.convert_qat_model(model_file, save_path)

4. （可选，由用户补充处理）使用量化后模型和测试集，在ONNX Runtime环境下推理，测试量化后的仿真模型精度。
  使用量化后仿真模型精度与2中的原始精度做对比，可以观察量化对精度的影响。

  1 2 quant_model = './results/user_model_fake_quant_model.onnx' user_do_inference(quant_model, test_data, test_iterations)

  如果模式适配后，deploy部署模型和fakequant精度仿真模型推理精度和原始模型推理精度相比差异较大，原因是deploy模型上板推理需要对bias做量化，fakequant模型推理会对bias做量化反量化，可能与原始模型中的bias存在差异，从而导致了上述精度的差异；该场景下，建议用户先对原始模型的bias进行量化反量化操作，然后再进行模型适配，进行量化反量化的公式如下：

  round(bias/(scale_d*scale_w))*(scale_d*scale_w)
