自动设备选择

自动设备(或简称 AUTO)是 OpenVINO™ 工具套件中一种新的特殊“虚拟”或“代理”设备,它不绑定到特定类型的硬件设备。AUTO 解决了为硬件设备选择(通过硬件设备)编写逻辑代码所需的应用复杂性,然后在该设备上推导出最佳优化设置。它通过自我发现系统中所有可用的加速器和功能来实现这一点,通过尊重新的“提示”配置 API 来匹配用户的性能要求,以分别动态地针对延迟或吞吐量进行优化。开发人员可一次性编写应用,并随时随地部署。对于想限制特定候选硬件的开发人员,AUTO 还提供设备优先级清单作为可选属性。开发人员设置设备优先级清单后,AUTO 将不会发现系统中所有可用的加速器,只会试用按优先级顺序排列的设备。

AUTO 总是选择最佳设备。如果在这个设备上编译模型失败,AUTO 会尝试在下一个最佳设备上编译,直到其中一个成功。如果设置优先级清单,AUTO 仅根据该清单选择设备。

使用以下逻辑选择最佳设备:

  1. 检查哪些支持设备可用。

  2. 检查输入模型的精度(有关精度的详细信息,请在 ov::device::capabilities 上了解更多信息)

  3. 选择第一个能够支持给定精度的设备,如下表所示。

  4. 如果模型的精度为 FP32,但没有能够支持它的设备,则将该模型分载到支持 FP16 的设备上。

选择优先级

支持的
设备
支持的
模型精度

1

dGPU
(例如英特尔锐炬® Xe MAX)
FP32、FP16、INT8、BIN

2

iGPU
(例如英特尔® 超核芯显卡 620 (iGPU))
FP32、FP16、BIN

3

英特尔® Movidius™ Myriad™ X 视觉处理器
(例如英特尔® 神经电脑棒 2(英特尔® NCS2))
FP16

4

英特尔® CPU
(例如英特尔® 酷睿™ i7-1165G7)
FP32、FP16、INT8、BIN

重要的是,AUTO 默认使用 CPU 进行推理,除非设置了优先级清单并且其中没有 CPU。CPU 提供非常低的延迟,并且可以在没有额外延迟的情况下开始推理。在执行推理时,自动设备插件继续将模型加载到最适合目标的设备中,并在准备好后将任务转移给它。这样,编译模型时速度慢得多的设备(GPU 就是最好的示例)不会在初始阶段妨碍推理。

_images/autoplugin_accelerate.png

这种机制可以在我们的基准测试应用示例(参阅此处)中轻松观察到,其中显示了使用 AUTO 时如何减少首次推理延迟(编译模型和执行首次推理所用的时间)。例如:

benchmark_app -m ../public/alexnet/FP32/alexnet.xml -d GPU -niter 128
benchmark_app -m ../public/alexnet/FP32/alexnet.xml -d AUTO -niter 128

假设机器上存在 CPU 和 GPU,“AUTO”的首次推理延迟会比“GPU”更好。

备注

进程运行的时间越长,实时性能就越接近最适合的设备。

使用自动设备插件

使用 AUTO 进行推理的配置与其他插件类似:在插件上编译模型,最后执行推理。

根据 OpenVINO™ 命名惯例,为自动设备插件分配了“AUTO”标签。可以在没有附加参数的情况下定义它,从而使用默认值,或者使用以下设置选项进一步配置:

属性

属性值

描述

<device candidate list>

AUTO:<device names>
逗号分隔,无空格



列出可供选择的设备。
设备顺序即视为优先级,
顺序为由高到低。
如果不指定,“AUTO”将用作默认值
并且将包括所有设备。

ov::device:priorities

设备名称
逗号分隔,无空格


指定自动设备插件要选择的设备。
设备顺序即视为优先级,
顺序为由高到低。
此配置是可选项。

ov::hint::performance_mode

ov::hint::PerformanceMode::LATENCY
ov::hint::PerformanceMode::THROUGHPUT
根据应用指定
首选性能模式。

ov::hint::model_priority

ov::hint::Priority::HIGH
ov::hint::Priority::MEDIUM
ov::hint::Priority::LOW
指示模型的优先级。
重要提示!
仍然不完全支持此属性

设备候选清单

设备候选清单让用户能够自定义优先级并限制可用于 AUTO 插件的设备的选择。如果未指定,插件假定系统中存在的所有设备都可以使用。请注意,OpenVINO™ 运行时允许您在函数调用中使用“GPU”作为“GPU.0”的别名。API 接受以下命令:

ov::Core core;

// Read a network in IR, PaddlePaddle, or ONNX format:
std::shared_ptr<ov::Model> model = core.read_model("sample.xml");

// compile a model on AUTO using the default list of device candidates.
// The following lines are equivalent:
ov::CompiledModel model0 = core.compile_model(model);
ov::CompiledModel model1 = core.compile_model(model, "AUTO");

// Optional
// You can also specify the devices to be used by AUTO.
// The following lines are equivalent:
ov::CompiledModel model3 = core.compile_model(model, "AUTO:GPU,CPU");
ov::CompiledModel model4 = core.compile_model(model, "AUTO", ov::device::priorities("GPU,CPU"));

//Optional
// the AUTO plugin is pre-configured (globally) with the explicit option:
core.set_property("AUTO", ov::device::priorities("GPU,CPU"));
    core = Core()

    # Read a network in IR, PaddlePaddle, or ONNX format:
    model = core.read_model(model_path)

    #  compile a model on AUTO using the default list of device candidates.
    #  The following lines are equivalent:
    compiled_model = core.compile_model(model=model)
    compiled_model = core.compile_model(model=model, device_name="AUTO")

    # Optional
    # You can also specify the devices to be used by AUTO.
    # The following lines are equivalent:
    compiled_model = core.compile_model(model=model, device_name="AUTO:GPU,CPU")
    compiled_model = core.compile_model(model=model, device_name="AUTO", config={"MULTI_DEVICE_PRIORITIES": "GPU,CPU"})

    # Optional
    # the AUTO plugin is pre-configured (globally) with the explicit option:
    core.set_property(device_name="AUTO", properties={"MULTI_DEVICE_PRIORITIES":"GPU,CPU"})

为了检查系统中存在哪些设备,您可以使用设备 API。有关如何执行此操作的信息,请查看查询设备属性和配置

对于 C++

ov::runtime::Core::get_available_devices() (see Hello Query Device C++ Sample)

对于 Python

openvino.runtime.Core.available_devices (see Hello Query Device Python Sample)

性能提示

ov::hint::performance_mode 属性使您能够为插件指定一种性能模式,以便在特定用例中更高效。

此模式优先考虑高吞吐量,在延迟和功率之间保持平衡。它最适合涉及多个作业的任务,例如视频源或大量图像的推理。

此模式优先考虑低延迟,为每个推理作业提供较短的响应时间。它最适合需要对单个输入图像进行推理的任务,例如超声扫描图像的医学分析。它还适合实时或近实时应用的任务,例如工业机器人对其环境中的动作做出响应或无人驾驶汽车自主避障。请注意,目前,只有 CPU 和 GPU 设备支持 ov::hint 属性。

要为您的应用启用性能提示,请使用以下代码:

ov::Core core;

// Read a network in IR, PaddlePaddle, or ONNX format:
std::shared_ptr<ov::Model> model = core.read_model("sample.xml");

// compile a model on AUTO with Performance Hints enabled:
// To use the “throughput” mode:
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO",
    ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT));
// or the “latency” mode:
ov::CompiledModel compiled_mode2 = core.compile_model(model, "AUTO",
    ov::hint::performance_mode(ov::hint::PerformanceMode::LATENCY));
    core = Core()
    # Read a network in IR, PaddlePaddle, or ONNX format:
    model = core.read_model(model_path)
    # compile a model on AUTO with Performance Hints enabled:
    # To use the “throughput” mode:
    compiled_model = core.compile_model(model=model, device_name="AUTO", config={"PERFORMANCE_HINT":"THROUGHPUT"})
    # or the “latency” mode:
    compiled_model = core.compile_model(model=model, device_name="AUTO", config={"PERFORMANCE_HINT":"LATENCY"})

该属性使您能够控制自动设备插件中的模型优先级。高优先级模型会加载到支持的高优先级设备中。较低优先级的模型不会加载到较高优先级模型占用的设备上。

// Example 1
ov::CompiledModel compiled_model0 = core.compile_model(model, "AUTO",
    ov::hint::model_priority(ov::hint::Priority::HIGH));
ov::CompiledModel compiled_model1 = core.compile_model(model, "AUTO",
    ov::hint::model_priority(ov::hint::Priority::MEDIUM));
ov::CompiledModel compiled_model2 = core.compile_model(model, "AUTO",
    ov::hint::model_priority(ov::hint::Priority::LOW));
/************
  Assume that all the devices (CPU, GPU, and MYRIAD) can support all the networks.
  Result: compiled_model0 will use GPU, compiled_model1 will use MYRIAD, compiled_model2 will use CPU.
 ************/

// Example 2
ov::CompiledModel compiled_model3 = core.compile_model(model, "AUTO",
    ov::hint::model_priority(ov::hint::Priority::LOW));
ov::CompiledModel compiled_model4 = core.compile_model(model, "AUTO",
    ov::hint::model_priority(ov::hint::Priority::MEDIUM));
ov::CompiledModel compiled_model5 = core.compile_model(model, "AUTO",
    ov::hint::model_priority(ov::hint::Priority::LOW));
/************
  Assume that all the devices (CPU, GPU, and MYRIAD) can support all the networks.
  Result: compiled_model3 will use GPU, compiled_model4 will use GPU, compiled_model5 will use MYRIAD.
 ************/
    core = Core()
    model = core.read_model(model_path)

    # Example 1
    compiled_model0 = core.compile_model(model=model, device_name="AUTO", config={"MODEL_PRIORITY":"HIGH"})
    compiled_model1 = core.compile_model(model=model, device_name="AUTO", config={"MODEL_PRIORITY":"MEDIUM"})
    compiled_model2 = core.compile_model(model=model, device_name="AUTO", config={"MODEL_PRIORITY":"LOW"})
    # Assume that all the devices (CPU, GPU, and MYRIAD) can support all the networks.
    # Result: compiled_model0 will use GPU, compiled_model1 will use MYRIAD, compiled_model2 will use CPU.

    # Example 2
    compiled_model3 = core.compile_model(model=model, device_name="AUTO", config={"MODEL_PRIORITY":"HIGH"})
    compiled_model4 = core.compile_model(model=model, device_name="AUTO", config={"MODEL_PRIORITY":"MEDIUM"})
    compiled_model5 = core.compile_model(model=model, device_name="AUTO", config={"MODEL_PRIORITY":"LOW"})
    # Assume that all the devices (CPU, GPU, and MYRIAD) can support all the networks.
    # Result: compiled_model3 will use GPU, compiled_model4 will use GPU, compiled_model5 will use MYRIAD.

配置单个设备并在顶部创建自动设备插件

尽管上述方法是当前使用 AUTO 执行推理的首选方法,但也可以使用以下步骤作为替代方法。它目前作为旧功能提供。如果设备候选清单包括 Myriad(无法使用性能提示选项的设备),则使用此方法。

ov::Core core;

// Read a network in IR, PaddlePaddle, or ONNX format:
std::shared_ptr<ov::Model> model = core.read_model("sample.xml");

// Configure  CPU and the MYRIAD devices when compiled model
ov::CompiledModel compiled_model = core.compile_model(model, "AUTO",
    ov::device::properties("CPU", cpu_config),
    ov::device::properties("MYRIAD", myriad_config));
    core = Core()
    model = core.read_model(model_path)
    core.set_property(device_name="CPU", properties={})
    core.set_property(device_name="MYRIAD", properties={})
    compiled_model = core.compile_model(model=model)
    compiled_model = core.compile_model(model=model, device_name="AUTO")

将 AUTO 与 OpenVINO™ 示例和基准测试应用结合使用

要了解如何在实践中使用自动设备插件并测试其性能,请查看 OpenVINO™ 样本。所有支持“-d”命令行选项(代表“设备”)的样本都将接受开箱即用的插件。基准测试应用将是一个完美的起点 — 它提供了插件的最佳性能,而无需额外设置,例如请求数或 CPU 线程数。为了评估 AUTO 性能,您可以使用以下命令:

对于无限的设备选择:

benchmark_app d AUTO m <model> -i <input> -niter 1000

对于有限的设备选择:

benchmark_app d AUTO:CPU,GPU,MYRIAD m <model> -i <input> -niter 1000

有关更多信息,请参阅 C++Python 版本说明。

备注

如果使用“-d AUTO”,默认的 CPU 流是 1。

您可以使用 FP16 IR 处理自动设备。

尚没有演示针对 AUTO 进行完全优化,例如通过选择最合适的设备、使用 GPU 流/过热降频等。