Label-Free模式

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

前提条件

操作步骤

  1. 本样例以ResNet50为例,参考README中“准备数据集”章节获取ImageNet数据集即可,无需预处理,同时参考“模型推理”章节导出onnx文件。
  2. 新建模型量化脚本resnet50_quant.py,编辑resnet50_quant.py文件,新增如下代码导入接口。

    from modelslim.onnx.post_training_quant import QuantConfig, run_quantize
    from modelslim.onnx.post_training_quant.label_free.preprocess_func import preprocess_func_imagenet

    ModelSlim工具预置了ImageNet数据集预处理函数preprocess_func_imagenet,和coco数据集预处理函数preprocess_func_coco,导入后可直接调用函数进行预处理,其他模型所需数据集请自行预处理并参考4调用。

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

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

    若打屏显示出现如下提示时,用户无需处理。

    WARNING:root:Please use QuantFormat.QDQ for activation type QInt8 and weight type QInt8. Or it will lead to bad performance on x64.

  4. 用户需要自行准备一小批矫正数据集,读取数据集进行数据预处理,并将数据存入calib_data。

    • ResNet50模型参考以下示例调用数据集预处理函数并返回矫正数据。
      def custom_read_data():
          calib_data = preprocess_func_imagenet("/home/xxx/data_path/")    #根据数据集实际路径配置
          return calib_data
      calib_data = custom_read_data()
    • 其他模型若不调用数据集预处理函数,可参考以下示例返回矫正数据,calib_data请参考QuantConfig进行配置。
      def custom_read_data():
          calib_data = []
          # TODO 读取数据集,进行数据预处理,将数据存入calib_data
          return calib_data
      calib_data = custom_read_data()  

  5. 使用QuantConfig接口,配置量化参数,生成量化配置实例,请参考QuantConfig进行配置。

    quant_config = QuantConfig(calib_data = calib_data, amp_num = 5)

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

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

  7. 使用run_quantize接口,配置待量化模型和量化后模型的路径及名称,请参考run_quantize进行配置。

    run_quantize(input_model_path,output_model_path,quant_config)

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

    python3 resnet50_quant.py

  9. 量化后的ONNX模型可参考README中“模型推理章节”,将ONNX模型转换为OM模型,并进行精度验证。