XNNPACK 執行提供程式

使用 ONNX Runtime 和 XNNPACK 執行提供程式,在 Android/iOS 裝置和 WebAssembly 上加速 ONNX 模型。XNNPACK 是一個高度最佳化的浮點神經網路推理運算元庫,適用於基於 Arm®、WebAssembly 和 x86 平臺。

目錄

安裝

包含 XNNPACK EP 的 ONNX Runtime 預構建軟體包 (onnxruntime-android) 已釋出到 Maven,供 Android 使用。有關安裝說明,請參閱此處

包含 XNNPACK EP 的 ONNX Runtime 預構建二進位制檔案(onnxruntime-objconnxruntime-c)已釋出到 CocoaPods,供 iOS 使用。有關安裝說明,請參閱此處

構建

有關構建包含 XNNPACK EP 的軟體包的說明,請參閱構建頁面

您可以為 Android、iOS、Windows 和 Linux 構建包含 XNNPACK EP 的 ONNX Runtime。

用法

ONNX Runtime API 詳情請參閱此處

XNNPACK EP 可透過 C、C++ 或 Java API 使用。

在建立推理會話時,必須顯式註冊 XNNPACK EP。例如:

Ort::Env env = Ort::Env{ORT_LOGGING_LEVEL_ERROR, "Default"};
Ort::SessionOptions so;
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
Ort::Session session(env, model_path, so);

配置選項

XNNPACK 具有獨立的內部執行緒池,這可能導致與 ORT 運算元內執行緒池的競爭。為儘量減少這種情況,我們建議設定以下選項:

  1. 透過將會話選項新增以下內容來停用 ORT 運算元內執行緒池的自旋:
     so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0");
    
  2. 在註冊 XNNPACK EP 時設定 XNNPACK 運算元內執行緒池的大小。建議的值是裝置上的物理核心數量。
     so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
    
  3. 將 ORT 運算元內執行緒池的大小設定為 1
     so.SetIntraOpNumThreads(1);
    

如果您的模型使用 XNNPACK 處理執行計算密集型工作的節點,則此配置將執行良好,因為這些運算元很可能使用運算元內執行緒池。例如,Conv、Gemm、MatMul 運算元。

如果您的模型包含使用 XNNPACK EP 目前不支援的運算元的計算密集型節點,這些節點將由 CPU EP 處理。在這種情況下,可以透過增加 ORT 運算元內執行緒池的大小並可能重新啟用自旋來獲得更好的效能。效能測試是確定模型最佳配置的最佳方法。

可用選項

intra_op_num_threads

XNNPACK EP 內部運算元內執行緒池使用的執行緒數。這是用於節點內並行執行的執行緒數。預設值為 1。該值應 >= 1。

支援的運算元

XNNPACK 執行提供程式支援以下運算元:

運算元 注意  
ai.onnx:AveragePool 僅支援 2D 池化。  
ai.onnx:Conv 僅支援 2D 卷積。
權重和偏置應為常量。
 
ai.onnx:ConvTranspose 僅支援 2D 反捲積。
權重和偏置應為常量。
自 1.14 版本起
ai.onnx:MaxPool 僅支援 2D 池化。  
ai.onnx:Softmax 支援 13 以下的所有 opset 版本,opsbet 13 僅在 AXIS 為最後一個維度時支援  
ai.onnx:QLinearConv 僅支援 2D 卷積。
權重和偏置應為常量。
所有量化比例和零點都應為常量。
 
ai.onnx:Resize 支援雙線性模式下的 2D/4D 縮放 自 1.14 版本起
ai.onnx:Gemm 僅支援 2D 運算元 自 1.14 版本起
ai.onnx:Matmul 僅支援 2D 運算元 自 1.14 版本起
com.microsoft:QLinearAveragePool 僅支援 2D 池化。
所有量化比例和零點都應為常量。
 
com.microsoft:QLinearSoftmax 所有量化比例和零點都應為常量。  
com.microsoft:QLinearConvTranspose 所有量化比例和零點都應為常量。 自 1.14 版本起