0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenCV学堂 来源:英特尔物联网 2023-03-24 10:33 次阅读

本文简介

当你使用 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 做的对比实验:

9026d99a-c9bc-11ed-bfe3-dac502259ad0.png

图1:Disable Auto-batching

904d3c34-c9bc-11ed-bfe3-dac502259ad0.png

图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

向右滑动查看完整代码

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

908e7708-c9bc-11ed-bfe3-dac502259ad0.png

912b857a-c9bc-11ed-bfe3-dac502259ad0.png

91af5544-c9bc-11ed-bfe3-dac502259ad0.png

图例:输入图像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

向右滑动查看完整代码

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

91c29a0a-c9bc-11ed-bfe3-dac502259ad0.png

926c3d62-c9bc-11ed-bfe3-dac502259ad0.png

92a4be62-c9bc-11ed-bfe3-dac502259ad0.png

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

通过 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})

向右滑动查看完整代码

总结

92b8cb32-c9bc-11ed-bfe3-dac502259ad0.png

针对不同模型推理场景下, 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/

审核编辑 :李倩

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

    关注

    87

    文章

    26472

    浏览量

    264107
  • 模型
    +关注

    关注

    1

    文章

    2707

    浏览量

    47707
  • 线程
    +关注

    关注

    0

    文章

    490

    浏览量

    19500

原文标题:OpenVINO™ 中用于推理优化的自适应参数选择功能介绍 | 开发者实战

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于粒子群算法的自适应LMS滤波器设计及可重构硬件实现

    自适应滤波器设计是典型的多参数组合优化问题,利用一种改进的粒子群优化算法(MPSO)来优化设计自适应
    发表于 04-26 16:13

    【新功能】媒体处理MPS全新支持自适应多码率、多语言音轨

    客户的需求,阿里云媒体处理MPS产品在目前已经全面支持自适应多视频码率、多语言音轨和字幕等功能功能优势与适用场景自适应多码率:根据用户实际网络带宽条件,自动匹配视频流,兼顾清晰度和流
    发表于 04-25 15:13

    自适应逆变电源的设计与实现

    应用。  (5)该方案更为有利的是,在设计时不必知道PWM逆变电源系统确切的数学模型,而只需在应用中用实时辨识的模型代替。这就提供了一条途径,使得自适应控制方法能直接应用于传统的模拟控制的PWM逆变电源中,进而
    发表于 10-11 16:07

    【MAX40056申请】变频参数自适应

    项目名称:变频参数自适应试用计划:变频电机参数识别,适应,提高识别精度,确保运行可靠性。
    发表于 09-02 11:06

    有什么方法可以优化自适应转向大灯系统的设计吗?

    有什么方法可以优化自适应转向大灯系统的设计吗?
    发表于 05-14 06:14

    如何在OpenVINO工具包中使用带推理引擎的blob?

    无法确定如何在OpenVINO™工具包中使用带推理引擎的 blob。
    发表于 08-15 07:17

    在Raspberry Pi上从源代码构建OpenVINO 2021.3收到错误怎么解决?

    在 Raspberry Pi 上从源代码构建 OpenVINO™2021.3。 运行OpenVINO推理,并收到错误消息: ModuleNotFoundError:没有
    发表于 08-15 08:24

    keras内置的7个常用的优化介绍

    = params - learning_rate * params_grad 2 自适应学习率类 梯度下降算法需要选择固定的学习率,但是很难选择合适的学习率,太大或太小都不适合,相同的学习率不适
    发表于 08-18 06:32

    LabVIEW开发自适应降噪ANC

    LabVIEW开发自适应降噪ANC 在许多情况下,信号很嘈杂,必须消除噪声。自适应降噪(ANC)是可用于消除信号噪声的主要实时方法之一。可以使用LabVIEW自适应滤滤器工具包来设计A
    发表于 11-30 19:38

    基于遗传优化和模糊推理PID参数及MATLAB仿真

    本文提出一种基于遗传优化和模糊推理相结合的自适应模糊PID 控制算法,算法由遗传算法和模糊推理两部分构成,分别用于离线
    发表于 09-03 08:42 58次下载

    基于反馈的自适应参考帧选择的率失真优化分析

    为了提高数字视频实时传输的容差能力,该文提出了一种基于反馈的自适应参考帧选择方法。在传统参考帧选择优点的基础上,设计了一种新的通过率失真技术优化选择
    发表于 11-17 13:02 5次下载

    自适应神经模糊推理系统(ANFIS)及其仿真

    以一个非线性模型为研究对象,通过对自适应神经模糊推理系统(ANFIS)建模机理的研究建立了非线性实例模糊模型,借助MATLAB中ANFIS的功能讨论隶属度函数的数目、ANFIS输出、训练误差
    发表于 03-31 10:56 0次下载
    <b class='flag-5'>自适应</b>神经模糊<b class='flag-5'>推理</b>系统(ANFIS)及其仿真

    自适应粒子群优化分数阶PID控制器的参数整定

    自适应粒子群优化分数阶PID控制器的参数整定_陈超波
    发表于 01-03 15:24 8次下载

    一种新的自适应变异粒子群优化算法在PMSM参数辨识中的应用

    一种新的自适应变异粒子群优化算法在PMSM参数辨识中的应用_黄松
    发表于 01-05 15:34 0次下载

    自适应双层粒子群优化算法_周志勇

    自适应双层粒子群优化算法_周志勇
    发表于 01-07 20:32 0次下载