NNAPI 執行提供者

使用 ONNX Runtime 和 NNAPI 執行提供者在 Android 裝置上加速 ONNX 模型。Android 神經網路 API (NNAPI) 是 Android 上 CPU、GPU 和神經網路加速器的統一介面。

目錄

要求

NNAPI 執行提供者 (EP) 需要 Android 8.1 或更高版本的 Android 裝置。建議使用 Android 9 或更高版本的 Android 裝置以獲得最佳效能。

安裝

帶有 Android 版 NNAPI EP 的 ONNX Runtime 預構建包已在 Maven 上釋出。

有關安裝說明,請參閱此處

構建

有關構建包含 NNAPI EP 的軟體包的說明,請參閱構建 Android EP

用法

ONNX Runtime API 詳情請參閱此處

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

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

Ort::Env env = Ort::Env{ORT_LOGGING_LEVEL_ERROR, "Default"};
Ort::SessionOptions so;
uint32_t nnapi_flags = 0;
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_Nnapi(so, nnapi_flags));
Ort::Session session(env, model_path, so);

配置選項

NNAPI EP 有多個執行時選項可用。

要使用 NNAPI EP 執行時選項,請建立一個表示這些選項的無符號整數,並使用位或運算子設定每個單獨的選項。

uint32_t nnapi_flags = 0;
nnapi_flags |= NNAPI_FLAG_USE_FP16;

可用選項

NNAPI_FLAG_USE_FP16

在 NNAPI EP 中使用 fp16 鬆弛。

這可能會提高效能,但由於精度較低,也可能降低準確性。

NNAPI_FLAG_USE_NCHW

在 NNAPI EP 中使用 NCHW 佈局。

此選項僅適用於 Android API 級別 29 及更高版本。請注意,目前 NNAPI 使用 NCHW 的效能可能不如使用 NHWC。

NNAPI_FLAG_CPU_DISABLED

阻止 NNAPI 使用 CPU 裝置。

NNAPI 在使用 GPU 或 NPU 執行時效率更高,但對於 GPU/NPU 不支援的操作,NNAPI 可能會回退到其 CPU 實現。NNAPI 的 CPU 實現(稱為 nnapi-reference)通常不如 ORT 最佳化過的操作版本高效。因此,停用 NNAPI CPU 回退並使用 ORT 核心處理執行可能更有利。

對於某些模型,如果 NNAPI 將使用 CPU 執行操作,並且設定了此標誌,則模型的執行可能會回退到 ORT 核心。

此選項僅適用於 Android API 級別 29 及更高版本,對於 Android API 級別 28 及更低版本將被忽略。

有關 NNAPI 裝置分配,請參閱 https://developer.android.com/ndk/guides/neuralnetworks#device-assignment

有關 NNAPI CPU 回退,請參閱 https://developer.android.com/ndk/guides/neuralnetworks#cpu-fallback

NNAPI_FLAG_CPU_ONLY

在 NNAPI EP 中僅使用 CPU 可能會降低效能,但會提供無精度損失的參考輸出值,這對於驗證很有用。

此選項僅適用於 Android API 級別 29 及更高版本,對於 Android API 級別 28 及更低版本將被忽略。

支援的運算元

NNAPI 執行提供者支援以下運算元:

運算元 備註
ai.onnx:Abs  
ai.onnx:Add  
ai.onnx:AveragePool 僅支援 2D 池化。
ai.onnx:BatchNormalization  
ai.onnx:Cast  
ai.onnx:Clip  
ai.onnx:Concat  
ai.onnx:Conv 僅支援 2D 卷積。
權重和偏置應為常數。
ai.onnx:DepthToSpace 僅支援 DCR 模式的 DepthToSpace。
ai.onnx:DequantizeLinear 所有量化尺度和零點應為常數。
ai.onnx:Div  
ai.onnx:Elu  
ai.onnx:Exp  
ai.onnx:Flatten  
ai.onnx:Floor  
ai.onnx:Gather 如果輸入索引不是 int32 型別,則應為常數。
ai.onnx:Gemm 如果輸入 B 不是常數,則 transB 應為 1。
ai.onnx:GlobalAveragePool 僅支援 2D 池化。
ai.onnx:GlobalMaxPool 僅支援 2D 池化。
ai.onnx:Identity  
ai.onnx:LeakyRelu  
ai.onnx:Log  
ai.onnx:LRN  
ai.onnx:MatMul  
ai.onnx:MaxPool 僅支援 2D 池化。
ai.onnx:Max  
ai.onnx:Min  
ai.onnx:Mul  
ai.onnx:Neg  
ai.onnx:Pad 僅支援常數模式的 Pad。
輸入填充和 constant_value 應為常數。
輸入填充值應為非負數。
ai.onnx:Pow  
ai.onnx:PRelu  
ai.onnx:QLinearConv 僅支援 2D 卷積。
權重和偏置應為常數。
所有量化尺度和零點應為常數。
ai.onnx:QLinearMatMul 所有量化尺度和零點應為常數。
ai.onnx:QuantizeLinear 所有量化尺度和零點應為常數。
ai.onnx:ReduceMean  
ai.onnx:Relu  
ai.onnx:Reshape  
ai.onnx:Resize 僅支援 2D 調整大小。
ai.onnx:Sigmoid  
ai.onnx:Sin  
ai.onnx:Slice  
ai.onnx:Softmax  
ai.onnx:Split 分割數量必須能整除分割軸大小。如果提供了輸入分割,則其應為常數。
ai.onnx:Sqrt  
ai.onnx:Squeeze 輸入軸應為常數。
ai.onnx:Sub  
ai.onnx:Tanh  
ai.onnx:Transpose  
ai.onnx:Unsqueeze 輸入軸應為常數。
com.microsoft:QLinearAdd 所有量化尺度和零點應為常數。
com.microsoft:QLinearAveragePool 僅支援 2D 池化。
所有量化尺度和零點應為常數。
com.microsoft:QLinearSigmoid 所有量化尺度和零點應為常數。