Data-Free模式

本节将以ResNet50为例,指导用户调用Python API接口对模型进行Data-Free模式的识别和量化,并将量化后的模型保存为.onnx文件,量化后的模型可以在推理服务器上运行。

前提条件

操作步骤

  1. 用户需自行准备模型,本样例以ResNet50为例,参考对应README中“模型推理”章节,导出onnx文件。
  2. 新建模型的量化脚本resnet50_quant.py,编辑resnet50_quant.py文件,新增如下代码导入接口。

    from modelslim.onnx.squant_ptq import OnnxCalibrator, QuantConfig

  3. 调整日志输出等级,启动调优任务后,将打屏显示量化调优的日志信息。

    from modelslim import set_logger_level
    set_logger_level("info")        #根据实际情况配置

  4. 使用QuantConfig接口,配置量化参数,生成量化配置实例,请参考QuantConfig进行配置,当前示例使用默认配置。

    config = QuantConfig()

  5. 配置待量化模型的输入路径、量化后模型的名称及输出路径。

    input_model_path="/home/xxx/ResNet50/resnet50_official.onnx"   #根据实际路径配置
    output_model_path="/home/xxx/ResNet50/resnet50_official_quant.onnx"    #根据实际情况配置

  6. 使用OnnxCalibrator接口,输入待量化模型路径,量化配置数据,生成calib量化任务实例,然后调用run ()export_quant_onnx接口,分别进行量化和导出量化后的模型。

    calib = OnnxCalibrator(input_model_path, config)     # calib_data可选,可参考精度保持策略的方式三输入真实的数据
    calib.run() # 进行量化
    calib.export_quant_onnx(output_model_path) # 导出量化后模型

  7. 启动模型量化调优任务,并在5指定的输出目录获取一个量化完成的模型。

    python3 resnet50_quant.py

  8. 量化后的ONNX模型可参考README中“模型推理章节”,将ONNX模型转换为OM模型,并进行精度验证。若精度损失超过预期,可参考精度保持策略减少精度损失。

精度保持策略

为了进一步降低量化精度损失,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]]