---
title: 量化流程
description: "本节详细介绍量化感知训练支持的量化层，接口调用流程和示例。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/amct/atlasamct_16_0178.html
sourcePath: /source/zh/canncommercial/900/devaids/amct/atlasamct_16_0178.html
indexId: 42eb3a6e1eb3ca032ef995102ee7bd9fc33d609212ca26cfa7faf8a842ac9b4e65
---
# 量化流程

本节详细介绍量化感知训练支持的量化层，接口调用流程和示例。

量化感知训练当前仅支持对float32数据类型的网络模型进行量化。量化感知训练支持量化的层以及约束如下：


**表1 量化感知训练支持的层以及约束**

| 支持的层类型 | 约束 | 备注 |
| --- | --- | --- |
| MatMul | transpose\_a=False、transpose\_b=False、adjoint\_a=False、adjoint\_b=False | 仅支持INT8量化。 |
| Conv2D | 由于硬件约束，原始模型中输入通道数Cin<=16时不建议进行量化感知训练，否则可能会导致量化后的部署模型推理时精度下降 | 仅支持INT8量化。 |
| DepthwiseConv2dNative | 由于硬件约束，原始模型中输入通道数Cin<=16时不建议进行量化感知训练，否则可能会导致量化后的部署模型推理时精度下降 针对DepthwiseConv2dNative层： 当strides>1且dilation>1时，在TensorFlow 1.15版本和2.6.5版本存在官方已知问题：CPU/GPU推理结果shape错误，并非AMCT本身问题。 当strides或者dilation只有一个大于1时，推理结果正确。 | 仅支持INT8量化。 |
| Conv2DBackpropInput | dilation为1 由于硬件约束，原始模型中输入通道数Cin<=16时不建议进行量化感知训练，否则可能会导致量化后的部署模型推理时精度下降 | 仅支持INT8量化。 |
| AvgPool | \- | 仅支持INT8量化。 |


#### 接口调用流程

量化感知训练接口调用流程如图1所示，如下流程中的训练环境借助TensorFlow框架的CPU/GPU环境，在该开源框架的推理脚本基础上，调用AMCTAPI完成模型压缩，压缩后的部署模型需要使用ATC工具转换成适配AI处理器的离线模型后，然后才能在AI处理器上实现推理：

图1 接口调用流程

蓝色部分为用户实现，灰色部分为用户调用AMCT提供的API实现，用户在TensorFlow原始网络推理的代码中导入库，并在特定的位置调用相应API，即可实现量化功能。

简要流程如下：

1. 用户构造训练模式的图结构，然后调用  create_quant_retrain_config
接口生成量化配置文件。
2. 调用  create_quant_retrain_model
图修改接口，根据量化配置文件对训练的图进行量化前的图结构修改：插入数据量化，权重量化相关算子等。
3. 训练模型，将参数保存为checkpoint文件。
4. 调用  create_quant_retrain_model
接口，对推理模式的图进行修改：插入数据量化，权重量化相关算子等。
5. 恢复训练参数，加载ckpt文件，推理量化的输出节点，将量化因子写入record文件，并将推理图固化为pb模型。
6. 调用  save_quant_retrain_model
接口，插入AscendQuant/AscendDequant等量化算子，保存量化模型。


#### 调用示例

1. 如下示例标有“由用户补充处理”的步骤，需要用户根据自己的模型和数据集进行补充处理，示例中仅为示例代码。
2. 调用AMCT的部分，函数入参可以根据实际情况进行调整。量化感知训练基于用户的训练过程，请确保已经有基于TensorFlow环境进行训练的脚本，并且训练后的精度正常。


1. 导入AMCT包，设置日志级别。
  1 2 import amct_tensorflow as amct amct.set_logging_level(print_level='info', save_level='info')

2. （可选，由用户补充处理）创建图并读取训练好的参数，在TensorFlow环境下推理，验证环境、推理脚本是否正常。
  推荐执行该步骤，以确保原始模型可以完成推理且精度正常；执行该步骤时，可以使用部分测试集，减少运行时间。

  1 user_test_evaluate_model(evaluate_model, test_data)

3. （由用户补充处理）创建训练图。
  1 train_graph = user_load_train_graph()

4. 调用AMCT，执行带量化参数的训练流程。

  a. 生成量化配置。
    用户基于构造的训练模式的图结构（BN的is_training参数为True），调用create_quant_retrain_config接口生成量化配置文件（对应图1中的序号1）。 1 2 3 4 5 config_file = './tmp/config.json' simple_cfg = './retrain.cfg' amct.create_quant_retrain_config(config_file=config_file, graph=train_graph, config_defination=simple_cfg)

  b. 修改训练模式的图。
    调用量化图修改接口create_quant_retrain_model，根据量化配置文件对训练的图进行量化前的图结构修改：在图中插入数据量化、权重量化等相关算子，用于计算量化相关参数（对应图1中的序号2）。 1 2 3 4 record_file = './tmp/record.txt' retrain_ops = amct.create_quant_retrain_model(graph=train_graph, config_file=config_file, record_file=record_file)

  c. （由用户补充处理）使用修改后的图，创建反向梯度，在训练集上做训练，训练量化因子。

    1. 使用修改后的图，调用自适应学习率优化器（RMSPropOptimizer）建立反向梯度图。该步骤需要在      4.b
后执行。
      1 2 3 optimizer = tf.compat.v1.train.RMSPropOptimizer( ARGS.learning_rate, momentum=ARGS.momentum) train_op = optimizer.minimize(loss)


    2. 创建会话，进行模型的训练，并将训练后的参数保存为checkpoint文件（对应      图1
中的序号3，4）。
      注意：从训练好的checkpoint恢复模型参数后再训练；训练中保存的参数应该包括量化因子：前batch_num次训练后会生成量化因子，如果训练次数少于batch_num会导致失败。 1 2 3 4 5 with tf.Session() as sess: sess.run(tf.compat.v1.global_variables_initializer()) sess.run(outputs) #将训练后的参数保存为checkpoint文件 saver_save.save(sess, retrain_ckpt, global_step=0)

5. （由用户补充处理）创建推理图。
  1 test_graph = user_load_test_graph()

6. 调用AMCT，实现量化感知训练。

  a. 修改推理模式的图。
    用户基于构造的推理模式的图结构（BN的is_training参数为False），调用量化图修改接口create_quant_retrain_model，根据量化配置文件对推理的图进行量化前的图结构修改：在图中插入数据量化、权重量化等相关算子（对应图1中的序号5）。

    1 2 3 4 record_file = './tmp/record.txt' retrain_ops = amct.create_quant_retrain_model(graph=train_graph, config_file=config_file, record_file=record_file)


  b. （由用户补充处理）创建会话，恢复训练参数，推理量化的输出节点（retrain_ops[-1]），将量化因子写入record文件，并将推理图固化为pb模型（对应    图1
中的序号6，7）。
    说明：推理和恢复的参数要在同一session中，推理执行的是retrain_ops[-1]的输出tensor；推理图固化为pb模型时，包含训练好的参数。 1 2 3 4 5 6 7 8 9 10 11 12 13 variables_to_restore = tf.compat.v1.global_variables() saver_restore = tf.compat.v1.train.Saver(variables_to_restore) with tf.Session() as sess: sess.run(tf.compat.v1.global_variables_initializer()) #恢复训练参数 saver_restore.restore(sess, retrain_ckpt) #推理量化的输出节点（retrain_ops[-1]），将量化因子写入record文件 sess.run(retrain_ops[-1]) #固化pb模型 constant_graph = tf.compat.v1.graph_util.convert_variables_to_constants( sess, eval_graph.as_graph_def(), [output.name[:-2] for output in outputs]) with tf.io.gfile.GFile(frozen_quant_eval_pb, 'wb') as f: f.write(constant_graph.SerializeToString())

  c. 保存量化模型。
    根据量化因子以及pb文件，调用save_quant_retrain_model接口，插入AscendQuant、AscendDequant等算子，保存为量化模型（对应图1中的序号8）。 1 2 3 4 5 quant_model_path = './result/user_model' amct.save_quant_retrain_model(pb_model=trained_pb, outputs=user_model_outputs, record_file=record_file, save_path=quant_model_path)

7. （可选，由用户补充处理）使用量化后模型user_model_quantized.pb和测试集，在TensorFlow环境下推理，测试量化后的仿真模型精度。
  使用量化后仿真模型精度与2中的原始精度做对比，可以观察量化对精度的影响。 1 2 quant_model = './results/user_model_quantized.pb' user_do_inference(quant_model, test_data)
