OpenVINO™ 执行提供程序
使用英特尔 OpenVINO™ 执行提供程序加速在英特尔 CPU、GPU、NPU 上的 ONNX 模型。有关支持的英特尔硬件的详细信息,请参阅此页面。
目录
安装
英特尔为每个版本发布了用于 ONNX Runtime 的 OpenVINO™ 执行提供程序的预构建软件包和 Docker 镜像。
- 用于 ONNX Runtime 的 OpenVINO™ 执行提供程序发布页面:最新 v5.4 版本
- Python wheels Ubuntu/Windows: onnxruntime-openvino
- Docker 镜像: openvino/onnxruntime_ep_ubuntu20
要求
ONNX Runtime OpenVINO™ 执行提供程序与 OpenVINO™ 的三个最新版本兼容。
构建
有关构建说明,请参阅 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)
注意
-
在上面的脚本中,加载 model.onnx,然后将其保存到名为 'saved_model.onnx' 的文件中,该文件不会包含权重,但这个新的 onnx 模型现在将具有权重文件所在位置的相对路径。权重文件 'weights_data' 现在将包含模型的权重,原始模型的权重将保存在 /data/weights_data 中。
-
现在,您可以使用此 'saved_model.onnx' 文件使用您的示例进行推理。但请记住,权重文件位置无法更改。权重必须存在于 /data/weights_data
-
使用 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
对于有效的 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 进行对象检测