openvino int8
记录openvino INT8部署流程
参考: https://docs.openvinotoolkit.org/cn/latest/pot_docs_LowPrecisionOptimizationGuide.html
从openvino官方得知,int8量化分两步:
- 训练后量化
- 量化感知训练(如果量化后的模型精度不够则需要该步)
另外,写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
- 准备精度检查器配置文件(因为我没有测试验证精度,下面的配置文件仅供参考)
如何配置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
- 准备量化的配置文件
{
"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
}
}
]
}
}
- 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
后续有时间尝试