作者:YASUNORI SHIMURA Intel Technical Solution Specialist for Computer Vision Technology
翻译:张晶
OpenVINOTM 2022.1是自OpenVINOTM 2018年首次发布以来最大的更新之一,参见《OpenVINO™ 迎来迄今为止最重大更新,2022.1新特性抢先看!》。 在众多新特性中,AUTO插件和自动批处理(Automatic-Batching)是最重要的新特性之一,它帮助开发者无需复杂的编程即可提高推理计算的性能和效率。
AUTO插件[1],全称叫自动设备选择(Automatic device selection),它是一个构建在CPU/GPU插件之上的虚拟插件,如图1-1所示。在OpenVINOTM文档中,“设备(device)”是指用于推理计算的 Intel® 处理器,它可以是受支持的CPU、GPU、VPU(视觉处理单元)或 GNA(高斯神经加速器协处理器)或这些设备的组合[3]。
图1-1 OpenVINOTM Runtime支持的设备插件[3]
AUTO插件好处有:
图1-2 指定AUTO插件
自动批处理(Automatic Batching) [2],又叫自动批处理执行(Automatic Batching Execution),是OpenVINOTM Runtime支持的设备之一,如图1-1所示。
一般来说,批尺寸(batch size) 越大的推理计算,推理效率和吞吐量就越好。自动批处理执行将用户程序发出的多个异步推理请求组合起来,将它们视为多批次推理请求,并将批推理结果拆解后,返回给各推理请求。
自动批处理无需开发者手动指定。当compile_model()方法的config参数设置为{“PERFORMANCE_HINT”: ”THROUGHPUT”}时,OpenVINOTM Runtime会自动启动自动批处理执行,如图1-3所示,让开发人员以最少的编码工作即可享受计算设备利用率和吞吐量的提高。
图1-3 自动启动自动批处理执行
读书是学习,实践也是学习,而且是更有效的学习。本文提供了完整的实验代码,供读者一边动手实践,一边学习总结。
Github地址: GitHub - yas-sim/openvino-auto-feature-visualization: This is a set of test program to visualize the behavior of "AUTO" plugin device switching and auto-batching feature that is newly introduced from OpenVINO 2022.1 version.
第一步,克隆代码仓到本地。
git clone https://github.com/yas-sim/openvino-auto-feature-visualization.git
第二步,在openvino-auto-feature-visualization路径执行:
python -m pip install --upgrade pip
pip install -r requirements.txt
第三步,下载模型并完成转换
omz_downloader --list models.txt
omz_converter --list models.txt
到此,实验环境搭建完毕。实验程序的所有配置和设置参数都硬编码在源代码中,您需要手动修改源代码以更改测试配置,如图1-4所示。
图1-4 手动修改源代码中的配置
GPU插件需要在 GPU 上开始推理之前将IR模型编译为 OpenCL 模型。这个模型编译过程可能需要很长时间,例如 10 秒,会延迟应用程序开始推理,使得应用程序启动时的用户体验不好。
为了隐藏这种 GPU 模型编译延迟,AUTO插件将在 GPU 模型编译进行时使用CPU执行推理任务;当GPU模型编译完成后,AUTO插件会自动将推理计算设备从CPU切换到GPU,如图1-5所示。
图1-5 AUTO插件自动切换计算设备
AUTO插件会依据设备优先级[1]: dGPU > iGPU > VPU > CPU, 来选择最佳计算设备。当自动插件选择 GPU 作为最佳设备时,会发生推理设备切换,以隐藏首次推理延迟。
请注意,设备切换前后的推理延迟不同;此外,推理延迟故障可能发生在设备切换的那一刻,如图1-6所示。
请如图1-6所示,设置auto-test-latency-graph.py配置参数为:
cfg['PERFORMANCE_HINT'] = ['THROUGHPUT', 'LATENCY'][0]
并运行命令:
python auto-test-latency-graph.py
同时打开Windows任务管理器,观察CPU和iGPU的利用率。
图1-6 config={“PERFORMANE_HINT”:”THROUGPUT”}的执行行为
如1.1.2节所述,AUTO插件的执行行为取决于compile_model()方法的config参数的PERFORMANCE_HINT设置,如表1-1所示:
表1-1 PERFORMANCE_HINT设置
PERFORMANCE_HINT |
应用场景 |
是否启动Auto Batching? |
'THROUGHPUT' |
非实时的大批量推理计算任务 |
是 |
'LATENCY' |
实时或近实时应用任务 |
否 |
设置auto-test-latency-graph.py配置参数为:
cfg['PERFORMANCE_HINT'] = ['THROUGHPUT', 'LATENCY'][1]
并运行命令:
python auto-test-latency-graph.py
同时打开Windows任务管理器,观察CPU和iGPU的利用率,运行结果如图1-7所示。
图1-7 config={“PERFORMANE_HINT”:”LATENCY”}的执行行为
通过实验,我们可以发现,根据不同的config参数设置,使得AUTO插件可以工作在不同的模式下:
接下来,本文将讨论Auto Batching对推理计算行为的影响。
如1.1.2节所述,自动批处理执行将用户程序发出的多个异步推理请求组合起来,将它们视为多批次推理请求,并将批推理结果拆解后,返回给各推理请求,如图1-8所示。
图1-8 Auto Batching的执行过程
Auto Batching在收集到指定数量的异步推理请求或计时器超时(默认超时=1,000 毫秒)时启动批推理计算(batch-inference),如图1-9所示。
图1-9 启动批推理计算
Auto Batching被禁止时,所有推理请求都是单独被处理的。
请配置并运行auto-test.py。
Device: AUTO
Config: {'PERFORMANCE_HINT': 'LATENCY'}
niter: 20 , interval: 30 ms
OPTIMAL_NUMBER_OF_INFER_REQUESTS 1
Number of infer requests: 1
运行结果如图1-10所示,可见每一个推理请求是被单独处理的。
图1-10 Auto Batching被禁止时的运行结果
Auto Batching被使能时,异步推理请求将作为多批次推理请求进行绑定和处理。推理完成后,结果将分发给各个异步推理请求并返回。需要注意的是:批推理计算不保证异步推理请求的推理顺序。
请配置并运行auto-test.py。
Device: GPU
Config: {'CACHE_DIR': './cache', 'PERFORMANCE_HINT': 'THROUGHPUT', 'ALLOW_AUTO_BATCHING': 'YES'}
niter: 200 , interval: 30 ms
OPTIMAL_NUMBER_OF_INFER_REQUESTS 64
Number of infer requests: 16
运行结果如图1-11所示,可见每16个推理请求被组合成一个批次进行批推理计算,推理计算顺序不被保证。
图1-11 Auto Batching被使能时的运行结果
由于较长的默认超时设置(默认timeout = 1,000ms),在低推理请求频率情况下可能会引入较长的推理延迟。
由于Auto Batching将等待指定数量的推理请求进入或超时计时器超时,在低推理频率的情况下,它无法在指定的超时时间内收集足够的推理请求来启动批推理计算,因此,提交的推理请求将被推迟,直到计时器超时,这将引入大于timeout设置的推理延迟。
为解决上述问题,用户可以通过 AUTO_BATCH_TIMEOUT 配置参数指定超时时间,以尽量减少此影响。
请使用AutoBatching的默认timeout,运行auto-test.py。
Device: GPU
Config: {'CACHE_DIR': './cache', 'PERFORMANCE_HINT': 'THROUGHPUT'}
niter: 20, interval: 300 ms
OPTIMAL_NUMBER_OF_INFER_REQUESTS 64
Number of infer requests: 64
运行结果如图1-12所示,由于每次都无法在timeout时间内收集到指定数量的推理请求,由此导致推理请求的延迟很高。
图1-12 timeout=1000ms运行结果
请配置AutoBatching的timeout=100ms,然后运行auto-test.py。
Device: GPU
Config: {'CACHE_DIR': './cache', 'PERFORMANCE_HINT': 'THROUGHPUT', 'AUTO_BATCH_TIMEOUT': '100'}
niter: 20 , interval: 300 ms
OPTIMAL_NUMBER_OF_INFER_REQUESTS 64
Number of infer requests: 16
图1-13 timeout=100ms运行结果
运行结果如图1-13所示, timeout=100ms时间内,仅能收集到一个推理请求。
综上所述,Auto Batching的最佳编程实践:
本节给出AUTO 插件和Auto Batching的快速小结,如表1-2所示。
表1-2 AUTO插件和自动批处理执行快速小结表
Automatic device selection |
Automatic Batching |
|
描述 |
- 枚举系统上的可用设备,选择最佳设备并将其用于推理 - 通过使用CPU开始推理来隐藏GPU模型编译时间,编译好后再切换到GPU |
将用户程序发出的多个异步推理请求组合起来,将它们视为多批次推理请求,并将批推理结果拆解后,返回给各推理请求 |
优点 |
- 开发者不需要做详细的硬件配置 - 应用程序可以利用系统的最佳性能 - 更短的第一次推理延迟:AUTO插件可以隐藏GPU模型编译时间 |
- 设备利用率和效率将提高 - 开发人员可以以最少的编程工作享受多批次吞吐量 |
缺点 |
* 不适合需要一致且可预测性能的人 * 设备切换前后的推理性能会有所不同(例如,“CPU”->“GPU”) * 推理性能可能会在设备切换时刻下降(几秒钟的顺序) |
* 仅在 GPU 上可用 * 默认超时=1,000 毫秒。 这可能会导致意外的长延迟性能问题。 |
默认 启用? |
默认不启动。 需要明确指定“AUTO”作为插件名称。 |
默认启用 仅限GPU |
如何 启动 |
指定“AUTO”作为插件名称 |
ALLOW_AUTO_BATCHING=YES是默认值。 1. ALLOW_AUTO_BATCHING=YES, device=GPU, PERFORMANCE_HINT=THROUGHPUT 2. 指定“BATCH:GPU”作为设备名称 |
额外 注意 |
默认设备选择优先级:dGPU > iGPU > VPU > CPU 重要提示:如果 AUTO 插件能够选择“GPU”作为最终计算设备,并且 PERFORMANCE_HINT=THROUGHPUT 已设置,将启用自动批处理功能。 |
如何禁用Auto Batching? 使用compile_model()或set_property(): 1. 设置 ALLOW_AUTO_BATCHING = NO,或者 2 指定 PERFORMANCE_HINT = LATENCY |
本文GitHub源代码链接:https://github.com/yas-sim/openvino-auto-feature-visualization
参考文献:
[1] https://docs.openvino.ai/latest/openvino_docs_OV_UG_supported_plugins_AUTO.html
[2] https://docs.openvino.ai/latest/openvino_docs_OV_UG_Automatic_Batching.html
[3] https://docs.openvino.ai/latest/openvino_docs_OV_UG_supported_plugins_Supported_Devices.html#doxid-openvino-docs-o-v-u-g-supported-plugins-supported-devices