DirectML – Übersicht
Direktes Maschinelles Lernen (DirectML) ist eine systemnahe API für maschinelles Lernen (ML). Sie hat eine vertraute (natives C++, Nano-COM) Schnittstelle und einen Workflow im Stil von DirectX 12. Sie können Machine Learning-Rückschlussworkloads in Ihr Spiel, Ihre Engine, Ihre Middleware, Ihr Back-End oder in eine andere Anwendung integrieren. DirectML wird von jeder DirectX 12-kompatiblen Hardware unterstützt.
Grundtypen von hardwarebeschleunigtem maschinellen Lernen (als Operatoren bezeichnet) sind die Bausteine von DirectML. Aus diesen Bausteinen können Sie solche Techniken des maschinellen Lernens wie Upscaling, Antialiasing und Formatvorlagenübertragung entwickeln, um nur einige zu nennen. Mit Denoising und Superauflösung können Sie beispielsweise beeindruckende Raytraced-Effekte mit weniger Strahlen pro Pixel erzielen.
Sie können Machine Learning-Rückschlussworkloads in Ihr Spiel, Ihre Engine, Ihre Middleware, Ihr Back-End oder in eine andere Anwendung integrieren. DirectML verfügt über eine vertraute (native C++-, Nano-COM)-DirectX 12-Programmierschnittstelle und Workflow, die von allen mit DirectX 12 kompatibler Hardware unterstützt wird. Für DirectML-Beispielanwendungen, einschließlich eines Beispiels einer minimalen DirectML-Anwendung, siehe DirectML Beispiel-Anwendungen.
DirectML wird in Windows 10, Version 1903, und in der entsprechenden Version des Windows SDK eingeführt.
DirectML ist eine Ebene mit niedriger Hardwarestraktionsebene, mit der Sie Machine Learning-Workloads auf jeder mit DirectX 12 kompatiblen GPU ausführen können.
Wenn Sie Ihre Machine Learning-Leistung für Echtzeit-, Hochleistungs-, Low-Latey- oder Ressourceneinschränkungsszenarien optimieren müssen, bietet DirectML Ihnen die meiste Kontrolle und Flexibilität. Sie können DirectML verwenden, um maschinelles Lernen direkt in Ihre vorhandene Engine oder Renderingpipeline zu integrieren oder eigene benutzerdefinierte Machine Learning Frameworks und Middleware unter Windows zu erstellen.
Sie können DirectML auch indirekt über die ONNX-Runtime verwenden. Dabei handelt es sich um eine plattformübergreifende Bibliothek, die das offene STANDARD-ONNX-Format für Machine Learning-Modelle unterstützt. Die ONNX-Runtime kann DirectML zusammen mit anderen Back-Ends wie CPU, CUDA oder TensorRT als einer seiner Ausführungsanbieter verwenden. Auf diese Weise können Sie die Leistung und Kompatibilität von DirectML nutzen, ohne directML-Code selbst zu schreiben.
Alternativ können Sie die WinML-API verwenden, bei der es sich um eine übergeordnete modellorientierte API handelt, die den Machine Learning-Workflow mit seinem Load-Bind-Evaluate-Muster vereinfacht. WinML verwendet auch das ONNX-Format für Modelle und kann DirectML als Back-End verwenden. WinML ist für Szenarien konzipiert, in denen Sie maschinelles Lernen schnell und einfach in Ihre Windows-Anwendungen integrieren müssen, ohne sich Gedanken über die Details der zugrunde liegenden Hardware oder des Zugrunde liegenden Frameworks machen zu müssen.
Welche Funktionen führt DirectML aus und welche Arbeit muss ich als Fachkraft in der Entwicklung ausführen?
DirectML führt die einzelnen Ebenen Ihres Rückschlussmodells effizient auf der GPU (oder auf KI-Beschleunigungskernen, sofern vorhanden) aus. Jede Ebene ist ein Operator, und DirectML bietet Ihnen eine Bibliothek mit hardwarebeschleunigten Machine Learning-Grundtypenoperatoren auf niedriger Ebene. Sie können DirectML-Vorgänge isoliert oder als Diagramm ausführen (siehe Abschnitt Schicht–um-Schicht und graphbasierte Workflows in DirectML).
Operatoren und Diagramme wenden hardwarespezifische und architekturspezifische Optimierungen an. Gleichzeitig sehen Sie als Fachkraft in der Entwicklung eine einzige, anbieterunabhängige Schnittstelle für die Ausführung dieser Operatoren.
Die Bibliothek der Operatoren in DirectML stellt alle üblichen Vorgänge bereit, die Sie in einer Machine Learning-Workload verwenden können.
- Aktivierungsoperatoren wie linear, ReLU, Sigmoid, Tanh und mehr.
- Elementbasierte Operatoren, wie Hinzufügen, Exp, Protokoll, Max, Min, Sub und vieles mehr.
- Konvolutionsoperatoren, wie 2D- und 3D-Konvolution, und mehr.
- Reduzierungsoperatoren wie Argmin, Average, l2, Summe und mehr.
- Pool-Operatoren wie Average, lp und max.
- Neuronale Netz-Operatoren (NN) wie gemm, gru, lstm und rnn.
- Und viele mehr.
Für maximale Leistung und damit Sie nicht für etwas bezahlen, das Sie nicht nutzen, gibt DirectML Ihnen als Fachkraft in der Entwicklung die Kontrolle darüber, wie Ihre maschinelle Lernen-Workloads auf der Hardware ausgeführt wird. Herauszufinden, welche Operatoren ausgeführt werden sollen und wann, liegt in Ihrer Zuständigkeit als Fachkraft in der Entwicklung. Aufgaben, die Ihrem Ermessen überlassen sind, umfassen: Transkribieren des Modells; Vereinfachen und Optimieren Ihre Schichten; Laden von Gewichten; Ressourcenzuteilung, Bindung, Speicherverwaltung (genau wie bei Direct3D 12); und Ausführung des Diagramms.
Sie behalten allgemeine Kenntnisse Ihrer Diagramme bei (Sie können Ihr Modell direkt hartcodieren oder ihr eigenes Modellladeprogramm schreiben). Sie können z. B. ein Upscaling-Modell entwerfen, indem Sie mehrere Ebenen verwenden, die jeweils Upsampeln, Konvolution, Normalisierung und Aktivierung von Operatoren sind. Mit dieser Vertrautheit, einer sorgfältigen Planung und der Verwaltung von Barrieren können Sie das Maximum an Parallelität und Leistung aus der Hardware herausholen. Wenn Sie ein Spiel entwickeln, können Sie durch sorgfältige Ressourcenverwaltung und Kontrolle über die Zeitplanung maschinelle Lernprozesse und herkömmliche Rendering-Arbeiten so miteinander verschachteln, dass die GPU gesättigt wird.
Hier ist das allgemeine Rezept für die Verwendung von DirectML. Innerhalb der beiden Standard Phasen der Initialisierung und Ausführung erfassen Sie die Arbeit in Befehlslisten und führen sie dann in einer Warteschlange aus.
- Erstellen Sie Ihre Direct3D 12-Ressourcen – das Direct3D 12-Gerät, die Befehlswarteschlange, die Befehlsliste und Ressourcen wie Deskriptorheaps.
- Da Sie Rückschließen von maschinellem Lernen und Ihr Rendering-Workload durchführen, erstellen Sie DirectML-Ressourcen – das DirectML-Gerät und Operator-Instances. Wenn Sie über ein Machine Learning-Modell verfügen, bei dem Sie eine bestimmte Art von Konvolution mit einer bestimmten Größe des Filter-Tensors mit einem bestimmten Datentyp durchführen müssen, sind dies alle Parameter im Konvolutionsoperator von DirectML.
- DirectML-Datensätze funktionieren in Direct3D 12-Befehlslisten. Sobald die Initialisierung abgeschlossen ist, erfassen Sie also die Bindung und Initialisierung des (z. B.) Konvolutions-Operators in der Befehlsliste. Schließen Sie dann ihre Befehlsliste wie gewohnt in ihrer Warteschlange, und führen Sie sie aus.
- Laden Sie Ihre Gewichts-Tensoren in Ressourcen hoch. Ein Tensor in DirectML wird mithilfe einer regulären Direct3D 12-Ressource dargestellt. Wenn Sie beispielsweise Ihre Gewichtsdaten in die GPU hochladen möchten, tun Sie dies auf die gleiche Weise wie bei jeder anderen Direct3D 12-Ressource (verwenden Sie einen Upload-Heap oder die Kopierwarteschlange).
- Als Nächstes müssen Sie diese Direct3D 12-Ressourcen als Eingabe- und Ausgabe-Tensoren binden. Notieren Sie sich in der Befehlsliste die Bindung und die Ausführung Ihrer Operatoren.
- Schließen Sie die Befehlsliste, und führen Sie sie aus.
Genau wie bei Direct3D 12 sind die Ressourcenlebensdauer und die Synchronisierung Ihre Zuständigkeit. Geben Sie ihre DirectML-Objekte beispielsweise erst frei, wenn sie die Ausführung auf der GPU abgeschlossen haben.
DirectML unterstützt sowohl Ebene-um-Ebene als auch graphbasierte Ansätze zur Modellausführung. Beim Ausführen von Ebene-um-Ebene-Vorgängen sind Sie für das Erstellen und Initialisieren jedes DirectML-Operators verantwortlich und zeichnen sie einzeln für die Ausführung in einer Befehlsliste auf. Im Gegensatz dazu erstellen Sie beim Ausführen eines Diagramms stattdessen eine Reihe von Knoten und Kanten – wobei jeder Knoten einen DirectML-Operator darstellt und Kanten Tensordaten zwischen Knoten darstellen. Das gesamte Diagramm wird dann für die Initialisierung oder Ausführung auf einmal übermittelt, und DirectML verarbeitet die Planung und Aufzeichnung der einzelnen Operatoren in Ihrem Auftrag.
Beide Muster sind in unterschiedlichen Situationen nützlich. Ein Ebene-um-Ebene-Ansatz bietet Ihnen maximale Kontrolle über die Sortierung und Planung von Berechnungsarbeiten. Mit dieser Steuerungsebene können Sie beispielsweise Direct3D 12-Rendering-Workloads mit Ihren DirectML-Compute-Dispatcher verbinden. Dies kann nützlich sein, um asynchrone Compute- oder Shader-Einheiten auf Ihrer GPU zu nutzen, die andernfalls im Leerlauf wären. Das manuelle Ausführen von Ebenen ermöglicht auch explizite Entwicklerkontrolle über Tensorlayouts und Speicherauslastung.
** Machine Learning-Modelle werden jedoch häufig in Bezug auf Diagramme von Ebenen ausgedrückt. Als Alternative zum Ebene–um-Ebene-Ansatz können Sie mit DirectML Ihr Modell als gerichteten azyklischen Graphen mit Knoten (DirectML-Operatoren) und Kanten zwischen ihnen (Tensorbeschreibungen) darstellen. Nachdem Sie eine Beschreibung des Diagramms erstellt haben, können Sie es zum Initialisieren und Ausführen gleichzeitig an DirectML übermitteln. Bei diesem Ansatz entscheidet DirectML über eine Durchlaufreihenfolge und behandelt jeden einzelnen Operator und den Datenfluss zwischen ihnen in Ihrem Auftrag. Dies ist oft eine einfachere und natürlichere Methode, um ein Machine Learning-Modell auszudrücken, und die automatische Anwendung von architekturspezifischen Optimierungen zu ermöglichen. Darüber hinaus bietet die DirectMLX-Hilfsprogrammbibliothek eine sauber und eine bequeme Syntax zum Erstellen komplexer Diagramme von DirectML-Operatoren.
Je nachdem, welchen Ansatz Sie bevorzugen, haben Sie immer Zugriff auf die gleiche umfangreiche Suite von DirectML-Operatoren. Dies bedeutet, dass Sie die Funktionalität niemals opfern müssen, unabhängig davon, ob Sie die feinkörnige Kontrolle des Ebene–um-Ebene-Ansatzes oder den Komfort des Graph-Ansatzes bevorzugen.
Thema | Beschreibung |
---|---|
Schnellstartanleitung | Erste Schritte mit Azure. |
Entwickler-Tools | Tools zum Profilieren, Optimieren und Debuggen von DirectML. |
Programmierhandbuch | Themen zu Datenbindung, Barrieren, Folien, Fusionen, Fehlerbehandlung, Geräteentfernung und Hilfsfunktionen. |
Problembehandlung | Behandeln von Fehlerbedingungen und Verwenden der Debugebene. |
DirectML-Versionsverlauf | DirectML ist eine Systemkomponente von Windows 10 und steht auch als eigenständiges weitervertreibbares Paket zur Verfügung. |
DirectML-Verlauf auf Featureebene | Ein Manifest der Typen, die in jeder Featureebene eingeführt wurden. |
DirectML Sample Applications (DirectML-Beispielanwendungen) | Verlinkungen zu DirectML-Beispielanwendungen, einschließlich eines Beispiels einer minimalen DirectML-Anwendung. |
GPU-beschleunigtes ML-Training | Beschreibt, was derzeit von der GPU beschleunigten Ml-Schulung (Machine Learning) für die Windows-Subsystem für Linux (WSL) und native Windows unterstützt wird. |
DirectML-API-Referenz | In diesem Abschnitt werden Direct Machine Learning (DirectML)-APIs behandelt, die in DirectML.h deklariert sind. |