接下来试试超分的INT8量化, 还是拿waifu2x模型来试验
首先毫无意外的掉进坑里了... ...
本来系统里已经装好了OpenVINO 2021r2, 想直接从这个版本开始,先安装accuracy_checker和pot的最新版本
到openvino_2021\deployment_tools\open_model_zoo\tools\accuracy_checker目录下运行
python setup.py install
安装成功,
再到openvino_2021\deployment_tools\tools\post_training_optimization_toolkit的目录下运行相同的安装命令,结果安装失败了,报有个ideep4py的库找不到,看了下openvino_2021\deployment_tools\tools\post_training_optimization_toolkit\setup.py, 看到这么一段
INSTALL_REQUIRES = ['scipy==1.2.1',
'jstyleson==0.0.2',
'numpy==1.16.3',
'pandas==0.24.2',
'hyperopt==0.1.2',
'addict==2.2.1',
'chainer==7.7.0',
'ideep4py==2.0.0.post3']
再上这个库的源上看了一眼https://pypi.org/simple/ideep4py/,发现这货根本就没有windows包。难道要我再装个linux版?
万般无奈之际发现我的2020r3是好的,只好一个版本一个版本的回滚,发现OV2021r1的pot安装是不依赖这个ideep4py的
出坑的方法就是: 目前做8bit量化要用OV2021r1,不用OV2021r2!!! 开源项目就这样,等OV2021r3出来以后再看看这个bug有没有解决吧
开始正式转INT8模型
1. accuracy_checker
先搞定精度检测,因为pot转换的时候也需要这个工具来对比原始模型和转换后的int8模型的推理精度。
主要的思路来源于这篇文章 OpenVINO 2020的INT8转换工具POT的初体验 因为OpenVINO在open model zoo里带的超分模型single-image-super-resolution-1032是有int8模型的,所以可以参考openvino_2021\deployment_tools\open_model_zoo\tools\accuracy_checker\configs\single-image-super-resolution-1032.yml的写法,自己编一个出来
先写配置文件waifu_FP32_ac_ov2021.yml
models:
- name: waifu2x
launchers:
- framework: dlsdk
model: noise0_scale2x_model_FP32.xml
weights: noise0_scale2x_model_FP32.bin
adapter:
type: super_resolution
reverse_channels: True
datasets:
- name: super_resolution_x2
data_source: dataset
annotation_conversion:
converter: super_resolution
data_dir: dataset
lr_suffix: lr_
hr_suffix: hr_
annotation: super_resolution_x2.pickle
preprocessing:
- type: auto_resize
postprocessing:
- type: resize
apply_to: prediction
metrics:
- type: psnr
scale_border: 4
presenter: print_vector
#- type: ssim
# presenter: print_vector
这里各个数据段的含义就不解释了,可以参考官方文档 https://docs.openvinotoolkit.org/latest/omz_tools_accuracy_checker_accuracy_checker_adapters_README.html
接下来做个数据集
在放waifu_FP32_ac.yml的目录下新建个目录dataset 这个名字对应yml文件里的datasets段里面的定义
datasets:
- name: super_resolution_x2
#data_source填存放数据集的目录
data_source: dataset
annotation_conversion:
converter: super_resolution
#data_dir填存放数据集的目录
data_dir: dataset
#lr_suffix, hr_suffix放图片的前缀,这里是告诉accuracy_checker, 低分辨率的图片是按照lr_1.png, lr_2.png... 高分辨率图片是按照hr_1.png hr_2.png... 来命名的
lr_suffix: lr_
hr_suffix: hr_
annotation: super_resolution_x2.pickle
制作测试图片集,我的waifu2x模型通过MO转IR的时候定义了input_shape为[640x480], 所以转换的低分辨率图片分辨率为[640x480], 高分辨率图片分辨率为2x,即[1280x960],因为没有原始训练的数据集,只是随便测测,所以只随便找了20张图片转换出了20组
运行
accuracy_check -c waifu_FP32_ac_ov2021.yml -s ./ -td GPU
输出
PSNR很差,有很多可能,也许是我的数据集不是原始训练集,也可能是我做数据集的时候的缩放顺序不对,或者HR图像的分辨率不对,再或者是yml的某个字段填错了。不过无所谓,至少说明accuracy checker能正常工作了 :)
2. POT
AC工作正常了,POT的json配置文件也可以照着相同的思路来一遍,这里我用了最简单的默认量化算法
{
/* Model parameters */
"model": {
"model_name": "noise0_scale2x_model_FP32", // Model name
"model": "noise0_scale2x_model_FP32.xml", // Path to model (.xml format)
"weights": "noise0_scale2x_model_FP32.bin" // Path to weights (.bin format)
},
/* Parameters of the engine used for model inference */
"engine": {
"config": "waifu_FP32_ac_ov2021.yml"
},
/* Optimization hyperparameters */
"compression": {
"target_device": "GPU", // Target device, the specificity of which will be taken
// into account during optimization
"algorithms": [
{
"name": "DefaultQuantization", // Optimization algorithm name
"params": {
"preset": "performance", // Preset [performance, mixed, accuracy] which control the quantization
// mode (symmetric, mixed (weights symmetric and activations asymmetric)
// and fully asymmetric respectively)
"stat_subset_size": 20 // Size of subset to calculate activations statistics that can be used
// for quantization parameters calculation
}
}
]
}
}
运行命令
pot -c waifu_simplified_mode_ov2021.json
一通CPU风扇狂转之后终于有了结果 (这里手工改了文件名,原来转出来的文件和原模型文件名一样)
用ac检查一下INT8模型的精度
processed in 24.956 seconds
psnr@mean: 13.60Db
psnr@std: 2.99Db
PSNR有下降,不过PSNR并不能表示图像画质,还是要用人眼的主观画质评测来打分,这个是玄学 :P
3. Bicubic, FP16 SR, INT8 SR 2X画质对比
祭出OpenVINO 2021r2 C++ 超分辨率重建 Waifu2x里面用到的SR转换程序,改一下模型的名字,得到3种模式的输出
原始图片(测试图片来自网络)
Bicubic的2x放大效果
Waifu2x 2X FP16 精度放大的效果
Waifu2x 2X INT8 精度放大的效果
和FP16的模型输出做比对,第一眼没有什么特别明显的差别
4. 性能分析
最后看一下性能
前一篇文章, Waifu2X FP16的模型
调用inferRequest_regular.Infer()推理的时间, 在8665U 4核8线程的CPU和 Gen9 24EU的核显上
CPU: 1341ms (0.746FPS)
GPU: 685ms (1.46FPS)
这次在相同的配置下, Waifu2X INT8模型
CPU: 957ms (1.04FPS)
GPU: 1228ms (0.81FPS)
基本符合预期,CPU方面可以通过INT8模型来提升性能, GPU方面因为Gen9不支持INT8计算,所以加载的int8模型会转换成FP32模型来计算,自然性能不如FP16的模型
再借来台其他同学的老虎湖(Tiger Lake 1165G7)来试试Gen12 96EU的显卡 :)
INT8模型 GPU: 154ms (6.49FPS)
FP16模型 GPU: 175.38ms (5.7FPS)
Gen12集显的性能提升还是很明显的,
Gen12 FP16 VS. Gen9 FP16模型
5.7/1.46=3.9X
Gen12 INT8 VS. Gen12 FP16 模型
6..49/5.7=1.14X
最后代码奉上,仅供参考
https://gitee.com/tisandman/pot_waifu2x_ov2021
————————————————
版权声明:本文为CSDN博主「sandmangu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sandmangu/article/details/114632220