NNAPI-Ausführungsanbieter
Beschleunigen Sie ONNX-Modelle auf Android-Geräten mit ONNX Runtime und dem NNAPI-Ausführungsanbieter. Die Android Neural Networks API (NNAPI) ist eine einheitliche Schnittstelle zu CPU, GPU und NN-Beschleunigern auf Android.
Inhalt
Voraussetzungen
Der NNAPI-Ausführungsanbieter (EP) erfordert Android-Geräte mit Android 8.1 oder höher. Es wird empfohlen, Android-Geräte mit Android 9 oder höher zu verwenden, um eine optimale Leistung zu erzielen.
Installieren
Vorkompilierte Pakete von ONNX Runtime mit NNAPI EP für Android werden auf Maven veröffentlicht.
Anweisungen zur Installation finden Sie hier.
Build
Informationen zum Erstellen eines Pakets, das den NNAPI EP enthält, finden Sie unter Erstellen von Android EP.
Verwendung
Details zur ONNX Runtime API finden Sie hier.
Der NNAPI EP kann über die C-, C++- oder Java-APIs verwendet werden.
Der NNAPI EP muss beim Erstellen der Inferenzsitzung explizit registriert werden. Zum Beispiel
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);
Konfigurationsoptionen
Es stehen mehrere Laufzeitoptionen für den NNAPI EP zur Verfügung.
Um die NNAPI EP-Laufzeitoptionen zu verwenden, erstellen Sie eine vorzeichenlose Ganzzahl, die die Optionen darstellt, und setzen Sie jede einzelne Option mithilfe des bitweisen OR-Operators.
uint32_t nnapi_flags = 0;
nnapi_flags |= NNAPI_FLAG_USE_FP16;
Verfügbare Optionen
NNAPI_FLAG_USE_FP16
Verwenden Sie fp16-Relaxation im NNAPI EP.
Dies kann die Leistung verbessern, kann aber aufgrund der geringeren Präzision auch die Genauigkeit verringern.
NNAPI_FLAG_USE_NCHW
Verwenden Sie das NCHW-Layout im NNAPI EP.
Dies ist nur für Android API Level 29 und höher verfügbar. Bitte beachten Sie, dass NNAPI derzeit bei Verwendung von NCHW möglicherweise eine schlechtere Leistung aufweist als bei Verwendung von NHWC.
NNAPI_FLAG_CPU_DISABLED
Verhindern Sie, dass NNAPI CPU-Geräte verwendet.
NNAPI ist effizienter bei der Verwendung von GPU oder NPU für die Ausführung. NNAPI kann jedoch auf seine CPU-Implementierung für Operationen zurückfallen, die von GPU/NPU nicht unterstützt werden. Die CPU-Implementierung von NNAPI (nnapi-reference genannt) ist oft weniger effizient als die optimierten Versionen der Operationen von ORT. Daher kann es vorteilhaft sein, den NNAPI-CPU-Fallback zu deaktivieren und die Ausführung mit ORT-Kernen zu handhaben.
Bei einigen Modellen, wenn NNAPI die CPU zur Ausführung einer Operation verwenden würde und diese Flagge gesetzt ist, kann die Ausführung des Modells auf ORT-Kerne zurückfallen.
Diese Option ist nur für Android API Level 29 und höher verfügbar und wird für Android API Level 28 und niedriger ignoriert.
Informationen zur NNAPI-Gerätezuweisung finden Sie unter https://developer.android.com/ndk/guides/neuralnetworks#device-assignment.
Informationen zum NNAPI-CPU-Fallback finden Sie unter https://developer.android.com/ndk/guides/neuralnetworks#cpu-fallback.
NNAPI_FLAG_CPU_ONLY
Verwendung der CPU allein im NNAPI EP kann die Leistung verringern, liefert aber Referenzausgabewerte ohne Präzisionsverlust, was für die Validierung nützlich ist.
Diese Option ist nur für Android API Level 29 und höher verfügbar und wird für Android API Level 28 und niedriger ignoriert.
Unterstützte Ops
Die folgenden Operationen werden vom NNAPI Execution Provider unterstützt:
| Operator | Hinweis |
|---|---|
| ai.onnx:Abs | |
| ai.onnx:Add | |
| ai.onnx:AveragePool | Nur 2D-Pooling wird unterstützt. |
| ai.onnx:BatchNormalization | |
| ai.onnx:Cast | |
| ai.onnx:Clip | |
| ai.onnx:Concat | |
| ai.onnx:Conv | Nur 2D Conv wird unterstützt. Gewichte und Bias müssen konstant sein. |
| ai.onnx:DepthToSpace | Nur DCR-Modus DepthToSpace wird unterstützt. |
| ai.onnx:DequantizeLinear | Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. |
| ai.onnx:Div | |
| ai.onnx:Elu | |
| ai.onnx:Exp | |
| ai.onnx:Flatten | |
| ai.onnx:Floor | |
| ai.onnx:Gather | Eingabeindizes sollten konstant sein, wenn sie nicht vom Typ int32 sind. |
| ai.onnx:Gemm | Wenn die Eingabe B nicht konstant ist, sollte transB 1 sein. |
| ai.onnx:GlobalAveragePool | Nur 2D-Pooling wird unterstützt. |
| ai.onnx:GlobalMaxPool | Nur 2D-Pooling wird unterstützt. |
| ai.onnx:Identity | |
| ai.onnx:LeakyRelu | |
| ai.onnx:Log | |
| ai.onnx:LRN | |
| ai.onnx:MatMul | |
| ai.onnx:MaxPool | Nur 2D-Pooling wird unterstützt. |
| ai.onnx:Max | |
| ai.onnx:Min | |
| ai.onnx:Mul | |
| ai.onnx:Neg | |
| ai.onnx:Pad | Nur konstante Modus-Pads werden unterstützt. Eingabe-Pads und constant_value sollten konstant sein. Eingabe-Pads-Werte sollten nicht negativ sein. |
| ai.onnx:Pow | |
| ai.onnx:PRelu | |
| ai.onnx:QLinearConv | Nur 2D Conv wird unterstützt. Gewichte und Bias müssen konstant sein. Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. |
| ai.onnx:QLinearMatMul | Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. |
| ai.onnx:QuantizeLinear | Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. |
| ai.onnx:ReduceMean | |
| ai.onnx:Relu | |
| ai.onnx:Reshape | |
| ai.onnx:Resize | Nur 2D-Größenänderung wird unterstützt. |
| ai.onnx:Sigmoid | |
| ai.onnx:Sin | |
| ai.onnx:Slice | |
| ai.onnx:Softmax | |
| ai.onnx:Split | Die Anzahl der Teilungen muss die Größe der Teilungsachse gleichmäßig teilen. Die Eingabeteilung sollte konstant sein, falls vorhanden. |
| ai.onnx:Sqrt | |
| ai.onnx:Squeeze | Eingabeachsen sollten konstant sein. |
| ai.onnx:Sub | |
| ai.onnx:Tanh | |
| ai.onnx:Transpose | |
| ai.onnx:Unsqueeze | Eingabeachsen sollten konstant sein. |
| com.microsoft:QLinearAdd | Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. |
| com.microsoft:QLinearAveragePool | Nur 2D-Pooling wird unterstützt. Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. |
| com.microsoft:QLinearSigmoid | Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. |