基于性能的自动量化
基于性能的自动量化是为了方便用户获得性能最优的量化模型时所采用的功能。该功能能够在保证模型精度的前提下,根据原始模型、量化模型的上板性能数据进行自动量化,生成混合精度的模型,最终根据上述所有模型的上板性能数据,得到性能最优的模型。
该过程无需用户手动调整量化配置文件,大大简化了优化流程,提高了量化效率。
该产品不支持基于性能的自动量化。
简介
使用基于性能的自动量化功能之前,需要搭建NCA(Neural Compute Agent)/NCS(Neural Compute Server)环境,NCA/NCS提供分布式调用框架功能,其中:
- NCS:封装acl运行服务接口,可接受外部远程上板请求,并且返回对应的性能数据。
- NCA:接收到业务端的上板请求,推送到远端NCS服务端,待接收到运行的性能数据,返回给业务端。
功能部署架构如下图所示。

在AMCT所在服务器安装NCA、OPP、Compiler、Runtime等软件包,在板端环境部署NCS等软件包。NCA软件包安装方法请参见环境部署,NCS安装以及启动方法请参见《AOE调优工具》>AOE工具(Ascend RC)>软件安装>NCS安装和启动(运行环境)章节,其他软件包安装方式请参见《CANN 软件安装》。

环境部署
- 环境搭建
- (可选)设置软件包安装路径。
通过设置如下环境变量,指定软件包的安装路径。执行完安装命令后,软件包安装到该环境变量指定的路径。
export ASCEND_HOME_PATH=${INSTALL_DIR}${INSTALL_DIR}为软件包的安装路径。通过export方式设置环境变量,只在当前窗口有效,设置完成后立即生效,用户也可以通过修改~/.bashrc文件方式设置永久环境变量:
- 以安装用户在任意目录下执行vi ~/.bashrc,在该文件最后添加上述内容。
- 保存文件后,执行source ~/.bashrc使环境变量生效。
若已经通过1.a环境变量方式设置了软件包的安装路径,1.b安装命令中又使用--install-path=path参数指定安装路径,则以--install-path=path参数指定的安装路径为准。
- 若未使用--install-path=path参数,则安装到ASCEND_HOME_PATH环境变量指定的安装路径。
- 若未使用--install-path=path参数和ASCEND_HOME_PATH环境变量,则使用默认安装路径:非root用户场景下,默认安装路径为$HOME/Ascend;root用户默认为/usr/local/Ascend。
--install-path参数说明请参见软件包支持参数。
- 切换到amct/third_party目录,使用AMCT安装用户执行如下命令进行安装:
./Ascend-nca-{software version}-{os.arch}.run --full安装参数说明请参见软件包支持参数,若出现如下关键信息则说明安装成功:
[INFO]: Nca package installed successfully!
- 软件包默认安装路径:
- root用户:/usr/local/Ascend
- 非root用户:$HOME/Ascend
- 安装详细日志路径:
- root用户:/var/log/ascend_seclog/ascend_install.log
- 非root用户:$HOME/var/log/ascend_seclog/ascend_install.log
- 安装后软件包的安装路径、安装模式以及运行用户信息记录路径:${INSTALL_DIR}/<version>/tools/nca/ascend_install.info,其中
${INSTALL_DIR}为软件包的安装路径,<version>表示软件包具体版本号。
- 软件包默认安装路径:
- (可选)设置软件包安装路径。
- 环境变量设置
上述环境搭建好后,在执行性能自动量化之前,请设置如下环境变量(如下环境变量中${INSTALL_DIR}以软件包使用默认安装路径为例进行说明):
source ${INSTALL_DIR}/bin/setenv.bash
接口调用流程
在进行基于性能的自动量化之前,请确保:
- 板端环境能正常进行推理。
- NCA-NCS环境已经搭建好,且NCS服务已经启动,详情请参见环境部署。
接口调用流程如图3所示。
主流程如下:
- 用户根据原始模型,调用create_quant_config、quantize_model、save_model等接口,得到量化模型。
该步骤可以获取量化配置文件(量化模型的可量化层信息),以及对应的量化信息quant_info(量化因子、参数shape、量化辅助层)。
- 用户参见性能采样配置文件编写性能采样配置文件,设置上板运行的相关参数(例如:soc_version、distribute_config)。
- 调用perf_based_auto_calibration接口输出性能最优的模型:
- 获取1中量化模型中的量化信息quant_info,该文件包含量化因子、参数shape、量化辅助层,若该文件中量化层的输入channel数<=16,且为Conv2D类型的算子,则不进行量化,得到回退的先验知识信息。
- 上板运行原始模型(记为fp.om)和量化模型(记为int8.om),得到原始模型和量化模型的性能数据。
- 调用ATC工具将fp.om和int8.om分别转成JSON文件(算子映射文件),根据算子映射文件,匹配原始模型以及量化的算子,得到算子量化前后的性能对比数据。
- 先根据量化信息quant_info中满足先验知识信息的层进行回退(量化层的输入channel数<=16,且为Conv2D类型的算子),然后根据3.c算子量化前后的性能比对数据,调用perf_based_auto_calibration中的量化策略strategy模块,生成量化回退策略,根据回退策略生成新的量化配置文件(存储在tmp目录),生成第一次混合精度模型。
- 上板运行混合精度模型,匹配第一次混合精度模型与原始模型的性能对比数据。
- 根据第一次混合模型与原始模型的对比数据和量化模型与原始模型的对比数据,生成回退策略,根据回退策略再次生成新的量化配置文件(存储在tmp目录),生成第二次混合精度模型。
- 上板运行第二次混合精度模型,结合第一次混合精度模型、量化模型、原始模型,输出整网性能最优的模型。
详细流程如图4所示。
调用示例
本示例演示了如何根据原始模型和整网量化模型,调用基于性能的自动量化接口,生成性能最优的混合精度模型的过程。
- 如下示例标有“由用户补充处理”的步骤,需要用户根据自己的模型和数据集进行补充处理,示例中仅为示例代码。
- 如下示例调用AMCT的部分,函数入参请根据实际情况进行调整。
- 导入AMCT包,设置日志级别。
1 2
import amct_tensorflow as amct amct.set_logging_level(print_level='info', save_level='info')
- (可选,由用户补充处理)建议使用原始待量化的模型和测试集,在TensorFlow环境下推理,验证环境、推理脚本是否正常。
推荐执行该步骤,以确保原始模型可以完成推理且精度正常;执行该步骤时,可以使用部分测试集,减少运行时间。
1user_do_inference(ori_model, test_data)
- (由用户补充处理)使用原始待量化的模型和测试集,在TensorFlow环境下执行量化过程,生成整网量化的模型。
1quant_model_file = user_do_calibration(ori_model, test_data)
- 调用基于性能的自动量化工具,输出性能最优的模型。
1 2 3 4 5 6 7 8
outputs = model_outputs sampler_config_file = './sampler_config_file.cfg' save_dir = './result/user_model' amct.perf_based_auto_calibration(original_model_file=ori_model, quantized_model_file=quant_model_file, outputs=outputs, sampler_config_file=sampler_config_file, save_dir=save_dir)
其中:./sampler_config_file.cfg示例如下,该文件各字段详细解释请参见性能采样配置文件。
ascend_sampler_config: { soc_version: Ascend610 input_shape: "input:32,224,224,3" distribute_config:{ ip:'xx.xx.xx.xx' port:'8000' } log: null atc: { options: [ {key: "input_format", value: "NHWC"}, {key: "mode", value: "1"} ] } } - (可选,由用户补充处理)用量化后模型user_model_quantized.pb和测试集,在TensorFlow环境下推理,测试量化后的仿真模型精度。
使用量化后仿真模型精度与2中的原始精度做对比,可以观察量化对精度的影响。
1 2
quant_model = './results/user_model_quantized.pb' user_do_inference(quant_model, test_data)

