AUTO插件和自动批处理的最佳实践

1.1 概述
openvino 2022.1是自openvino 工具套件2018年首次发布以来最大的更新之一,参见《openvino 迎来迄今为止最重大更新,2022.1新特性抢先看!》。在众多新特性中,auto插件和自动批处理(automatic-batching)是最重要的新特性之一,它帮助开发者无需复杂的编程即可提高推理计算的性能和效率。
1.1.1 什么是auto插件?
auto插件1 ,全称叫自动设备选择(automatic device selection),它是一个构建在cpu/gpu插件之上的虚拟插件,如图1-1所示。在openvino 文档中,“设备(device)”是指用于推理计算的 intel 处理器,它可以是受支持的cpu、gpu、vpu(视觉处理单元)或 gna(高斯神经加速器协处理器)或这些设备的组合3 。
图1-1  openvino runtime支持的设备插件3
auto插件好处有:
■ 首先检测运行时平台上所有可用的计算设备,然后选择最佳的一个计算设备进行推理计算,并根据深度学习模型和所选设备的特性以最佳配置使用它。
■使 gpu 实现更快的首次推理延迟:gpu 插件需要在开始推理之前在运行时进行在线模型编译——可能需要 10 秒左右才能完成,具体取决于平台性能和模型的复杂性。当选择独立或集成gpu时,“auto”插件开始会首先利用cpu进行推理,以隐藏此gpu模型编译时间。
■使用简单,开发者只需将compile_model()方法的device_name参数指定为“auto”即可,如图1-2所示。
图1-2  指定auto插件
1.1.2 什么是自动批处理?
自动批处理(automatic batching)2 ,又叫自动批处理执行(automatic batching execution),是openvino  runtime支持的设备之一,如图1-1所示。
一般来说,批尺寸(batch size) 越大的推理计算,推理效率和吞吐量就越好。自动批处理执行将用户程序发出的多个异步推理请求组合起来,将它们视为多批次推理请求,并将批推理结果拆解后,返回给各推理请求。
自动批处理无需开发者手动指定。当compile_model()方法的config参数设置为{“performance_hint”: ”throughput”}时,openvino runtime会自动启动自动批处理执行,如图1-3所示,让开发人员以最少的编码工作即可享受计算设备利用率和吞吐量的提高。
图1-3  自动启动自动批处理执行
1.2 动手学auto插件的特性
读书是学习,实践也是学习,而且是更有效的学习。本文提供了完整的实验代码,供读者一边动手实践,一边学习总结。
github地址: https://github.com/yas-sim/openvino-auto-feature-visualization
1.2.1 搭建实验环境
第一步,克隆代码仓到本地。
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  手动修改源代码中的配置
1.2.2 auto插件自动切换计算设备
gpu插件需要在 gpu 上开始推理之前将ir模型编译为 opencl 模型。这个模型编译过程可能需要很长时间,例如 10 秒,会延迟应用程序开始推理,使得应用程序启动时的用户体验不好。
为了隐藏这种 gpu 模型编译延迟,auto插件将在 gpu 模型编译进行时使用cpu执行推理任务;当gpu模型编译完成后,auto插件会自动将推理计算设备从cpu切换到gpu,如图1-5所示。
图1-5  auto插件自动切换计算设备
1.2.3 动手观察自动切换计算设备的行为
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.2.4 performance_hint设置
如1.1.2节所述,auto插件的执行行为取决于compile_model()方法的config参数的performance_hint设置,如表1-1所示:
表1-1  performance_hint设置
设置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插件可以工作在不同的模式下:
■ 在latency模式,不会自动启动auto batching,执行设备切换后,gpu上的推理延迟很小,且不会抖动。
■ 在throughput模式,自动启动auto batching,执行设备切换后,gpu上的推理延迟较大,而且会抖动。
接下来,本文将讨论auto batching对推理计算行为的影响。
1.3 动手学auto batching的特性
如1.1.2节所述,自动批处理执行将用户程序发出的多个异步推理请求组合起来,将它们视为多批次推理请求,并将批推理结果拆解后,返回给各推理请求,如图1-8所示。
图1-8  auto batching的执行过程
auto batching在收集到指定数量的异步推理请求或计时器超时(默认超时=1,000 毫秒)时启动批推理计算(batch-inference),如图1-9所示。
图1-9  启动批推理计算
1.3.1 auto batching被禁止时
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被禁止时的运行结果
1.3.2 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被使能时的运行结果
1.3.3 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时间内,仅能收集到一个推理请求。
1.3.4 auto batching最佳实践
综上所述,auto batching的最佳编程实践:
■ 要记住,默认情况下auto batching不会启用。
■ 只有在以下情况时,auto batching才启用:
{'performance_hint': 'throughput', 'allow_auto_batching': 'yes'}
■ 如果您的应用程序能够以高频率连续提交推理请求,请使用自动批处理。
■ 警告:如果您的应用间歇性地提交推理请求,则最后一个推理请求可能会出现意外的长延迟。
■ 如果推理节奏或频率较低,即推理频率远低于auto_batch_timeout(默认为 1,000 毫秒),请勿开启自动批处理。
■ 您可以使用auto_batch_timeout 参数更改自动批处理的超时设置,以最大限度地减少不需要的长延迟,参数值的单位是“ms”。
■ 如果您知道工作负载的最佳批处理大小,请使用performance_hint_num_requests 指定适当的批处理数量,即 {'performance_hint_num_requests':'4'}。同时,以gpu为例,auto插件会在后台根据可以使用的内存,模型精度等计算出最佳批处理大小。
1.4 总结
本节给出auto 插件和auto batching的快速小结,如表1-2所示。
表1-2  auto插件和自动批处理执行快速小结表
本文github源代码链接:https://github.com/yas-sim/openvino-auto-feature-visualization


电源滤波器作用_电源滤波器结构
基于DSPIC的工业缝纫机控制系统设计与分析
一文了解智慧物流发展特点及功能
区块链下艺术市场未来发展就如何?是好还是坏?
硅化物、氮化物与钙钛矿:第三代半导体的四大分类与应用探索
AUTO插件和自动批处理的最佳实践
如何链接Spice模型
基于无线通讯技术的边缘计算网关及其在电网中的应用
智能制造的定义、关键技术与实现智能制造的意义是什么
STM32F407总线存储框架及应用设计
专访Yosi Lahad:AI给机器人插上翅膀,担心AI取代人类过虑了
销量、技术都领先,造车新势力拿什么跟埃安斗
汇川技术入股海通科创 助力绿色智慧港口建设 “加速跑”
云计算和边缘计算还有雾计算的实际应用有哪些
详解光刻胶技术并阐述光刻胶产业现状和国内发展趋势
电容串并联该如何取值?完整的电容降压电路该如何实现?
电动车防盗跟踪器浪涌可靠性研究
小米6怎么样?小米6是否值得你们前赴后继的抢购?看了这6点你还抢购吗?
aigo移动固态硬盘S7 Pro评测:凭实力圈粉无数 真国民好物
紫光国微荣获安全之星“2021年度优秀汽车安全芯片方案奖”