XNNPACK Execution Provider
Beschleunigen Sie ONNX-Modelle auf Android/iOS-Geräten und WebAssembly mit ONNX Runtime und dem XNNPACK Execution Provider. XNNPACK ist eine hochoptimierte Bibliothek von Inferenzoperatoren für neuronale Netze mit Gleitkommazahlen für Arm®-basierte, WebAssembly und x86-Plattformen.
Inhalt
Installieren
Vorkompilierte Pakete von ONNX Runtime (onnxruntime-android) mit XNNPACK EP für Android werden auf Maven veröffentlicht. Weitere Installationsanweisungen finden Sie hier.
Vorkompilierte Binärdateien (onnxruntime-objc und onnxruntime-c) von ONNX Runtime mit XNNPACK EP für iOS werden auf CocoaPods veröffentlicht. Weitere Installationsanweisungen finden Sie hier.
Build
Anweisungen zum Erstellen eines Pakets, das die XNNPACK EP enthält, finden Sie auf der Build-Seite.
Sie können ONNX Runtime mit der XNNPACK EP für Android, iOS, Windows und Linux erstellen.
Verwendung
Details zur ONNX Runtime API finden Sie hier.
Die XNNPACK EP kann über die C-, C++- oder Java-APIs verwendet werden.
Die XNNPACK EP muss beim Erstellen der Inferenzsitzung explizit registriert werden. Zum Beispiel
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);
Konfigurationsoptionen
Empfohlene Konfiguration
XNNPACK verfügt über einen separaten internen Thread-Pool, der zu Konflikten mit dem ORT Intra-Op Thread-Pool führen kann. Um dies zu minimieren, empfehlen wir die folgenden Optionen:
- Deaktivieren Sie das Spinning des ORT Intra-Op Thread-Pools, indem Sie Folgendes zu den Sitzungsoptionen hinzufügen:
so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0"); - Stellen Sie die Größe des XNNPACK Intra-Op Thread-Pools ein, wenn Sie die XNNPACK EP registrieren. Der vorgeschlagene Wert ist die Anzahl der physischen Kerne auf dem Gerät.
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)}); - Stellen Sie die Größe des ORT Intra-Op Thread-Pools auf 1 ein.
so.SetIntraOpNumThreads(1);
Diese Konfiguration funktioniert gut, wenn Ihr Modell XNNPACK für die rechenintensiven Knoten verwendet, da diese Operatoren wahrscheinlich den Intra-Op Thread-Pool nutzen. z.B. Conv, Gemm, MatMul Operatoren.
Wenn Ihr Modell rechenintensive Knoten mit Operatoren enthält, die derzeit nicht von der XNNPACK EP unterstützt werden, werden diese vom CPU EP behandelt. In diesem Fall kann eine bessere Leistung erzielt werden, indem die Größe des ORT Intra-Op Thread-Pools erhöht und möglicherweise das Spinning wieder aktiviert wird. Leistungstests sind der beste Weg, um die optimale Konfiguration für Ihr Modell zu ermitteln.
Verfügbare Optionen
intra_op_num_threads
Die Anzahl der Threads, die für den internen Intra-Op Thread-Pool der XNNPACK EP verwendet werden. Dies ist die Anzahl der Threads, die zur Parallelisierung der Ausführung innerhalb eines Knotens verwendet werden. Der Standardwert ist 1. Der Wert muss >= 1 sein.
Unterstützte Ops
Folgende Ops werden von der XNNPACK Execution Provider unterstützt:
| Operator | Hinweis | |
|---|---|---|
| ai.onnx:AveragePool | Nur 2D-Pooling wird unterstützt. | |
| ai.onnx:Conv | Nur 2D Conv wird unterstützt. Gewichte und Bias müssen konstant sein. | |
| ai.onnx:ConvTranspose | Nur 2D ConvTranspose wird unterstützt. Gewichte und Bias müssen konstant sein. | seit 1.14 |
| ai.onnx:MaxPool | Nur 2D-Pooling wird unterstützt. | |
| ai.onnx:Softmax | Alle Opset unter 13 werden unterstützt, Opset 13 wird nur unterstützt, wenn AXIS die letzte Dimension ist. | |
| 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:Resize | 2D/4D Resize im Bilinear-Modus werden unterstützt. | seit 1.14 |
| ai.onnx:Gemm | Nur 2D Op wird unterstützt. | seit 1.14 |
| ai.onnx:Matmul | Nur 2D Op wird unterstützt. | seit 1.14 |
| com.microsoft:QLinearAveragePool | Nur 2D-Pooling wird unterstützt. Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. | |
| com.microsoft:QLinearSoftmax | Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. | |
| com.microsoft:QLinearConvTranspose | Alle Quantisierungsskalen und Nullpunkte sollten konstant sein. | seit 1.14 |