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.