前言
在2020年以前,OpenVINO(这里以OpenVINO2019年最新的一个版本为例)的Int8量化工具实现在openvino_2019.3.379\deployment_tools\tools\calibration_tool
,因为文档比较难读,所以做个翻译记录在这里,便于使用OpenVINO的量化工具上手。要做Int8量化首先需要将你需要部署的模型Caffe/Pytorch/Tensorflow转化为OpenVINO的IR中间模型。此文档的原因为文档为openvino_2019.3.379\deployment_tools\tools\calibration_tool\README.md
。
Python* Calibaration Tool
介绍
校准工具可量化给定的FP16或FP32模型,并在使模型输入保持原始精度的情况下生成低精度的8位整数(INT8)模型。 要了解INT8有关推理的好处的更多信息,请参考./docs/IE_DG/Int8Inference.md)
。
注意:INT8模型现在只被CPU plugin所支持。有关支持的配置的完整列表,请参见
./docs/IE_DG/supported_plugins/Supported_Devices.md
。
您可以在两种模式下运行校准工具:
- 标准模式以指定量化后的模型相对于原始模型在精度下降不超过一个阈值的方式运行。标准模式在量化过程中利用精度检查工具(
./tools/accuracy_checker/README.md
)来测试精度。使用此模式可获得可以在您的应用程序中直接使用的INT8 IR模型。 - 简化模式生成的IR包含每个层的原始统计信息,而无需任何准确性检查就可以收集这些信息,这意味着带有统计信息的新IR模型的准确性可能会大大降低。 因此,所有层均视为在INT8中执行。 使用此模式可以了解将模型转换为INT8精度的潜在性能提升,并得出有关运行标准模式例程的结论。
校验工具是一个导入了openvino.tools.calibration
包的Python*命令行工具。
系统要求
硬件要求取决于模型。 通常,对于公告模型,RAM内存大小必须不少于16GB
,硬盘必须具有不少于30 GB
的可用空间(独立于操作系统)。 临时目录用于在校准期间缓存输出的网络层。
用法
您可以使用一组适当的配置参数以标准或简化模式运行校准工具。
标准模式
在标准模式下,校准工具的配置方式与准确性检查器相同。
注意:出于一致性的原因,一部分参数的名称和含义与准确性检查器中的名称和含义相同,可以重复使用以运行准确性检查器。
要配置该工具,可以使用以下命令行参数:
校准工具和准确性检查器通用的命令行参数
参数 | 类型 | 描述 |
---|---|---|
-c , --config | string | Required. 本地配置的yml文件的路径 |
-d , --definitions | string | Optional. 带有定义信息的yml文件的路径 |
-m , --models | string | Optional. 模型和权重的前缀路径 |
-s , --source | string | Optional. 数据集的前缀路径 |
-a , --annotations | string | Optional. Annotation格式文件路径 |
-e , --extensions | string | Optional. 扩展文件夹的前缀路径 |
--cpu_extensions_mode , --cpu-extensions-mode | string | Optional. CPU扩展指令集加速库:avx2 或sse4 |
-C , --converted_models , --converted-models | string | Optional. 存储转换后的模型的路径 |
-M , --model_optimizer , --model-optimizer | string | Optional. Caffe模型优化器的路径 |
--tf_custom_op_config_dir , --tf-custom-op-config-dir | string | Optional. Tensorflow模型优化器的路径 |
--tf_obj_detection_api_pipeline_config_path , --tf-obj-detection-api-pipeline-config-path | string | Optional. 用于Tensorflow目标检测模型优化器的配置文件路径. |
--progress | string | Optional. 进程报告: bar , print or None |
-td , --target_devices , --target-devices | string | Optional. 用空格分隔的设备列表以进行推断 |
-tt , --target_tags , --target-tags | string | Optional. 用空格分隔的设备列表以进行启动 |
校准工具特定的命令行参数
参数 | 类型 | 描述 |
---|---|---|
-p , --precision | string | Optional. 校准精度。 默认值为INT8。 在简化模式下,确定输出IR精度 |
--ignore_layer_types , --ignore-layer-types | string | Optional. 在量化过程中被跳过的网络层类型 |
--ignore_layer_types_path , --ignore-layer-types-path | string | Optional.在量化过程中被跳过的网络层类型文件路径 |
--ignore_layer_names , --ignore-layer-names | string | Optional. 在量化过程中被跳过的网络层名字 |
--ignore_layer_names_path , --ignore-layer-names-path | string | Optional.在量化过程中被跳过的网络层名字文件路径 |
--batch_size , --batch-size | integer | Optional. 批次大小,如果没有指定,则使用IR文件里面指定的值 |
-th , --threshold | float | Optional. 量化模型的准确性下降不应超过此阈值。 应该是没有百分号的百分比值。 (默认为1%)。 |
-ic , --benchmark_iterations_count , --benchmark-iterations-count | integer | Optional. 基准迭代次数 (默认为1). |
-mn , --metric_name , --metric-name | string | Optional. 校准期间使用的评价指标名字。 |
-mt , --metric_type , --metric-type | string | Optional. 校准期间使用的评价指标类型。 |
-o , --output_dir , --output-dir | string | Optional. 用于存储转换后的模型的目录。 如果未定义,则使用原始模型目录。 |
简化模式
此模式下的工具不使用准确性检查器,配置和注释文件,但是您需要指定IR .xml文件和数据集文件夹的路径。 (可选)您可以指定扩展文件夹的前缀路径以及数据集文件夹中的图像数:
参数 | 类型 | 描述 |
---|---|---|
-sm , --simplified_mode , --simplified-mode | Required.如果指定,校准工具将以简化模式运行以收集数据统计信息,而无需搜索最佳数据阈值. | |
-m | string | Required. xml文件的路径. |
-s , --source | string | Optional. 数据集文件夹的路径 |
-ss , --subset | integer | Optional. 该选项仅与--simplified_mode 一起使用。 指定使用-s 选项设置的文件夹中的图像数量。 |
-e , --extensions | string | Optional. 扩展文件夹的前缀路径。 |
-td , --target_devices , --target-devices | string | Optional. 用空格分隔的设备列表以进行推断。 |
-p , --precision | string | Optional. 校准精度。 默认值为INT8。 在简化模式下,确定输出IR精度。 |
-o , --output_dir , --output-dir | string | Optional. 用于存储转换后的模型的目录。 如果未定义,则使用原始模型目录。 |
典型工作流程示例(标准模式)
介绍
校准工具读取原始FP16或FP32模型,校准数据集并创建低精度模型。 低精度模型与原始模型有两个区别:
- 1.定义了每个通道的统计信息。 统计信息具有每个层和每个通道的最小值和最大值。 模型统计信息以XML格式存储在Inference Engine中间表示文件(IR)中。
- 2.定义了
quantization_level
层属性。 该属性定义在推理过程中使用的精度。
先决条件
- 模型:TensorFlow的Inception v1模型。你可以从这个地址下载模型:
https://github.com/tensorflow/models/tree/master/research/slim
。 - 数据集:ImageNet。你可以从这里下载:http://www.image-net.org/download.php。
- YML配置文件:您可以在下面的
configs
目录中找到YML配置文件和YML定义文件:definitions.yml
-定义文件。inception_v1.yml
-针对TensorFlow*的Inception V1模型的配置文件。ncf_config.yml
-OpenVINO推理引擎中间表示格式的NCF模型的配置文件。ssd_mobilenet_v1_coco.yml
- 针对Tensorflow*的Mobilenet v1 ssd模型的配置文件。unet2d.yml
-Unet2D的OpenVINO前向推理引擎中间表示模型的配置文件。
如果你的自定以拓扑不支持准确性评价指标或者自定义数据集,请自己在openvino.tools.accuracy_checker
Python包中添加其它一些实现部分。想要了解更多关于评价指标实现和数据集支持,可以去./tools/accuracy_checker/README.md
查看。
下面是校准和评估模型的步骤:
-
转换数据集获得Annotations文件。
-
(可选的)评估低精度模型性能。
-
校验模型。
-
评估结果模型。
可以使用校准之前的其他可选步骤来粗略估计可能的INT8性能。
转换数据集获得Annotations文件
校准数据集是训练数据集的子集。 使用转换注释工具将ImageNet \ *数据集转换为校准工具可读的数据注释文件。 数据注释文件描述了在校准期间使用的图像子集。 命令行:
python convert_annotation.py imagenet --annotation_file /datasets/ImageNet/val.txt --labels_file /datasets/ImageNet/synset_words.txt -ss 2000 -o ~/annotations -a imagenet.pickle -m imagenet.json
注意:为简单起见,以下步骤中的所有命令行工具都使用相同的命令行参数。 实际上,[Collect Statistics Tool](
./ inference-engine / tools / collect_statistics_tool / README.md
)使用校准数据集,但是[Accuracy Checker Tool](./ tools / accuracy_checker / README.md
)必须使用整个验证数据集 。
参数 | 类型 | 描述 |
---|---|---|
–config | string | 本地配置YML文件的路径 |
-d | string | YML定义文件的路径 |
-M | string | 模型优化器目录的路径 |
–models | string | 模型和权重的前缀路径 |
–source | string | 数据集的前缀路径 |
–annotations | string | Annotations文件的路径 |
–converted_models | string | 用于存储转换后的Annotations文件的路径 |
(可选的)评估低精度模型性能。
校准之前,您可以使用[Collect Statistics Tool](./ inference-engine / tools / collect_statistics_tool / README.md
)粗略估计低精度性能。
[Collect Statistics Tool](./ inference-engine / tools / collect_statistics_tool / README.md
)忽略YML配置文件中的评价指标,但是你可以使用相同的命令行参数。
命令行:
python collect_statistics.py --config ~/inception_v1.yml -d ~/defenitions.yml -M /home/user/intel/openvino/deployment_tools/model_optimizer --models ~/models --source /media/user/calibration/datasets --annotations ~/annotations --converted_models ~/models
结果模型具有统计信息,可让你以INT8精度推断此模型。 要衡量性能,您可以使用[Benchmark App](./inference-engine/tools/benchmark_tool/README.md
)。
校验模型
在校准过程中,将对模型进行调整,以进行有效的量化并最小化在校准数据集上的准确度下降。 校准工具会生成校准后的模型,将其加载到CPU插件后以低精度8位量化模式执行。
[校准工具](./ inference-engine / tools / calibration_tool / README.md
)具有灵活且可扩展的机制,可以启用新的数据集和评价指标。 每个网络都有自己的专用网络度量标准和网络训练数据集。 数据集描述和网络评价方式可以被多种网络复用。
要插入新数据集,您需要开发YML文件。 要开发新的模型评价标准,您需要开发实现度量标准的Python \ *模块并在YML中进行描述。 有关详细信息,请参阅[准确性检查器工具](./ tools / accuracy_checker / README.md
)。
命令行例子:
python calibrate.py --config ~/inception_v1.yml --definition ~/defenitions.yml -M /home/user/intel/openvino/deployment_tools/model_optimizer --tf_custom_op_config_dir ~/tf_custom_op_configs --models ~/models --source /media/user/calibration/datasets --annotations ~/annotations
评估模型结果
在校验完成后,我们可以使用[准确性检查工具](./ tools / accuracy_checker / README.md
)来评估模型。
评估准确率
命令行:
python accuracy_check.py --config ~/inception_v1.yml -d ~/defenitions.yml -M /home/user/intel/openvino/deployment_tools/model_optimizer --tf_custom_op_config_dir ~/tf_custom_op_configs --models ~/models --source /media/user/calibration/datasets --annotations ~/annotations -tf dlsdk -td CPU
评估性能
使用[Benchmark App](./ inference-engine / samples / benchmark_app / README.md
)命令行工具可以测量同步和异步模式的延迟和吞吐量。 注意,Benchmark App命令行工具使用转换后的OpenVINO *中间表示模型。
同步模式的命令行如下:
./benchmark_app -i <path_to_image>/inputImage.bmp -m <path_to_model>/inception_v1.xml -d CPU -api sync
异步模式的命令行如下:
./benchmark_app -i <path_to_image>/inputImage.bmp -m <path_to_model>/inception_v1.xml -d CPU -api async
典型工作流程示例(简化模式)
要以简化模式运行校准工具,请使用以下命令:
python3 calibrate.py -sm -m <path-to-ir.xml> -s <path-to-dataset> -ss <images-number> -e <path-to-extensions-folder> -td <target-device> -precision <output-ir-precision> --output-dir <output-directory-path>
输入:
- FP32 和 FP16模型。
- 图片文件当作数据集。
后记
2019年OpenVINO的量化工具文档就翻译完了,后面有机会再翻译一下数据集转换,模型准确率评估,Benchmark App等的文档,如果你使用OpenVINO希望对你有帮助。
推荐阅读
欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ω•́ )✧
有对文章相关的问题,或者想要加入交流群,欢迎添加BBuf微信: