本节将以ResNet50为例,指导用户调用Python API接口对模型进行Data-Free模式的识别和量化,并将量化后的模型保存为.onnx文件,量化后的模型可以在推理服务器上运行。
如下命令如果使用非root用户安装,需要在安装命令后加上--user,例如:pip3 install onnx --user。
pip3 install numpy #需大于等于1.21.0版本 pip3 install onnx #需大于等于1.11.0版本 pip3 install onnxruntime #需大于等于1.12.1版本 pip3 install torch==1.11.0 #支持1.8.1和1.11.0,须为CPU版本的torch pip3 install onnx-simplifier #需大于等于0.3.10版本
from modelslim.onnx.squant_ptq import OnnxCalibrator, QuantConfig
from modelslim import set_logger_level set_logger_level("info") #根据实际情况配置
config = QuantConfig()
input_model_path="/home/xxx/ResNet50/resnet50_official.onnx" #根据实际路径配置 output_model_path="/home/xxx/ResNet50/resnet50_official_quant.onnx" #根据实际情况配置
calib = OnnxCalibrator(input_model_path, config) # calib_data可选,可参考精度保持策略的方式三输入真实的数据 calib.run() # 进行量化 calib.export_quant_onnx(output_model_path) # 导出量化后模型
python3 resnet50_quant.py
为了进一步降低量化精度损失,Data-Free模式下集成了多种精度保持方式,具体如下:
方式一(推荐):如果量化精度不达标,可使用精度保持策略来恢复精度。工具内集成了多种精度保持策略,对权重的量化参数和取证方式进行优化,可在keep_acc参数中配置三种优化策略恢复精度。当sigma参数配置为0时,即开启activation min-max量化,不建议同时使用keep_acc参数配置的优化策略。
方式二:为保证精度,模型分类层和输入层不推荐量化,可在disable_names中配置分类层和输入层名称。
方式三:若使用虚拟数据在Data-Free量化后的精度不达标,可以输入随机真实数据进行量化。比如输入其他数据集的一张图片或一条语句来当随机数据,由于真实数据的数据分布更优,精度也会有所提升。以输入一张真实图片为例,可参考如下代码对数据进行预处理,在量化步骤中作为calib_data传入。
def get_calib_data(): import cv2 import numpy as np img = cv2.imread('/xxx/cat.jpg') img_data = cv2.resize(img, (224, 224)) img_data = img_data[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) img_data /= 255. img_data = np.expand_dims(img_data, axis=0) return [[img_data]]