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 包