Introduction to DirectML (Einführung in DirectML)

Zusammenfassung

Direktes Maschinelles Lernen (DirectML) ist eine systemnahe API für maschinelles Lernen (ML). 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. Schauen Sie sich auch unsere Landing Page an.

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

Ist DirectML für mein Projekt geeignet?

DirectML ist eine Komponente unter Windows Machine Learning. Die WinML-API auf höherer Ebene ist in erster Linie modellfokussiert, wobei der Workflow zum Ladenbindung ausgewertet wird. Aber Domänen wie Spiele und Engines benötigen in der Regel eine niedrigere Abstraktionsebene und ein höheres Maß an Entwicklersteuerung, um die Vorteile des Siliziums voll ausschöpfen zu können. Wenn Sie Millisekunden zählen und Framezeiten quetschen, erfüllt DirectML Ihre Anforderungen für maschinelles Lernen.

Verwenden Sie DirectML (anstelle von WinML) für zuverlässige Echtzeit-, Hochleistungs-, Latenzarme und/oder Ressourceneingeschränkte -Szenarien. Sie können DirectML direkt in Ihr vorhandenes Modul oder die Rendering-Pipeline integrieren. Oder DirectML kann auf einer höheren Ebene für benutzerdefinierte Machine Learning Frameworks und Middleware ein leistungsfähiges Back-End unter Windows bereitstellen.

WinML wird selbst mithilfe von DirectML als eines seiner Back-Ends implementiert.

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.

Was ist der allgemeine DirectML-Workflow?

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.

Initialisierung

  1. Erstellen Sie Ihre Direct3D 12-Ressourcen – das Direct3D 12-Gerät, die Befehlswarteschlange, die Befehlsliste und Ressourcen wie Deskriptorheaps.
  2. 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.
  3. 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.

Ausführung

  1. 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).
  2. 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.
  3. 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.

Ebene-um-Ebene und graphbasierte Workflows in DirectML

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.

Weitere Informationen