OpenVINO™ 中用于推理优化的自适应参数选择功能介绍

描述

本文简介

当你使用 AI 模型进行推理时,往往需要设置一些参数与选项,相应地,OpenVINO 工具套件为此提供了一些自动设定参数选项的功能。本文主要介绍 OpenVINO 中与模型推理相关的3个功能,它们分别是:

用于 input 数据足够多时,提供最大 throughput 的 Auto-batching 功能;

用于自动选择设备进行推理的 Auto Plugin 功能;

以及用于满足特定模型动态输入的 Dynamic Shape 功能。

本文将逐一介绍这三个实用的功能,并在文末给出这三功能的优缺点总结对比。

功能介绍

Auto-batching

Auto-batching 设计目的是让开发者利用最少的代码去实现使用英特尔 显卡做模型推理的数据吞吐量最大化。在没有设定 input 以及没有限制范围的情况下,它会按照集成显卡或者是独立显卡能承受的最大吞吐量去设定推理线程数。如果应用程序有大量的输入数据且以高频率连续提交推理请求,推荐使用 Auto-batching 功能。

该功能通过几行代码实现了最多推理线程的响应,同时也不会对原先的示例代码造成影响。如果在推理设备设置中,将“device“参数设置为:“BATCH:GPU“ 该功能将会被激活。例如,在 benchmark_app 应用使用 Auto-batching 的方式如下:

 

$benchmark_app -hint none -d BATCH:GPU -m ‘path to your favorite model’

 

向右滑动查看完整代码

另外一种方法是:在 GPU 推理时,选择性能模式为”THROUGHPUT”,该功能将会被自动触发。所以在示例代码中添加如下两行,即可在 GPU 进行推理时,启动 Auto-batching 功能:

 

config = {"PERFORMANCE_HINT": "THROUGHPUT"} compiled_model = core.compile_model(model, "GPU", config)

 

向右滑动查看完整代码

无论是通过设置 BATCH:GPU,还是选择”THROUGHPUT”的推理模式,推理的 batch  size 值都会自动进行选取。选取的方式是查询当前设备的 ov::optimal_batch_size 属性并且通过模型拓扑结构的输入端获取 batch size 的值作为模型推理的 batch size 值。

接下来,是使用 Benchmark  APP 做的对比实验:

模型

图1:Disable Auto-batching

模型

图2:Enable Auto-batching

通过对比 Auto-batching 功能开闭的推理结果图,可以看到当此功能开启的时候:即使推理设备选择的是集成显卡,推理线程数仍旧被推上了128个,说明此功能确实会尝试使用当前状态下压力最大的推理线程数,来达到推理最大的吞吐量。但是结果是当推理性能有限的集成显卡启动了128个线程的时候,整体的 throughput 的数值比单推理线程的 throughput 要低一些,所以当硬件推理性能有限时,需要对推理线程数进行限定。同样,在 Auto-batching 中限定推理线程有两种方式分别为,设置 BATCH: GPU (4)或设置 ov::num_requests 参数可以将推理线程设为4:

 

auto compiled_model = core.compile_model(model, "GPU",    ov::THROUGHPUT),    ov::num_requests(4));

 

向右滑动查看完整代码

Auto-batching 中内置了 Auto_batch_timeout 参数,该参数用于监测输入数据送达的时延,初始值为1000,表示若1000毫秒后无数据输入则提示推理超时。注意,如果推理频率较低,或者根据 Auto_batch_timeout 参数发现推理超时,可以手动关闭 Auto-batching:

 

// disabling the automatic batching auto compiled_model = core.compile_model(model, "GPU",    ov::THROUGHPUT),    ov::allow_auto_batching(false));

 

向右滑动查看完整代码

AUTO Plugin

在 OpenVINO 工具套件的推理插件(Plugin)选择上,除了常规的 CPU,iGPU,Myriad,您还可以选择使用 AUTO Plugin。开发者通过它快速部署 AI 示例用于实验,且不用考虑推理设备的选择就能获得一个不错的推理性能。不需要指定设备,它会自动配置推理硬件,当有多个设备时,它也会自动联合调用多个硬件进行推理。

AUTO Plugin 的工作流程是:首先,检测当前环境下所有的可用设备,之后根据预制的硬件选择规则,选择相应的推理设备,并且优化推理的整体配置,最后执行 AI 推理。AUTO Plugin 对于推理设备选择遵循以下的规则:

dGPU (e.g. Intel Iris Xe MAX) ->

iGPU (e.g. Intel UHD Graphics 620 (iGPU)) ->

Intel Movidius Myriad X VPU(e.g. Intel Neural Compute Stick 2 (Intel NCS2)) ->

Intel CPU (e.g. Intel Core i7-1165G7)

 

#常规用法: compiled_model = core.compile_model(model=model, device_name="AUTO") #您可以限定设备使用AUTO Plugin: compiled_model = core.compile_model(model=model, device_name="AUTO:GPU,CPU") #您也可以剔除使用AUTO Plugin的设备: compiled_model = core.compile_model(model=model, device_name="AUTO:-CPU")

 

向右滑动查看完整代码

AUTO Plugin 内置有三个模式可供选择:

1.THROUGHPUT

默认模式。该模式优先考虑高吞吐量,在延迟和功率之间进行平衡,最适合于涉及多个任务的推理,例如推理视频源或大量图像。注:此模式只会对 CPU 与 GPU 进行调用。若该模式下调用GPU进行推理,将会自动触发“Auto-batching“功能。

 

compiled_model = core.compile_model(model=model, device_name="AUTO", config={"PERFORMANCE_HINT":"THROUGHPUT"})

 

向右滑动查看完整代码

2.LATENCY

此选项优先考虑低延迟,为每个推理任务提供比较短的响应时间。它对于需要对单个输入图像进行推断的任务(例如超声扫描图像的医学分析)。此外,它还适用于实时或接近实时应用的任务,例如工业机器人对其环境中动作的响应或自动驾驶车辆的避障。注:此模式只会对 CPU 与 GPU 进行调用。

 

compiled_modecompiled_model = core.compile_model(model=model, device_name="AUTO", config={"PERFORMANCE_HINT":"LATENCY"})compiled_mode = core.compile_model(model, "AUTO", ov:: CUMULATIVE_THROUGHPUT)); l = core.compile_model(model=model, device_name="AUTO", config={"PERFORMANCE_HINT":"LATENCY"})

 

向右滑动查看完整代码

3.CUMULATIVE_THROUGHPUT

CUMULTIVE_THROUGHPUT 模式允许同时在多个设备上运行推理以获得更高的吞吐量。

使用 CUMULTIVE_THROUGHPUT 模式时,AUTO Plugin 将网络模型加载到候选列表中的所有可用设备,然后根据默认的优先级载入设备运行推理。

 

compiled_mode = core.compile_model(model, "AUTO", ov:: CUMULATIVE_THROUGHPUT));

 

向右滑动查看完整代码

注意:如果指定了没有任何设备名称的 AUTO,并且系统有两个以上的 GPU 设备,则 AUTO 将从设备候选列表中删除 CPU,以保持 GPU 以满容量运行。如果指定了设备优先级,AUTO 将根据优先级在设备上运行推理请求。

Dynamic Shape

模型的动态输入对于某些领域十分重要,比如说在自然语言处理(NLP)中就需要实时对语句进行分割,所以模型的输入是实时变化的,又比如在图像识别中,分割块的形状大小也会根据目标的大小实时变动。对于分割之后的图像来说,进行 resize 操作往往会破坏它的特征属性,导致在后期推理中造成推理准确性降低。动态形状输入功能的引入使得一些基于图像识别的模型,运行结果的准确度提高。使用 Dynamic Shape 功能能够更好地保留图像的特征,根据输入图像的大小,动态调节模型输入,最终模型推理的准确率获得了提升。

在2022.1以前的 OpenVINO 版本中,使用 WPOD-NET (GitHub - sergiomsilva/alpr-unconstrained: License Plate Detection and Recognition in Unconstrained Scenarios):

地址(复制到浏览器打开)

https://github.com/sergiomsilva/alpr-unconstrained

模型进行车牌识别,如果出现动态形态输入的话,在 MO 转换时就会报错,必须强制转成静态输入,例如:

 

python3 $INTEL_OPENVINO_DIR/deployment_tools/model_optimizer/mo_tf. py --data_type=FP32 --saved_model_dir=./data/lpdetector/tf2/models/saved_model/ --model_name=wpod-net -- reverse_input_channels --input_shape [1,416,416,3] -- output_dir=./data/lpdetector/tf2/models/saved_model/FP32_416

 

向右滑动查看完整代码

这会导致该模型在特定的例子下识别精度降低:

模型

 

模型

 

模型

图例:输入图像Resize 为固定尺寸后进行模型推理

由于模型被强制转成了静态输入,可以很明显的发现输入的图像被被强制Resize到了(416,416),图像分割的错误,最后导致了最后车牌识别的结果是不正确的。

在2022.1以后的 OpenVINO 版本中,MO 支持了 Dynamic Shape 的功能,故使用新版本 OpenVINO 工具套件中的模型优化器进行模型转换:

 

mo --saved_model_dir ./data/lpdetector/tf2/models/saved_model/ -- output_dir ./data/lpdetector/tf2/models/FP32/

 

向右滑动查看完整代码

在生成的 xml 文件中,可以开到 input shape 被识别为动态输入,动态参数以“?”或“-1”进行显示:

 

                               -1        -1        -1        3                  

 

向右滑动查看完整代码

使用包含动态输入的模型进行试验,实验结果如下:

模型

 

模型

 

模型

图例:模型使用动态输入进行推理

通过 WPOD-NET 的内置算法,计算得到合适的 Resize 长和宽(1232x608),将图片 Resize 至1232x608,分割到的车牌是清晰完整且最终车牌号码识别是正确的。

模型的动态输入在这个例子中显得十分重要,因为动态输入的支持使得模型推理识别的精度更加准确了。如果模型优化器没有识别到模型的动态输入参数,您可以在代码中手动指定 Dynamic Shape:

 

core = ov.Core() model = core.read_model("model.xml") # Set one static dimension (= 1) and another dynamic dimension (= Dimension()) model.reshape([1, ov.Dimension()])

 

向右滑动查看完整代码

您也可以指定动态输入的动态范围:

 

# Both dimensions are dynamic, first has a size within 1..10 and the second has a size within 8..512 model.reshape([ov.Dimension(1, 10), ov.Dimension(8, 512)])

 

向右滑动查看完整代码

由于您的输入图像是动态的,所以说您在初始化 input tensor 的时候,根据需要进行设定,您可以手动对每一个推理 tensor 进行指定:

 

# Get the tensor, shape is not initialized input_tensor = infer_request.get_input_tensor() # Set shape is required input_tensor.shape = [1, 128] input_tensor.shape = [1, 200]

 

向右滑动查看完整代码

当然,也可以通过模型的 input layer 进行指定:

 

input_tensor = np.expand_dims(image_resized, 0) results = compiled_model.infer_new_request({0: input_tensor})

 

向右滑动查看完整代码

总结

模型

针对不同模型推理场景下, Auto-batching 能够自动给予设备最大压力达到最大吞吐量;AUTO Plugin 能够自动选择推理设备;Dynamic shape 能供根据输入图像动态调整模型的 input shape 大小。这些功能都依据开发者的需求,在进行模型推理时,帮助住开发者自动完成相应的配置,对开发 OpenVINO 的示例应用进行辅助。

不过这些功能在使用时,也有一些注意事项需要知晓,请您在使用这些功能之前,了解每个功能的局限性以及每个功能正确的用法。

OpenVINO 工具套件下载地址:

https://www.intel.cn/content/www/cn/zh/developer/tools/openvino-toolkit/download.html

OpenVINO 使用文档: 

https://docs.openvino.ai/latest/

审核编辑 :李倩

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分