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 | 所有量化尺度和零點應為常數。 |