OpenVINO™ 执行提供程序

使用 Intel OpenVINO™ 执行提供程序在 Intel CPU、GPU、NPU 上加速 ONNX 模型。请参阅 此页面 了解支持的 Intel 硬件详情。

目录

安装

对于每个版本发布,Intel 会发布 ONNX Runtime OpenVINO™ 执行提供程序的预构建包和 Docker 镜像。

要求

ONNX Runtime OpenVINO™ 执行提供程序兼容 OpenVINO™ 的最近三个版本。

ONNX Runtime OpenVINO™ 注意
1.21.0 2025.0 详情
1.20.0 2024.4 详情
1.19.0 2024.3 详情
1.18.0 2024.1 详情
1.17.1 2023.3 详情

构建

有关构建说明,请参阅 构建页面

用法

为 Python 设置 OpenVINO™ 环境

请从 PyPi.org 下载 onnxruntime-openvino python 包。

pip install onnxruntime-openvino
  • Windows

    要在 Windows 上通过 ONNX Runtime 启用 OpenVINO™ 执行提供程序,必须使用 OpenVINO™ 完整安装包设置 OpenVINO™ 环境变量。如下所示,通过运行 setupvars 脚本初始化 OpenVINO™ 环境。这是必需的步骤。

        C:\ <openvino_install_directory>\setupvars.bat
    
  • Linux

    在 Linux 上通过 PyPi.org 安装的 ONNX Runtime OpenVINO™ 执行提供程序附带预构建的 OpenVINO™ 库并支持标志 CXX11_ABI=0。因此无需单独安装 OpenVINO™。

    但如果需要启用 OpenVINO 的 CX11_ABI=1 标志,请从源代码构建 Onnx Runtime Python wheel 包。有关构建说明,请参阅 构建页面。从源代码构建的 Linux 版 OpenVINO™ 执行提供程序 wheel 包不包含预构建的 OpenVINO™ 库,因此我们必须使用 OpenVINO™ 完整安装包设置 OpenVINO™ 环境变量。

    ```
    $ source <openvino_install_directory>/setupvars.sh
    ```
    

为 C++ 设置 OpenVINO™ 环境

要运行使用 OpenVINO™ 执行提供程序的 C++/C# ORT 示例,必须使用 OpenVINO™ 完整安装包设置 OpenVINO™ 环境变量。如下所示,通过运行 setupvars 脚本初始化 OpenVINO™ 环境。这是必需的步骤。

  • 对于 Windows,运行
     C:\ <openvino_install_directory>\setupvars.bat
    
  • 对于 Linux,运行
     $ source <openvino_install_directory>/setupvars.sh
    

    注意: 如果你使用 Dockerfile 来使用 OpenVINO™ 执行提供程序,在 Dockerfile 中无法 source OpenVINO™。你必须显式设置 LD_LIBRARY_PATH 指向 OpenVINO™ 库的位置。请参阅我们的 Dockerfile

为 C# 设置 OpenVINO™ 环境

要将 OpenVINO 执行提供程序用于 C# API,请创建自定义 Nuget 包。按照 此处的说明 安装 Nuget 创建的先决条件。安装先决条件后,按照说明 构建 OpenVINO 执行提供程序 并添加额外的标志 --build_nuget 以创建 Nuget 包。将创建两个 Nuget 包:Microsoft.ML.OnnxRuntime.Managed 和 Microsoft.ML.OnnxRuntime.Openvino。

功能

GPU 设备的 OpenCL 队列节流

为 GPU 设备启用 OpenCL 队列节流。在将 OpenVINO EP 用于 GPU 时降低 CPU 利用率。

模型缓存

OpenVINO™ 支持 模型缓存

模型缓存功能在 CPU、NPU、GPU 以及 iGPU、dGPU 上的内核缓存均受支持。

此功能使用户能够直接将 blob 文件保存并加载到目标硬件设备上,从而以改进的推理延迟执行推理。

iGPU 和 dGPU 上的内核缓存

此功能还允许用户将具有动态输入形状的模型的内核缓存保存为 cl_cache 文件。这些 cl_cache 文件可以直接加载到 iGPU/dGPU 硬件设备目标上并执行推理。

通过使用 C++/Python API 的运行时选项启用模型缓存。

通过设置运行时配置选项 'cache_dir' 并指定转储和加载 blob (CPU, NPU, iGPU, dGPU) 或 cl_cache (iGPU, dGPU) 的路径,可以使用 C++/Python API 启用此流程。

有关使用这些运行时选项的更多信息,请参阅 配置选项

支持 INT8 量化模型

INT8 模型在 CPU、GPU 和 NPU 上受支持。

支持保存在外部文件中的权重

OpenVINO™ 执行提供程序现在支持将权重存储在外部文件中的 ONNX 模型。由于 protobuf 的限制,这对于大于 2GB 的模型尤其有用。

请参阅 OpenVINO™ ONNX 支持文档

将 ONNX 模型转换为外部数据并保存:使用 ONNX API。文档

示例

import onnx
onnx_model = onnx.load("model.onnx") # Your model in memory as ModelProto
onnx.save_model(onnx_model, 'saved_model.onnx', save_as_external_data=True, all_tensors_to_one_file=True, location='data/weights_data', size_threshold=1024, convert_attribute=False)

注意

  1. 在上述脚本中,model.onnx 被加载,然后保存到名为 ‘saved_model.onnx’ 的文件中,该文件不包含权重,但这个新的 onnx 模型现在将包含权重文件所在的相对路径。权重文件 ‘weights_data’ 现在将包含模型的权重,原始模型中的权重保存在 /data/weights_data 中。

  2. 现在,您可以使用此 ‘saved_model.onnx’ 文件通过您的示例进行推理。但请记住,权重文件的位置不能更改。权重必须存在于 /data/weights_data。

  3. 使用 pip 安装最新的 ONNX Python 包,以成功运行这些 ONNX Python API。

支持 IO 缓冲区优化

要启用 IO 缓冲区优化,我们必须在构建前设置 OPENCL_LIBS, OPENCL_INCS 环境变量。对于 IO 缓冲区优化,模型必须在 OpenVINO™ 上完全受支持,并且我们必须在远程上下文中提供 cl_context void 指针作为 C++ 配置选项。我们可以使用 GPU 内存分配器提供 cl::Buffer 地址作为输入和输出。

示例

//Set up a remote context
cl::Context _context;
.....
// Set the context through openvino options
std::unordered_map<std::string, std::string> ov_options;
ov_options[context] = std::to_string((unsigned long long)(void *) _context.get());
.....
//Define the Memory area
Ort::MemoryInfo info_gpu("OpenVINO_GPU", OrtAllocatorType::OrtDeviceAllocator, 0, OrtMemTypeDefault);
//Create a shared buffer , fill in with data
cl::Buffer shared_buffer(_context, CL_MEM_READ_WRITE, imgSize, NULL, &err);
....
//Cast it to void*, and wrap it as device pointer for Ort::Value
void *shared_buffer_void = static_cast<void *>(&shared_buffer);
Ort::Value inputTensors = Ort::Value::CreateTensor(
        info_gpu, shared_buffer_void, imgSize, inputDims.data(),
        inputDims.size(), ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT);

OpenVINO™ 执行提供程序的多线程

ONNX Runtime 的 OpenVINO™ 执行提供程序实现了线程安全的深度学习推理

OpenVINO™ 执行提供程序的多流

ONNX Runtime 的 OpenVINO™ 执行提供程序允许执行多个流以满足 API 2.0 的不同性能要求

OpenVINO™ 执行提供程序的自动设备执行

使用 AUTO:<设备 1>,<设备 2>.. 作为设备名称,将实际加速器的选择委托给 OpenVINO™。Auto-device 根据设备能力和 ONNX 模型的特性(例如精度),在内部识别并选择 CPU、集成 GPU、独立 Intel GPU(可用时)和 NPU(可用时)等设备。然后 Auto-device 将推理请求分配给选定的设备。

从应用程序的角度来看,这只是另一个处理整个系统中所有加速器的设备。

有关 OpenVINO™ Auto-Device 插件的更多信息,请参阅 Intel OpenVINO™ 自动设备插件

OpenVINO™ 执行提供程序的异构执行

异构执行使得在多个设备上对单个网络进行推理计算成为可能。在异构模式下执行网络的目的是

  • 利用加速器的能力,在加速器上计算网络中最重的部分,并在 CPU 等回退设备上执行不受支持的层,以便在一次推理过程中更有效地利用所有可用硬件。

有关 OpenVINO™ Heterogeneous 插件的更多信息,请参阅 Intel OpenVINO™ 异构插件

OpenVINO™ 执行提供程序的多设备执行

Multi-Device 插件自动将推理请求分配给可用的计算设备以并行执行请求。潜在的收益如下:

  • 提高多个设备可以提供的吞吐量(与单设备执行相比)
  • 更一致的性能,因为设备现在可以分担推理负担(以便一个设备变得过于繁忙时,另一个设备可以承担更多负载)

有关 OpenVINO™ Multi-Device 插件的更多信息,请参阅 Intel OpenVINO™ 多设备插件

导出 OpenVINO 编译的 Blob

将 OpenVINO 编译的 blob 导出为 ONNX 模型。将此 ONNX 模型用于后续推理可避免模型重新编译,并可能对会话创建时间产生积极影响。此功能目前仅对完全受支持的模型启用。它符合 ORT 会话配置键。

  Ort::SessionOptions session_options;

      // Enable EP context feature to dump the partitioned graph which includes the EP context into Onnx file.
      // "0": disable. (default)
      // "1": enable.

  session_options.AddConfigEntry(kOrtSessionOptionEpContextEnable, "1");

      // Flag to specify whether to dump the EP context into single Onnx model or pass bin path.
      // "0": dump the EP context into separate file, keep the file name in the Onnx model.
      // "1": dump the EP context into the Onnx model. (default).

  session_options.AddConfigEntry(kOrtSessionOptionEpContextEmbedMode, "1");

      // Specify the file path for the Onnx model which has EP context.
      // Defaults to <actual_model_path>/original_file_name_ctx.onnx if not specified

  session_options.AddConfigEntry(kOrtSessionOptionEpContextFilePath, ".\ov_compiled_epctx.onnx");

  sess = onnxruntime.InferenceSession(<path_to_model_file>, session_options)

有关会话选项的更多信息,请参阅 会话选项

启用 QDQ 优化 Passes

优化用于 NPU 设备的 ORT 量化模型,仅保留受支持算子的 QDQ,并优化性能和准确性。通常,禁用 ORT 优化后,此功能将提供更好的性能/准确性。有关使用这些运行时选项的更多信息,请参阅 配置选项

运行时加载自定义 JSON OpenVINO™ 配置

开发 load_config 功能是为了方便使用 JSON 输入 schema 加载 OpenVINO EP 参数,该 schema 必须遵循以下格式 -

{
    "DEVICE_KEY": {"PROPERTY": "PROPERTY_VALUE"}
}

其中 “DEVICE_KEY” 可以是 CPU、NPU 或 GPU,“PROPERTY” 必须是 OpenVINO™ 支持属性 中定义的有效实体,“PROPERTY_VALUE” 必须是作为字符串传入的有效对应支持属性值。

如果使用无效键设置属性(即,不是 OpenVINO™ 支持属性 一部分且无法识别的键),它将被忽略,并记录一条警告。然而,如果使用有效属性键但分配了无效值(例如,期望整数但提供了非整数),则 OpenVINO™ 框架将在执行期间导致异常。

有效属性有两种类型:可变 (读/写) 和不可变 (只读),这些在设置时也受此约束。如果正在设置不可变属性,我们将跳过设置并发出类似警告。

有关设置适当的 "PROPERTY",请参阅针对 CPUGPUNPUAUTO 的 OpenVINO 配置选项。

示例

使用 onnxruntime_perf_test 应用程序使用此功能的用法如下 –

onnxruntime_perf_test.exe -e openvino -m times -r 1 -i "device_type|NPU load_config|test_config.json" model.onnx

OpenVINO 执行提供程序支持跨会话的 EP 权重共享

ONNX Runtime 中的 OpenVINO 执行提供程序 (OVEP) 支持 EP 权重共享,使得模型能够有效地在多个推理会话之间共享权重。此功能通过预填充和 KV 缓存增强大型语言模型 (LLM) 的执行,在运行多个推理时减少内存消耗并提高性能。

通过 EP 权重共享,预填充和 KV 缓存模型现在可以重用同一组权重,最大程度地减少冗余并优化推理。此外,这确保即使模型进行子图分区,仍会创建 EP Context 节点。

这些更改通过会话上下文选项 ep.share_ep_contexts 启用两个模型之间的权重共享。有关配置此运行时选项的更多详情,请参阅 会话选项

OVEP 支持 CreateSessionFromArray API

ONNX Runtime 中的 OpenVINO 执行提供程序 (OVEP) 支持使用 CreateSessionFromArray API 从内存创建会话。这允许直接从内存缓冲区加载模型,而不是文件路径。CreateSessionFromArray 将模型加载到内存中,然后从内存中的字节数组创建会话。

注意:使用 CreateSessionFromArray API 通过 perf_test 运行推理时,请使用 -l 参数。

配置选项

OpenVINO™ 执行提供程序可以在运行时通过某些选项进行配置,这些选项控制 EP 的行为。这些选项可以设置为键值对,如下所示:-

Python API

配置选项的键值对可以使用 InferenceSession API 进行设置,如下所示:-

session = onnxruntime.InferenceSession(<path_to_model_file>, providers=['OpenVINOExecutionProvider'], provider_options=[{Key1 : Value1, Key2 : Value2, ...}])

请注意,从 (ORT 1.10) 开始的版本将要求在实例化 InferenceSession 时,如果你想使用除默认 CPU 提供程序以外的执行提供程序,则需要显式设置 providers 参数(这与提供程序根据构建标志默认设置/注册的当前行为不同)。

C/C++ API 2.0

会话配置选项传递给 SessionOptionsAppendExecutionProvider API,如下面 GPU 设备类型的示例所示

std::unordered_map<std::string, std::string> options;
options[device_type] = "GPU";
options[precision] = "FP32";
options[num_of_threads] = "8";
options[num_streams] = "8";
options[cache_dir] = "";
options[context] = "0x123456ff";
options[enable_qdq_optimizer] = "True";
options[load_config] = "config_path.json";
session_options.AppendExecutionProvider_OpenVINO_V2(options);

C/C++ 旧版 API

注意:此 API 不再正式支持。建议用户迁移到 V2 API。

会话配置选项传递给 SessionOptionsAppendExecutionProvider_OpenVINO() API,如下面 GPU 设备类型的示例所示

OrtOpenVINOProviderOptions options;
options.device_type = "GPU_FP32";
options.num_of_threads = 8;
options.cache_dir = "";
options.context = 0x123456ff;
options.enable_opencl_throttling = false;
SessionOptions.AppendExecutionProvider_OpenVINO(session_options, &options);

Onnxruntime 图级别优化

OpenVINO™ 后端对图执行依赖于硬件和独立于硬件的优化,以便在目标硬件上以最佳性能进行推理。在大多数情况下,已观察到直接传递 ONNX 输入图而不进行显式优化,将由 OpenVINO™ 在内核级别进行最佳优化。因此,建议关闭 ONNX Runtime 为 OpenVINO™ 执行提供程序执行的高级优化。这可以使用 SessionOptions() 完成,如下所示:-

  • Python API

     options = onnxruntime.SessionOptions()
     options.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_DISABLE_ALL
     sess = onnxruntime.InferenceSession(<path_to_model_file>, options)
    
  • C/C++ API

     SessionOptions::SetGraphOptimizationLevel(ORT_DISABLE_ALL);
    

选项摘要

下表列出了 API 2.0 的所有可用配置选项以及用于设置它们的键值对

键类型 允许的值 值类型 描述
device_type 字符串 CPU, NPU, GPU, GPU.0, GPU.1 (取决于可用的 GPU), NPU, 任何有效的 Hetero 组合, 任何有效的 Multi 或 Auto 设备组合 字符串 在运行时用这些值覆盖加速器硬件类型。如果未显式设置此选项,则使用构建时指定的默认硬件。
precision 字符串 FP32, FP16, ACCURACY (取决于选择的 device_type) 字符串 硬件支持的精度 {CPU:FP32, GPU:[FP32, FP16, ACCURACY], NPU:FP16}。为优化性能而设置的硬件默认精度 {CPU:FP32, GPU:FP16, NPU:FP16}。要以默认输入精度执行模型,请选择 ACCURACY 精度类型。
num_of_threads 字符串 任意非零无符号正数 size_t 在运行时用此值覆盖加速器默认的线程数值。如果未显式设置此选项,推理将使用构建时默认值 8。
num_streams 字符串 任意非零无符号正数 size_t 在运行时用此值覆盖加速器默认流。如果未显式设置此选项,推理将使用构建时默认值 1,用于延迟性能。
cache_dir 字符串 目标硬件上的任意有效字符串路径 字符串 显式指定用于保存和加载 blob 的路径,启用模型缓存功能。
context 字符串 OpenCL Context void* 仅当使用启用 OpenCL 标志构建 OpenVINO EP 时,此选项才可用。它接受远程上下文,即 cl_context 地址作为 void 指针。
enable_opencl_throttling 字符串 True/False 布尔型 此选项为 GPU 设备启用 OpenCL 队列节流(在使用 GPU 时降低 CPU 利用率)。
enable_qdq_optimizer 字符串 True/False 布尔型 此选项启用 QDQ 优化以提高 NPU 上的模型性能和准确性。
load_config 字符串 任意自定义 JSON 路径 字符串 此选项启用在运行时加载自定义 JSON OV 配置的功能,该功能设置 OV 参数。

有效的 Hetero 或 Multi 或 Auto 设备组合: HETERO:<设备 1>,<设备 2>... device 可以是此列表中的任意设备 ['CPU','GPU', 'NPU']

对于有效的 HETERO、MULTI 或 AUTO 设备构建,应至少指定两个 DEVICE_TYPE。

示例: HETERO:GPU,CPU AUTO:GPU,CPU MULTI:GPU,CPU

已弃用的 device_type 选项: CPU_FP32, GPU_FP32, GPU_FP16, NPU_FP16 不再受支持。它们将在未来的版本中被弃用。请升级到最新的 device_type 和 precision 选项。

支持覆盖范围

使用 OpenVINO 支持的 ONNX 层

下表显示了使用 OpenVINO™ 执行提供程序支持和验证的 ONNX 层。下表还列出了每个层支持的 Intel 硬件。CPU 指的是 Intel® Atom, Core, 和 Xeon 处理器。GPU 指的是 Intel 集成显卡和 Intel 独立显卡。对于 NPU,如果某个算子不受支持,我们将回退到 CPU。

ONNX 层 CPU GPU
Abs
Acos
Acosh
Add
And
ArgMax
ArgMin
Asin
Asinh
Atan
Atanh
AveragePool
BatchNormalization
BitShift
Ceil
Celu
Cast
Clip
Concat
Constant
ConstantOfShape
Conv
ConvInteger
ConvTranspose
Cos
Cosh
CumSum
DepthToSpace
DequantizeLinear
Div
Dropout
Einsum
Elu
Equal
Erf
Exp
Expand
EyeLike
Flatten
Floor
Gather
GatherElements
GatherND
Gemm
GlobalAveragePool
GlobalLpPool
GlobalMaxPool
Greater
GreaterOrEqual
GridSample
HardMax
HardSigmoid
Identity
If
ImageScaler
InstanceNormalization
LeakyRelu
Less
LessOrEqual
Log
LogSoftMax
Loop
LRN
LSTM
MatMul
MatMulInteger
Max
MaxPool
Mean
MeanVarianceNormalization
Min
Mod
Mul
Neg
NonMaxSuppression
NonZero
Not
OneHot
Or
Pad
Pow
PRelu
QuantizeLinear
QLinearMatMul
Range
Reciprocal
ReduceL1
ReduceL2
ReduceLogSum
ReduceLogSumExp
ReduceMax
ReduceMean
ReduceMin
ReduceProd
ReduceSum
ReduceSumSquare
Relu
Reshape
Resize
ReverseSequence
RoiAlign
Round
Scatter
ScatterElements
ScatterND
Selu
Shape
Shrink
Sigmoid
Sign
Sin
Sinh
SinFloat
Size
Slice
Softmax
Softplus
Softsign
SpaceToDepth
Split
Sqrt
Squeeze
Sub
Sum
Softsign
Tan
Tanh
ThresholdedRelu
Tile
TopK
Transpose
Unsqueeze
Upsample
Where
Xor

拓扑支持

ONNX open model zoo 中的以下拓扑结构已在 OpenVINO™ 执行提供程序上完全受支持,更多拓扑结构通过子图分区得到支持。对于 NPU,如果模型不受支持,我们将回退到 CPU。

图像分类网络

模型名称 CPU GPU
bvlc_alexnet
bvlc_googlenet
bvlc_reference_caffenet
bvlc_reference_rcnn_ilsvrc13
emotion ferplus
densenet121
inception_v1
inception_v2
mobilenetv2
resnet18v2
resnet34v2
resnet101v2
resnet152v2
resnet50
resnet50v2
shufflenet
squeezenet1.1
vgg19
zfnet512
mxnet_arcface

图像识别网络

模型名称 CPU GPU
mnist

对象检测网络

模型名称 CPU GPU
tiny_yolov2
yolov3
tiny_yolov3
mask_rcnn
faster_rcnn
yolov4
yolov5
yolov7
tiny_yolov7

图像处理网络

模型名称 CPU GPU
mosaic
candy
cgan
rain_princess
pointilism
udnie

自然语言处理网络

模型名称 CPU GPU
bert-squad
bert-base-cased
bert-base-chinese
bert-base-japanese-char
bert-base-multilingual-cased
bert-base-uncased
distilbert-base-cased
distilbert-base-multilingual-cased
distilbert-base-uncased
distilbert-base-uncased-finetuned-sst-2-english
gpt2
roberta-base
roberta-base-squad2
t5-base
twitter-roberta-base-sentiment
xlm-roberta-base

NPU 支持的模型

模型名称 NPU
yolov3
microsoft_resnet-50
realesrgan-x4
timm_inception_v4.tf_in1k
squeezenet1.0-qdq
vgg16
caffenet-qdq
zfnet512
shufflenet-v2
zfnet512-qdq
googlenet
googlenet-qdq
caffenet
bvlcalexnet-qdq
vgg16-qdq
mnist
ResNet101-DUC
shufflenet-v2-qdq
bvlcalexnet
squeezenet1.0

注意:我们已添加对 INT8 模型的支持,这些模型是使用神经网络压缩框架 (NNCF) 量化的。要了解更多关于 NNCF 的信息,请参考此处

OpenVINO™ 执行提供程序示例教程

为了展示如何使用 ONNX Runtime 的 OpenVINO™ 执行提供程序,我们创建了一些示例,展示了如何仅用一行额外的代码即可获得您所需的性能提升。

Python API

使用 tinyYOLOv2 在 Python 中进行对象检测

使用 YOLOv4 在 Python 中进行对象检测

C/C++ API

使用 Squeezenet 在 C++ 中进行图像分类

C# API

使用 YOLOv3 在 C# 中进行对象检测

博客/教程

ONNX Runtime 的 OpenVINO 执行提供程序概述

OpenVINO 执行提供程序

关于如何使用 ONNX Runtime OpenVINO™ 执行提供程序 Docker 容器的教程

Docker 容器

关于如何使用 ONNX Runtime OpenVINO™ 执行提供程序 Python Wheel 包的教程

Python Pip Wheel 包