文章作者: 周兆靖

当你使用 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::hint::num_requests 参数可以将推理线程设为4:

    auto compiled_model = core.compile_model(model, "GPU" , ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT), ov::hint::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::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT), ov::hint::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::hint::performance_mode(ov::hint::PerformanceMode:: 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::hint::performance_mode(ov::hint::PerformanceMode:: CUMULATIVE_THROUGHPUT));

    向右滑动查看完整代码

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

    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

    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 为固定尺寸后进行模型推理

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

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

    向右滑动查看完整代码

    <net name= "saved_model" version= "11" > <layers> <layer id= "0" name= "input" type= "Parameter" version= "opset1" > <data shape= "?,?,?,3" element_type= "f32" /> <output> <dim> -1 </dim> <dim> -1 </dim> <dim> -1 </dim> <dim> 3 </dim> </port> </output> </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/ 返回搜狐,查看更多

    责任编辑:

    声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
    发布于: 山西省