什么是POT工具?
POT工具,全称:Post-training Optimization Tool,即训练后优化工具,主要功能是将YOLOv5 OpenVINO™ FP32 模型进行 INT8 量化,实现模型文件压缩,从而进一步提高模型推理性能。
不同于 Quantization-aware Training 方法,POT使用起来更加简单,在改善 CPU 和硬件加速器延迟的同时缩减模型大小,且几乎不会降低模型准确率,因此广泛地被应用于工业界的量化实践中。
安装POT工具
POT工具已经集成到OpenVINO™ 开发套件中,只需一条命令,可以完成全部内建工具的安装。
pip install openvino-dev
参考链接:https://pypi.org/project/openvino-dev/
POT 命令行方式 vs API方式
POT提供了以下两种使用方式:命令行方式和API方式
- 命令行方式:使用简单,通过命令行运行相应配置文件来调用OpenVINO™ Accuracy Checker Tool预定义DataLoader, Metric, Adapter, Pre/Postprocessing 等模块,这种方式适用于 OpenVINO™ Open Model Zoo 支持模型或类似模型的 INT8 量化。
"engine": {
"type": "accuracy_checker",
"config": "./configs/examples/accuracy_checker/mobilenet_v2.yaml"
}
pot默认调用accuracy_checker, 这个工具默认支持Open Model Zoo的模型,并通过accuracy_checker检查模型精度。accuracy_checker的配置文件accuracy-check.yml文件定义好了adapter、datasets、preprocessing、postprocessing、metrics等。若您将要优化的模型,不在Open Model Zoo里面,则需要用API方式,自定义DataLoader 和 Metric 等。
- API方式:用户通过继承 DataLoader 来定义客制化的数据集加载及预处理模块,通过继承 Metric 来定义客制化的后处理和精度计算的模块,这种方式更加灵活,可以适用不同客制化模型的量化需求。
POT工具API使用方式
由于YOLOv5,并不在Open Model Zoo中,所以本文选择API方式实现YOLOv5模型INT8量化。
YOLOv5不在Open Model Zoo中
用POT工具的API方式实现YOLOv5模型INT8量化
- 第一步:配置YOLOv5和 OpenVINO™开发环境。
git clone https://github.com/ultralytics/yolov5.git
cd yolov5 && pip install -r requirements.txt && pip install openvino-dev[onnx]
-
第二步:导出YOLOv5 OpenVINO IR模型。
在yolov5路径下,运行
导出YOLOv5 OpenVINO IR模型python export.py --weights yolov5s.pt --include onnx openvino
以上两步,参考链接:https://github.com/ultralytics/yolov5
- 第三步:准备量化用标定数据集coco128。COCO128数据集是从COCO Train2017中抽取了前128张图片制作的数据集。POT在做训练后INT8量化时,需要一个标定数据,即大约300张的标注图片,coco128数据集很适合做标定数据集。 标定数据集
在yolov5路径下,运行命令:
会自动下载coco128数据集: coco128数据集位置 yolov5s_pot_int8_coco128.py运行结果python train.py --data data\coco128.yaml
-
第五步,将量化算法从DefaultQuantization更改为AccuracyAwareQuantization,再次运行,对比不同算法INT8量化结果
DefaultQuantization AccuracyAwareQuantization
选择量化算法的最佳工程实践是:先用DefaultQuantization算法,若INT8量化后,精度满足要求,则完成INT8量化任务;若精度不满足下降要求,则运行AccuracyAwareQuantization。
AccuracyAwareQuantization算法会根据量化层对精度下降的贡献,将量化层恢复为浮点精度,直到满足全精度模型所需的精度下降为止,运行时间比DefaultQuantization算法长很多(十倍以上)。
注意,由于 AccuracyAwareQuantization 算法会将部分量化层恢复为浮点精度,所以可能出现AccuracyAwareQuantization算法对模型的加速低于模型完全量化(DefaultQuantization)的速度 。
运行benchmark_app结果@i7-8700k:
model | latency@CPU | Throughtput@CPU | model size |
---|---|---|---|
yolov5s_aaq | 90.77ms | 44.01 FPS | 7.5MB |
yolov5s_dq | 90.02ms | 44.37 FPS | 7.4MB |
yolov5s_fp16 | 148.90ms | 26.83 FPS | 14.3MB |
yolov5s_fp32 | 150.93ms | 26.47 FPS | 28.6MB |
model | latency@iGPU | Throughtput@iGPU | model size |
---|---|---|---|
yolov5s_aaq | 468.56ms | 17.04 FPS | 7.5MB |
yolov5s_dq | 483.24ms | 16.52 FPS | 7.4MB |
yolov5s_fp16 | 69.59ms | 28.71 FPS | 14.3MB |
yolov5s_fp32 | 112.10ms | 17.83 FPS | 28.6MB |
结论:INT8是CPU友好精度;FP16是集成显卡友好精度!
参考资料:
网友评论