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-objc 和 onnxruntime-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 運算元內執行緒池的競爭。為儘量減少這種情況,我們建議設定以下選項:
- 透過將會話選項新增以下內容來停用 ORT 運算元內執行緒池的自旋:
so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0"); - 在註冊 XNNPACK EP 時設定 XNNPACK 運算元內執行緒池的大小。建議的值是裝置上的物理核心數量。
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)}); - 將 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 版本起 |