OpenVINO™ 执行提供程序

使用英特尔 OpenVINO™ 执行提供程序加速在英特尔 CPU、GPU、NPU 上的 ONNX 模型。有关支持的英特尔硬件的详细信息,请参阅页面。

目录

安装

英特尔为每个版本发布了用于 ONNX Runtime 的 OpenVINO™ 执行提供程序的预构建软件包和 Docker 镜像。

要求

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

ONNX Runtime OpenVINO™ 注意
1.19.0 2024.3 详细信息
1.18.0 2024.1 详细信息
1.17.1 2023.3 详细信息

构建

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

用法

为 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

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

    但是,如果需要启用 OpenVINO 的 CX11_ABI=1 标志,请从源代码构建 Onnx Runtime python wheel 软件包。有关构建说明,请参阅 BUILD 页面。从源代码构建的 Linux 上的 OpenVINO™ 执行提供程序 wheels 将不包含预构建的 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 中 sourcing OpenVINO™。您必须显式设置 LD_LIBRARY_PATH 以指向 OpenVINO™ 库位置。请参阅我们的 dockerfile

为 C# 设置 OpenVINO™ 环境

要使用 openvino 执行提供程序的 csharp 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' 来启用此流程,指定在使用 c++/python API 时转储和加载 blob(CPU、NPU、iGPU、dGPU)或 cl_cache(iGPU、dGPU)的路径。

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

支持 INT8 量化模型

CPU、GPU 和 NPU 上均支持 Int8 模型。

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

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

请参阅 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 EP 的自动设备执行

使用 AUTO:<device 1><device 2>.. 作为设备名称,将实际加速器的选择委派给 OpenVINO™。自动设备内部识别并从 CPU、集成 GPU、独立英特尔 GPU(如果可用)和 NPU(如果可用)中选择设备,具体取决于设备功能和 CNN 模型的特性,例如精度。然后,自动设备将推理请求分配给选定的设备。

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

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

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

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

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

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

OpenVINO EP 的多设备执行

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

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

有关 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 优化 Pass

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

配置选项

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

Python API

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

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

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

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_opencl_throttling] = "false";
session_options.AppendExecutionProvider("OpenVINO", options);

C/C++ 传统 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 字符串 HW 支持的精度 {CPU:FP32, GPU:[FP32, FP16, ACCURACY], NPU:FP16}。优化性能的 HW 的默认精度 {CPU:FP32, GPU:FP16, NPU:FP16}。要使用默认输入精度执行模型,请选择 ACCURACY 精度类型。
num_of_threads 字符串 任何非 0 的无符号正数 size_t 在运行时使用此值覆盖加速器线程数的默认值。如果未显式设置此选项,则将在推理时使用构建期间的默认值 8。
num_streams 字符串 任何非 0 的无符号正数 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 上的模型性能和准确性。

有效的 Hetero 或 Multi 或 Auto 设备组合:HETERO,,... 它可以是此列表 ['CPU'、'GPU'、'NPU'] 中的任何设备

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

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

已弃用的 device_type 选项:CPU_FP32、GPU_FP32、GPU_FP16 仍然受支持。它将在未来的版本中弃用。请升级到最新的 device_type 和 precision 选项。

支持范围

使用 OpenVINO 支持的 ONNX 层

下表显示了使用 OpenVINO™ 执行提供程序支持和验证的 ONNX 层。下表还列出了每个层的英特尔硬件支持。CPU 指的是英特尔® Atom、酷睿和至强处理器。GPU 指的是英特尔集成显卡。英特尔独立显卡。对于 NPU,如果不支持某个操作,我们将回退到 CPU。

ONNX Layers 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

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

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

为了展示您可以使用用于 ONNX Runtime 的 OpenVINO™ 执行提供程序做什么,我们创建了一些示例,这些示例展示了如何通过仅添加一行代码来获得您正在寻求的性能提升。

Python API

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

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

C/C++ API

在 CPP 中使用 Squeezenet 进行图像分类

Csharp API

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

博客/教程

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

OpenVINO 执行提供程序

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

Docker 容器

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

Python Pip Wheel 包