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 中源 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 上受支持,同时在集成 GPU (iGPU)、独立 GPU (dGPU) 上支持内核缓存。

此功能允许用户直接将 blob 文件保存并加载到硬件设备目标上,以提高推理延迟并执行推理。

集成 GPU (iGPU) 和独立 GPU (dGPU) 上的内核缓存

此功能还允许用户将内核缓存保存为具有动态输入形状的模型的 cl_cache 文件。这些 cl_cache 文件可以直接加载到集成 GPU (iGPU)/独立 GPU (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™。自动设备会根据设备功能和 ONNX 模型的特性(例如精度)从 CPU、集成 GPU、独立 Intel GPU(如果可用)和 NPU(如果可用)中识别并选择设备。然后自动设备将推理请求分配给所选设备。

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

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

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

异构执行允许在一个网络上在多个设备上进行推理计算。以异构模式执行网络的目的是:

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

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

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

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

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

有关 OpenVINO™ 多设备插件的更多信息,请参阅 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 优化传递

优化 NPU 设备的 ORT 量化模型,仅保留支持的操作的 QDQ,并优化性能和精度。通常,此功能在禁用 ORT 优化时会提供更好的性能/精度。有关使用这些运行时选项的更多信息,请参阅配置选项

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

load_config 功能旨在通过 JSON 输入模式加载 OpenVINO EP 参数,该模式必须遵循以下格式:

{
    "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 上下文节点仍能被创建。

这些更改允许使用会话上下文选项: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);

ONNX Runtime 图级别优化

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)、任何有效的异构组合、任何有效的多设备或自动设备组合 字符串 在运行时使用这些值覆盖加速器硬件类型。如果未明确设置此选项,则使用构建时指定的默认硬件。
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 上下文 void* 此选项仅在 OpenVINO EP 使用 OpenCL 标志构建时可用。它接受远程上下文,即 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 参数。
disable_dynamic_shapes 字符串 True/False(真/假) 布尔值 此选项允许在运行时将动态形状模型重写为静态形状并执行。
model_priority 字符串 LOW, MEDIUM, HIGH, DEFAULT(低、中、高、默认) 字符串 此选项配置哪些模型应分配给最佳资源。

有效的异构、多设备或自动设备组合: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 开放模型库的拓扑在 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

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

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

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

Python API

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

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

C/C++ API

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

C# API

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

博客/教程

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

OpenVINO 执行提供程序

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

Docker 容器

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

Python Pip Wheel 包