openvino int8

记录openvino INT8部署流程

参考: https://docs.openvinotoolkit.org/cn/latest/pot_docs_LowPrecisionOptimizationGuide.html
从openvino官方得知,int8量化分两步:

  1. 训练后量化
  2. 量化感知训练(如果量化后的模型精度不够则需要该步)
    另外,写c++代码的时候需要注意: FP32的模型输入和输出都是FP32,INT8的模型输入是U8输出是FP32。

openvino IR 模型生成

python3 mo_onnx.py -m /home/cc/data/cc/work_git/yolov5/last.onnx -o /home/cc/data/cc/work_git/yolov5/last_scale --scale_values input[255,255,255] --reverse_input_channels 

注意: 为了后续的量化作准备,因为量化的openvino IR的输入是(unsigned char)或(char)格式,所以均值和方差应该在输出openvino的中间表达文件上完成

参数使用参考 /opt/intel/openvino/deployment_tools/model_optimizer/mo/utils/cli_parser.py 的函数 get_common_cli_parser
常用参数说明:

  • -m onnx_path (设置onnx模型路径,onnx_path 为模型路径)
  • -o output_path (设置输出IR的路径,output_path 为保存IR的路径)
  • --scale_values name[channel1_value,channel2_value,channel3_value] (设置方差,其中 name 为输入层的名字,channel1_value为第一个通道的值)
  • --mean_values name[channel1_value,channel2_value,channel3_value] (设置均值)
  • --reverse_input_channels (交换颜色通道,交换通道之前先做减均值和除方差)

量化

openvino主要通过 POT 工具进行量化。POT 安装参考:https://docs.openvinotoolkit.org/cn/latest/pot_InstallationGuide.html
(如果使用的是官方提供的 openvino-dev的docker镜像进行开发,则不需要另外准备POT环境)

POT 环境准备

  • 通过 PyPI 安装 POT
conda create -n openvino_pot python=3.6 # 准备 conda环境,不想使用 conda环境的可以省略
conda activate openvino_pot # 激活conda环境,不想使用 conda环境的可以省略
pip3 install openvino -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com # 目前最新版本是 2021.4.1的版本
pip3 install openvino-dev -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com 
cd <INSTALL_DIR>/deployment_tools/model_optimizer/install_prerequisites && sudo ./install_prerequisites.sh # 安装模型优化工具的依赖
cd <INSTALL_DIR>/deployment_tools/open_model_zoo/tools/accuracy_checker && python3 setup.py install # 安装精度检查器
  • 从openvino 工具套件包中安装 POT
cd <INSTALL_DIR>/deployment_tools/tools/post_training_optimization_toolkit
python3 setup.py install --install-extras 
cd <INSTALL_DIR>/deployment_tools/open_model_zoo/tools/accuracy_checker && python3 setup.py install # 安装精度检查器

POT 量化

POT 量化有几种方式:

  • 命令行(如果是openvino ZOO中的模型并且能使用精度检查器工具,推荐使用该方法,如果只有数据集没有验证集的情况下也可以使用该方法,可以参考官方问题解答)
  • Python API
  • DL Workbench(基于Web 的图形环境)

下面的量化流程中使用的模型是我自己准备的yolov5的onnx模型

命令行

我序列化出来的yolov5与官方的不一样,所以我就只尝试简易模式的量化(DefaultQuantization),另外因为后处理与官方的不一样所以验证精度也就没有必要了,我量化就只提供数据集不提供验证集。
POT命令行配置官方示例
还可以参考其他大佬的博客: https://blog.csdn.net/sandmangu/article/details/120331202

  1. 准备精度检查器配置文件(因为我没有测试验证精度,下面的配置文件仅供参考)
    如何配置yaml 可以参考官方文档(yaml里面最好不要有中文,注释也不行,否则有可能出现编码相关的错误)
models:
  - name: yolov5-onnx
    # https://docs.openvinotoolkit.org/cn/latest/omz_tools_accuracy_checker_dlsdk_launcher.html
    launchers:
      - framework: dlsdk
        onnx_model: ./last.onnx
        device: CPU
        adapter: classification
        adapter: classification
          outputs:
            - Reshape_149
            - Reshape_156
            - Reshape_163
 
    datasets:
      - name: shiguan_dataset
        data_source: ./shiguan_images
        # annotation_conversion:
        #   converter: imagenet
        #   annotation_file: ./ImageNet/val.txt
        reader: opencv_imread

        # https://docs.openvinotoolkit.org/cn/latest/omz_tools_accuracy_checker_preprocessor.html
        preprocessing:
          - type: resize
            resize_realization: opencv # 默认opencv 
            dst_width: 416 # 目标宽
            dst_height: 416
            interpolation: Linear # 缩放的插值方式
            aspect_ratio_scale: Fit_to_window # 宽高比

          # - type: normalization # 归一化
          #   std: [255,255,255]
          #   images_only: False # 只对图像进行预处理 默认是False
          #   use_pillow: True
          # - type: bgr_to_rgb # bgr转rgb
          - type: padding # 图像填充
            pad_type: center # 默认是居中,yolov5也正好是居中
            pad_value: 114
            stride: 1 # 步长
 
        # https://docs.openvinotoolkit.org/cn/latest/omz_tools_accuracy_checker_metrics.html
        # metrics:
        #   - name: accuracy@top1
        #     type: accuracy
        #     top_k: 1
 
        #   - name: accuracy@top5
        #     type: accuracy
        #     top_k: 5

  1. 准备量化的配置文件
{
    "model": {
        "model_name": "yolov5-onnx",
        "model": "./last_scale/last.xml",
        "weights": "./last_scale/last.bin",
    },
    "engine": {
        "type": "simplified",
        "data_source": "shiguan_images",
        "config": "./yolov5_onnx.yaml"
    },
    "compression": {
        "algorithms": [
            {
                "target_device": "CPU",
                "name": "DefaultQuantization",
                "params": {
                    // "preset": "mixed",
                    "preset": "performance",
                    "stat_subset_size": 160
                }
            }
        ]
    }
}
  1. pot指令 量化
pot -c yolov5_onnx_int8.json

PYTHON API

https://docs.openvinotoolkit.org/cn/latest/pot_compression_api_README.html
后续有时间尝试

OPENVINO 深度学习工作台

https://docs.openvinotoolkit.org/cn/latest/workbench_docs_Workbench_DG_Introduction.html
后续有时间尝试

posted @ 2021-10-21 18:05  cc96  阅读(748)  评论(0编辑  收藏  举报