下载
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
昇腾小AI

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_modecalib_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接口功能实现流程
  1. 用户准备onnx原始模型和数据集,使用QuantConfig配置量化参数,可基于静态shape和动态shape场景进行自定义配置,关于矫正数据的输入,可以参考数据预处理提供的两种方式进行配置。
  2. 调用run_quantize保存量化后的模型。
  3. 模型转换。

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

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

  1. 本样例以ResNet50为例,参考README中“准备数据集”章节获取ImageNet数据集即可,无需预处理,同时参考“模型推理”章节导出onnx文件。
  2. 新建模型量化脚本resnet50_quant.py,编辑resnet50_quant.py文件,导入如下样例代码。
    from msmodelslim.onnx.post_training_quant import QuantConfig, run_quantize  # 导入post_training_quant量化接口
    from msmodelslim.onnx.post_training_quant.label_free.preprocess_func import preprocess_func_imagenet  # 导入预置的ImageNet数据集预处理函数preprocess_func_imagenet
    from msmodelslim 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接口执行量化,配置待量化模型和量化后模型的路径及名称,
  3. 启动模型量化调优任务,并在指定的输出目录获取一个量化完成的模型。
    python3 resnet50_quant.py
  4. 量化后的ONNX模型可参考README中“模型推理”章节,将ONNX模型转换为OM模型,并进行精度验证。

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

  1. 本样例以YoloV5m为例,参考对应README中“模型推理”章节,导出动态shape的onnx文件。
  2. 新建模型的量化脚本yolov5m_quant.py,编辑yolov5m_quant.py文件,导入如下样例代码。
    from msmodelslim.onnx.post_training_quant import QuantConfig, run_quantize  # 导入post_training_quant量化接口
    from msmodelslim 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接口执行量化,配置待量化模型和量化后模型的路径及名称,
  3. 启动模型量化调优任务,并在指定的输出目录获取一个量化完成的模型。
    python3 yolov5m_quant.py
  4. 量化后的ONNX模型可参考README中“模型推理”章节,将ONNX模型转换为OM模型,并进行精度验证。

数据预处理

post_training_quant接口进行Label-Free量化配置时,用户需要自行准备一小批矫正数据集,读取数据集进行数据预处理,并返回预处理后的矫正数据以用于量化。现支持通过msModelSlim工具预置的数据集预处理函数和自行准备矫正数据两种方式:

  • 方式一:msModelSlim工具预置preprocess_func_imagenetpreprocess_func_coco函数,对ImageNet和COCO数据集进行预处理,请参见接口对应的调用示例进行配置。
  • 方式二:自行准备矫正数据集,并返回矫正数据用于量化配置,配置要求请参见QuantConfig的calib_data参数,以输入单张图片为例进行配置:
    import cv2
    import numpy as np
    import torch 
    import torch_npu   # 若需要cpu上进行量化,可忽略此步骤
    …
    
    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)])
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词