DirectML Execution Provider

Der DirectML Execution Provider ist eine Komponente von ONNX Runtime, die DirectML verwendet, um die Inferenz von ONNX-Modellen zu beschleunigen. Der DirectML Execution Provider kann die Evaluierungszeit von Modellen mit handelsüblicher GPU-Hardware erheblich verbessern, ohne die breite Hardwareunterstützung zu beeinträchtigen oder herstellerspezifische Erweiterungen installieren zu müssen.

DirectML ist eine leistungsstarke, hardwarebeschleunigte DirectX 12-Bibliothek für maschinelles Lernen unter Windows. DirectML bietet GPU-Beschleunigung für gängige Aufgaben des maschinellen Lernens über eine breite Palette von unterstützter Hardware und Treibern.

Wenn DirectML eigenständig verwendet wird, ist die DirectML API eine Low-Level DirectX 12-Bibliothek und eignet sich für leistungsstarke Anwendungen mit geringer Latenz, wie z. B. Frameworks, Spiele und andere Echtzeitanwendungen. Die nahtlose Interoperabilität von DirectML mit Direct3D 12 sowie sein geringer Overhead und die Hardware-Konformität machen DirectML ideal für die Beschleunigung von maschinellem Lernen, wenn sowohl hohe Leistung gewünscht wird als auch die Zuverlässigkeit und Vorhersagbarkeit von Ergebnissen über verschiedene Hardware hinweg entscheidend ist.

Der DirectML Execution Provider verwendet derzeit DirectML Version 1.15.2 und unterstützt bis zu ONNX Opset 20 (ONNX v1.15) mit Ausnahme von Gridsample 20: 5d und DeformConv, die noch nicht unterstützt werden. Die Auswertung von Modellen, die eine höhere Opset-Version erfordern, wird nicht unterstützt und führt zu schlechter Leistung. Hinweis: Die ONNX Opset-Unterstützung von DirectML kann von der von ONNX Runtime abweichen, die Sie hier finden.

Inhalt

Installieren

Vorkompilierte Pakete von ORT mit dem DirectML EP werden auf Nuget.org veröffentlicht. Siehe: ONNX Runtime installieren.

Voraussetzungen

Der DirectML Execution Provider erfordert ein DirectX 12-fähiges Gerät. Fast alle kommerziell erhältlichen Grafikkarten, die in den letzten Jahren veröffentlicht wurden, unterstützen DirectX 12. Hier sind einige Beispiele für kompatible Hardware

  • NVIDIA Kepler (GTX 600 Serie) und höher
  • AMD GCN 1. Generation (Radeon HD 7000 Serie) und höher
  • Intel Haswell (4. Gen Core) HD Integrated Graphics und höher
  • Qualcomm Adreno 600 und höher

DirectML wurde in Windows 10, Version 1903, und in der entsprechenden Version des Windows SDK eingeführt.

Build

Voraussetzungen für die Erstellung des DirectML Execution Providers

  1. Visual Studio 2017 Toolchain
  2. Das Windows 10 SDK (10.0.17134.0) für Windows 10, Version 1803 (oder neuer)

Um onnxruntime mit dem DML EP zu kompilieren, übergeben Sie das Flag --use_dml an build.bat. Zum Beispiel

    build.bat --config RelWithDebInfo --build_shared_lib --parallel --use_dml

Der DirectML Execution Provider unterstützt die Erstellung für x64 (Standard) und x86 Architekturen.

Beachten Sie, dass Sie ONNX Runtime mit DirectML erstellen können. Dies ermöglicht den automatischen Download des DirectML Redistributable-Pakets als Teil des Builds. Zusätzliche Lizenzinformationen finden Sie in der NuGet-Dokumentation.

Verwendung

Bei Verwendung der C-API mit einem DML-aktivierten Build von onnxruntime kann der DirectML Execution Provider über eine der beiden Factory-Funktionen in include/onnxruntime/core/providers/dml/dml_provider_factory.h aktiviert werden.

OrtSessionOptionsAppendExecutionProvider_DML Funktion

Erstellt einen DirectML Execution Provider, der auf dem Hardware-Adapter mit der angegebenen device_id, auch bekannt als Adapter-Index, ausgeführt wird. Die Device-ID entspricht der Enumerationsreihenfolge der Hardware-Adapter, wie sie von IDXGIFactory::EnumAdapters bereitgestellt wird. Eine device_id von 0 entspricht immer dem Standard-Adapter, der normalerweise die primäre Display-GPU im System ist. Beachten Sie, dass auf Systemen mit mehreren GPUs die primäre Anzeige (GPU 0) oft nicht die leistungsfähigste ist, insbesondere bei Laptops mit dualen Adaptern, bei denen die Akkulaufzeit gegenüber der Leistung bevorzugt wird. Sie können dies im Task-Manager im Leistungsreiter überprüfen, um zu sehen, welche GPU welche ist. Eine negative device_id ist ungültig.

Beispiel für C-API

OrtStatus* OrtSessionOptionsAppendExecutionProvider_DML(
    _In_ OrtSessionOptions* options,
    int device_id
    );

Beispiel für C#-API

Installieren Sie das Nuget-Paket Microsoft.ML.OnnxRuntime.DirectML und verwenden Sie den folgenden Code, um den DirectML EP zu aktivieren

SessionOptions sessionOptions = newSessionOptions();
sessionOptions.GraphOptimizationLevel = GraphOptimizationLevel.ORT_ENABLE_ALL;
sessionOptions.AppendExecutionProvider_DML(0);

SessionOptionsAppendExecutionProvider_DML1 Funktion

Erstellt einen DirectML Execution Provider unter Verwendung des angegebenen DirectML-Geräts, der Arbeiten auf der bereitgestellten D3D12-Befehlswarteschlange ausführt. Das DirectML-Gerät und die D3D12-Befehlswarteschlange müssen denselben übergeordneten ID3D12Device haben, andernfalls wird ein Fehler zurückgegeben. Die D3D12-Befehlswarteschlange muss vom Typ DIRECT oder COMPUTE sein (siehe D3D12_COMMAND_LIST_TYPE). Wenn diese Funktion erfolgreich ist, behält die erstellte Inferenzsitzung eine starke Referenz auf die Objekte dml_device und command_queue.

OrtStatus* SessionOptionsAppendExecutionProvider_DML1(
    _In_ OrtSessionOptions* options,
    _In_ IDMLDevice* dml_device,
    _In_ ID3D12CommandQueue* cmd_queue
    );

Konfigurationsoptionen

Der DirectML Execution Provider unterstützt nicht die Verwendung von Speicherpattenoptimierungen oder paralleler Ausführung in ONNX Runtime. Bei der Bereitstellung von Sitzungsoptionen während der Erstellung der Inferenzsitzung müssen diese Optionen deaktiviert werden, andernfalls wird ein Fehler zurückgegeben.

Wenn Sie die ONNX Runtime C-API verwenden, müssen Sie die Funktionen DisableMemPattern und SetSessionExecutionMode aufrufen, um die vom DirectML Execution Provider benötigten Optionen festzulegen.

Siehe onnxruntime\include\onnxruntime\core\session\onnxruntime_c_api.h.

OrtStatus*(ORT_API_CALL* DisableMemPattern)(_Inout_ OrtSessionOptions* options)NO_EXCEPTION;

OrtStatus*(ORT_API_CALL* SetSessionExecutionMode)(_Inout_ OrtSessionOptions* options, ExecutionMode execution_mode)NO_EXCEPTION;

Wenn Sie das ONNX Runtime Inferenzsitzungsobjekt direkt erstellen, müssen Sie die entsprechenden Felder in der Struktur onnxruntime::SessionOptions festlegen. Insbesondere muss execution_mode auf ExecutionMode::ORT_SEQUENTIAL gesetzt werden und enable_mem_pattern muss false sein.

Da der DirectML Execution Provider keine parallele Ausführung unterstützt, unterstützt er auch keine Multi-Thread-Aufrufe von Run an derselben Inferenzsitzung. Das heißt, wenn eine Inferenzsitzung den DirectML Execution Provider verwendet, darf zu einem Zeitpunkt nur ein Thread Run aufrufen. Mehrere Threads dürfen Run gleichzeitig aufrufen, wenn sie auf verschiedenen Inferenzsitzungsobjekten operieren.

Performance-Tuning

Der DirectML Execution Provider arbeitet am effizientesten, wenn die Tensorformen zum Zeitpunkt der Erstellung einer Sitzung bekannt sind. Hier sind einige Leistungsvorteile

  1. Constant Folding kann öfter auftreten, wodurch CPU/GPU-Kopien und Verzögerungen während der Auswertungen reduziert werden.
  2. Mehr Initialisierungsarbeit wird bei der Erstellung von Sitzungen anstelle der ersten Auswertung durchgeführt.
  3. Gewichte können innerhalb von DirectML vorverarbeitet werden, was effizientere Algorithmen ermöglicht.
  4. Graphoptimierung erfolgt innerhalb von DirectML. Zum Beispiel können Concat-Operatoren entfernt und optimalere Tensorlayouts für die Eingabe und Ausgabe von Operatoren verwendet werden.

Normalerweise, wenn die Formen der Modelleingaben während der Erstellung einer Sitzung bekannt sind, werden die Formen für den Rest des Modells von ONNX Runtime bei der Erstellung dieser Sitzung abgeleitet.

Wenn eine Modelleingabe jedoch eine freie Dimension enthält (z. B. für die Batch-Größe), sind zusätzliche Schritte erforderlich, um die oben genannten Leistungsvorteile zu erzielen. Dazu gehören

  1. Bearbeiten des Modells, um die freie Dimension einer Eingabe (durch ONNX mit "dim_param" angegeben) durch eine feste Größe (durch ONNX mit "dim_value" angegeben) zu ersetzen.
  2. Angabe von Werten für benannte Dimensionen innerhalb von Modelleingaben beim Erstellen der Sitzung mithilfe der ONNX Runtime-ABI AddFreeDimensionOverrideByName.
  3. Bearbeiten des Modells, um sicherzustellen, dass die freie Dimension einer Eingabe eine Denotation (wie "DATA_BATCH" oder eine benutzerdefinierte Denotation) hat. Geben Sie dann beim Erstellen der Sitzung die Dimensionsgröße für jede Denotation an. Dies kann mithilfe der ONNX Runtime-ABI AddFreeDimensionOverride erfolgen.

Beispiele

Ein vollständiges Beispiel für ONNX Runtime mit dem DirectML Execution Provider finden Sie unter samples/c_cxx/fns_candy_style_transfer

Zusätzliche Ressourcen

Zurück nach oben