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

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:

  1. Deaktivieren Sie das Spinning des ORT Intra-Op Thread-Pools, indem Sie Folgendes zu den Sitzungsoptionen hinzufügen:
     so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0");
    
  2. 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)});
    
  3. 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