Label-Free模式(以post_training_quant接口为例)
本节将以模型静态shape和动态shape两种场景分别介绍量化配置步骤,其中静态shape模型以ResNet50为例,动态shape模型以YoloV5m为例,指导用户调用Python API接口对模型进行Label-Free模式的识别和量化,并将量化后的模型保存为.onnx文件,量化后的模型可以在推理服务器上运行。
本章节示例调用post_training_quant接口进行Label-Free量化配置,若用户需自行配置精度保持策略,可以调用squant_ptq接口进行Label-Free量化,参考Data-Free模式(以squant_ptq接口为例)的配置步骤并注意修改quant_mode和calib_data参数。
前提条件
- 已参考环境准备,完成CANN开发环境的部署及Python环境变量配置。
- 训练后量化前须执行命令安装依赖。
如下命令如果使用非root用户安装,需要在安装命令后加上--user,例如:pip3 install onnx --user。
pip3 install onnx==1.13.0 pip3 install onnxruntime==1.14.1
功能实现流程
用户需准备好onnx模型和数据集,调用post_training_quant接口生成量化配置脚本,运行脚本输出量化后的onnx模型,并自行转换后进行推理。
关键步骤说明如下:
图1 post_training_quant接口功能实现流程
- 用户准备onnx原始模型和数据集,使用QuantConfig配置量化参数,可基于静态shape和动态shape场景进行自定义配置,关于矫正数据的输入,可以参考数据预处理提供的两种方式进行配置。
- 调用run_quantize保存量化后的模型。
- 模型转换。
静态shape模型量化步骤(以ResNet50为例)
- 本样例以ResNet50为例,参考README中“准备数据集”章节获取ImageNet数据集即可,无需预处理,同时参考“模型推理”章节导出onnx文件。
- 新建模型量化脚本resnet50_quant.py,编辑resnet50_quant.py文件,导入如下样例代码。
from modelslim.onnx.post_training_quant import QuantConfig, run_quantize # 导入post_training_quant量化接口 from modelslim.onnx.post_training_quant.label_free.preprocess_func import preprocess_func_imagenet # 导入预置的ImageNet数据集预处理函数preprocess_func_imagenet from modelslim import set_logger_level # 可选,导入日志配置接口 set_logger_level("info") # 可选,调整日志输出等级,配置为info时,启动量化任务后将打屏显示量化调优的日志信息 # 用户需要自行准备一小批矫正数据集,读取数据集进行数据预处理,并将数据存入calib_data def custom_read_data(): calib_data = preprocess_func_imagenet("./data_path/") # 调用数据集预处理函数,请根据数据集实际路径配置,不使用该预处理函数时请参考数据预处理自行配置 return calib_data calib_data = custom_read_data() quant_config = QuantConfig(calib_data = calib_data, amp_num = 5) # 使用QuantConfig接口,配置量化参数,返回量化配置实例 input_model_path = "./resnet50_official.onnx" # 配置待量化模型的输入路径,请根据实际路径配置 output_model_path = "./resnet50_official_quant.onnx" # 配置量化后模型的名称及输出路径,请根据实际路径配置 run_quantize(input_model_path,output_model_path,quant_config) # 使用run_quantize接口执行量化,配置待量化模型和量化后模型的路径及名称,
- 启动模型量化调优任务,并在指定的输出目录获取一个量化完成的模型。
python3 resnet50_quant.py
- 量化后的ONNX模型可参考README中“模型推理”章节,将ONNX模型转换为OM模型,并进行精度验证。
动态shape模型量化步骤(以YoloV5m为例)
- 本样例以YoloV5m为例,参考对应README中“模型推理”章节,导出动态shape的onnx文件。
- 新建模型的量化脚本yolov5m_quant.py,编辑yolov5m_quant.py文件,导入如下样例代码。
from modelslim.onnx.post_training_quant import QuantConfig, run_quantize # 导入post_training_quant量化接口 from modelslim import set_logger_level # 可选,导入日志配置接口 set_logger_level("info") # 可选,调整日志输出等级,配置为info时,启动量化任务后将打屏显示量化调优的日志信息 # 用户需要自行准备一小批矫正数据集,读取数据集进行数据预处理,并将数据存入calib_data,当前配置示例为空时,将随机生成矫正数据 def custom_read_data(): calib_data = [] # 可读取数据集,进行数据预处理,将数据存入calib_data return calib_data calib_data = custom_read_data() quant_config = QuantConfig(calib_data = calib_data, amp_num = 5, is_dynamic_shape = True, input_shape = [[1,3,640,640]]) # 使用QuantConfig接口,配置量化参数,返回量化配置实例,当前示例中is_dynamic_shape和input_shape参数在动态shape场景下必须配置。 input_model_path = "./yolov5m.onnx" # 配置待量化模型的输入路径,请根据实际路径配置 output_model_path = "./yolov5m_quant.onnx" # 配置量化后模型的名称及输出路径,请根据实际路径配置 run_quantize(input_model_path,output_model_path,quant_config) # 使用run_quantize接口执行量化,配置待量化模型和量化后模型的路径及名称,
- 启动模型量化调优任务,并在指定的输出目录获取一个量化完成的模型。
python3 yolov5m_quant.py
- 量化后的ONNX模型可参考README中“模型推理”章节,将ONNX模型转换为OM模型,并进行精度验证。
数据预处理
post_training_quant接口进行Label-Free量化配置时,用户需要自行准备一小批矫正数据集,读取数据集进行数据预处理,并返回预处理后的矫正数据以用于量化。现支持通过ModelSlim工具预置的数据集预处理函数和自行准备矫正数据两种方式:
- 方式一:ModelSlim工具预置preprocess_func_imagenet和preprocess_func_coco函数,对ImageNet和COCO数据集进行预处理,请参见接口对应的调用示例进行配置。
- 方式二:自行准备矫正数据集,并返回矫正数据用于量化配置,配置要求请参见QuantConfig的calib_data参数,以输入单张图片为例进行配置:
import cv2 import numpy as np import pandas as pd … calib_data = [] image = cv2.imdecode(np.fromfile("./random_image.jpg", dtype=np.uint8), 1) #请以数据集实际路径进行配置 image = cv2.resize(image, (640, 640), interpolation=cv2.INTER_CUBIC) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = torch.from_numpy(image).permute(2, 0, 1) / 255 image = image.unsqueeze(0) calib_data.append([np.array(image)])
父主题: 训练后量化(ONNX)