Data-Free模式(以squant_ptq接口为例)(无需校准数据集)

本节将以模型静态shape、动态shape、图优化场景分别介绍量化配置步骤,指导用户调用Python API接口对模型进行Data-Free模式的识别和量化,并将量化后的模型保存为.onnx文件,量化后的模型可以在推理服务器上运行。

功能实现流程

用户需准备好onnx模型,调用squant_ptq接口生成量化配置脚本,运行脚本输出量化后的onnx模型,并自行转换后进行推理。

图1 squant_ptq接口功能实现流程

关键步骤说明如下:

  1. 用户准备onnx原始模型,使用QuantConfig配置量化参数,可基于如下场景进行配置。
    • 静态/动态shape模型量化:用户基于量化要求进行配置,可以根据实际情况配置精度保持策略。动态shape场景下,需要手动开启is_dynamic_shape参数,并配置模型的input_shape
    • 图优化:针对静态shape模型,量化工具内置了多种图结构优化方法,支持对浮点模型和量化后模型进行图优化。使用graph_optimize_level参数开启并指定图优化级别,并支持通过shut_down_structures参数指定需关闭优化的图结构。同时,在图优化过程中需要将onnx模型转换为om模型,用户可以通过om_method参数指定转换工具。
  2. 根据onnx模型和调用OnnxCalibrator封装量化算法,可以根据模型量化情况配置精度保持策略
  3. 初始化OnnxCalibrator后通过run ()函数执行量化。
  4. 调用export_quant_onnx保存量化后的模型。
  5. 模型转换。

    参考ATC工具使用指南或使用其他转换工具,将onnx模型转换为OM模型,并进行推理。

前提条件

静态shape模型量化步骤(以ResNet50为例)

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

    from msmodelslim.onnx.squant_ptq import OnnxCalibrator, QuantConfig  # 导入squant_ptq量化接口
    from msmodelslim import set_logger_level  # 可选,导入日志配置接口
    set_logger_level("info")  # 可选,调整日志输出等级,配置为info时,启动量化任务后将打屏显示量化调优的日志信息
    
    config = QuantConfig()   # 使用QuantConfig接口,配置量化参数,并返回量化配置实例,当前示例使用默认配置
    input_model_path = "./resnet50_official.onnx"  # 配置待量化模型的输入路径,请根据实际路径配置
    output_model_path = "./resnet50_official_quant.onnx"  # 配置量化后模型的名称及输出路径,请根据实际路径配置
    calib = OnnxCalibrator(input_model_path, config)   # 使用OnnxCalibrator接口,输入待量化模型路径,量化配置数据,生成calib量化任务实例,其中calib_data为可选配置,可参考精度保持策略的方式三输入真实的数据
    calib.run()   # 执行量化
    calib.export_quant_onnx(output_model_path)  # 导出量化后模型

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

    python3 resnet50_quant.py

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

动态shape模型量化步骤(以YoloV5m为例)

  1. 用户需自行准备模型。以YoloV5m为例,可参考对应README中“模型推理”章节,获取6.1版本YoloV5m模型的权重文件后,并配置模型推理方式为nms_script,导出动态shape的onnx文件,导出命令参考如下:

    bash pth2onnx.sh --tag 6.1 --model yolov5m --nms_mode nms_script

  2. 新建模型的量化脚本yolov5m_quant.py,编辑yolov5m_quant.py文件,导入如下样例代码。

    from msmodelslim.onnx.squant_ptq import OnnxCalibrator, QuantConfig  # 导入squant_ptq量化接口
    from msmodelslim import set_logger_level  # 可选,导入日志配置接口
    set_logger_level("info")  # 可选,调整日志输出等级,配置为info时,启动量化任务后将打屏显示量化调优的日志信息
    
    config = QuantConfig(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"  # 配置量化后模型的名称及输出路径,请根据实际路径配置
    calib = OnnxCalibrator(input_model_path, config)   # 使用OnnxCalibrator接口,输入待量化模型路径,量化配置数据,生成calib量化任务实例,其中calib_data为可选配置,可参考精度保持策略的方式三输入真实的数据
    calib.run()   # 执行量化
    calib.export_quant_onnx(output_model_path)  # 导出量化后模型

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

    python3 yolov5m_quant.py

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

精度保持策略

为了进一步降低量化精度损失,Data-Free模式下集成了多种精度保持方式,具体如下: