Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Zusammenfassung
Direct Machine Learning (DirectML) ist eine Low-Level-API für Machine Learning (ML). Die API verfügt über eine vertraute Programmierschnittstelle (natives C++, Nano-COM) und einen Workflow im Stil von DirectX 12. Sie können Inference-Workloads des maschinellen Lernens in Ihr Spiel, die Engine, die Middleware, das Backend oder eine andere Anwendung integrieren. DirectML wird von jeder DirectX 12-kompatiblen Hardware unterstützt.
Hardwarebeschleunigte Machine Learning-Primitive (Operatoren genannt) sind die Bausteine von DirectML. Aus diesen Bausteinen können Sie Techniken des maschinellen Lernens wie Upscaling, Anti-Aliasing und Stilübertragung entwickeln, um nur einige zu nennen. Rauschunterdrückung und Superauflösung ermöglichen es beispielsweise, beeindruckende Raytracing-Effekte mit weniger Strahlen pro Pixel zu erzielen.
Sie können Inference-Workloads des maschinellen Lernens in Ihr Spiel, die Engine, die Middleware, das Backend oder eine andere Anwendung integrieren. DirectML verfügt über eine vertraute Programmierschnittstelle und einen Workflow im DirectX 12-Stil (systemeigenes C++, Nano-COM) und wird von aller DirectX 12-kompatiblen Hardware unterstützt. Informationen zu DirectML-Beispielanwendungen, einschließlich eines Beispiels einer minimalen DirectML-Anwendung, finden Sie unter DirectML-Beispielanwendungen.
DirectML wurde 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 Hardwareabstraktionsschicht auf niedriger Ebene, mit der Sie Machine Learning-Workloads auf jeder DirectX 12-kompatiblen GPU ausführen können.
Wenn Sie die Leistung des maschinellen Lernens für Echtzeitszenarien, Szenarien mit hoher Leistung, geringer Latenz oder mit eingeschränkten Ressourcen optimieren müssen, bietet Ihnen DirectML die größte Kontrolle und Flexibilität. Sie können DirectML verwenden, um Machine Learning direkt in Ihre vorhandene Engine oder Renderingpipeline zu integrieren oder um Ihre eigenen benutzerdefinierten Machine Learning-Frameworks und Middleware unter Windows zu erstellen.
Sie können DirectML auch indirekt über die ONNX-Runtime verwenden, bei der es sich um eine plattformübergreifende Bibliothek handelt, die das offene Standardformat ONNX für Machine Learning-Modelle unterstützt. Die ONNX-Runtime kann DirectML als einen ihrer Ausführungsanbieter zusammen mit anderen Back-Ends wie CPU, CUDA oder TensorRT verwenden. Auf diese Weise können Sie die Leistung und Kompatibilität von DirectML nutzen, ohne selbst DirectML-Code schreiben zu müssen.
Alternativ können Sie die WinML-API verwenden, bei der es sich um eine modellorientierte API auf höherer Ebene handelt, die den Machine Learning-Workflow mit ihrem Muster load-bind-evaluate vereinfacht. WinML verwendet auch das ONNX-Format für Modelle und kann DirectML als Back-End verwenden. WinML wurde für Szenarien entwickelt, in denen Sie maschinelles Lernen schnell und einfach in Ihre Windows-Anwendungen integrieren müssen, ohne sich um die Details der zugrunde liegenden Hardware oder des Frameworks kümmern zu müssen.
Welche Aufgabe erfüllt DirectML? und welche Arbeit muss ich als Entwickler leisten?
DirectML führt die einzelnen Schichten Ihres Rückschlussmodells effizient auf der GPU (oder auf KI-Beschleunigungskernen, falls vorhanden) aus. Jede Schicht ist ein Operator, und DirectML stellt Ihnen eine Bibliothek mit hardwarebeschleunigten primitiven Operatoren für maschinelles Lernen auf niedriger Ebene zur Verfügung. Sie können DirectML-Vorgänge isoliert oder als Diagramm ausführen (siehe Abschnitt Layer-by-Layer- und graphbasierte Workflows in DirectML).
Operatoren und Diagramme wenden hardware- und architekturspezifische Optimierungen an. Gleichzeitig sehen Sie als Entwickler eine einzige, herstellerunabhängige Schnittstelle zum Ausführen dieser Operatoren.
Die Bibliothek von Operatoren in DirectML stellt alle üblichen Vorgänge bereit, die Sie in einer Machine Learning-Workload erwarten würden.
- Aktivierungsoperatoren, z. B. linear, ReLU,sigmoid, tanh und mehr.
- Elementweise Operatoren, z. B. add, exp, log, max, min, sub und mehr.
- Faltungsoperatoren, wie z. B. 2D- und 3D-Faltung und mehr.
- Reduktionsoperatoren, z. B. argmin, average, l2, sum und mehr.
- Pooling-Operatoren, z. B. average, lp und max.
- Operatoren für neuronale Netze (NN), z. B. gemm, gru, lstm und rnn.
- Und viele mehr.
Um maximale Leistung zu erzielen und damit Sie nicht für etwas bezahlen, das Sie nicht verwenden, legt DirectML Ihnen als Entwickler die Kontrolle darüber, wie Ihre Machine Learning-Workload auf der Hardware ausgeführt wird. Es liegt in Ihrer Verantwortung als Entwickler, herauszufinden, welche Operatoren wann ausgeführt werden sollen. Zu den Aufgaben, die in Ihrem Ermessen liegen, gehören: Transkription des Modells; Vereinfachung und Optimierung Ihrer Ebenen; Ladegewichte; Ressourcenzuordnung, Bindung, Speicherverwaltung (genau wie bei Direct3D 12); und Ausführung des Graphen.
Sie behalten ein hohes Maß an Wissen über Ihre Graphen (Sie können Ihr Modell direkt hartcodieren oder Ihren eigenen Modelllader schreiben). Sie können ein Upscaling-Modell entwerfen, z. B. mit jeweils mehreren Schichten von Upsample-, Faltungs-, Normalisierungs- und Aktivierungsoperatoren . Mit dieser Vertrautheit, sorgfältigen Planung und Barrierenverwaltung können Sie das Maximum an Parallelität und Leistung aus der Hardware herausholen. Wenn Sie ein Spiel entwickeln, können Sie durch Ihr sorgfältiges Ressourcenmanagement und die Kontrolle über die Planung Workloads für maschinelles Lernen und herkömmliche Renderingarbeiten miteinander verschachteln, um die GPU zu überlasten.
Was ist der DirectML-Workflow auf hoher Ebene?
Hier ist das allgemeine Rezept dafür, wie DirectML verwendet werden soll. Innerhalb der beiden Hauptphasen der Initialisierung und Ausführung erfassen Sie die Arbeit in Befehlslisten und führen sie dann in einer Warteschlange aus.
Initialisierung
- Erstellen Sie Ihre Direct3D 12-Ressourcen: das Direct3D 12-Gerät, die Befehlswarteschlange, die Befehlsliste und Ressourcen wie Deskriptorheaps.
- Da Sie sowohl Machine Learning-Rückschlüsse als auch Ihre Renderingworkload durchführen, erstellen Sie DirectML-Ressourcen, d. h. die DirectML-Geräte- und Operatorinstanzen. Wenn Sie über ein Machine Learning-Modell verfügen, bei dem Sie einen bestimmten Faltungstyp mit einer bestimmten Größe des Filtertensors mit einem bestimmten Datentyp ausführen müssen, dann sind dies alles Parameter im Faltungsoperator von DirectML.
- DirectML-Datensätze funktionieren in Direct3D 12-Befehlslisten. Sobald die Initialisierung abgeschlossen ist, notieren Sie also die Bindung und Initialisierung (zum Beispiel) Ihres Faltungsoperators in Ihrer Befehlsliste. Schließen Sie dann Ihre Befehlsliste in Ihrer Warteschlange und führen Sie sie wie gewohnt aus.
Ausführung
- Laden Sie Ihre Gewichtstensoren in Ressourcen hoch. Ein Tensor in DirectML wird mithilfe einer regulären Direct3D 12-Ressource dargestellt. Wenn Sie z. B. Ihre Gewichtsdaten auf die GPU hochladen möchten, tun Sie dies auf die gleiche Weise wie bei jeder anderen Direct3D 12-Ressource (verwenden Sie einen Uploadheap oder die Kopierwarteschlange).
- Als Nächstes müssen Sie diese Direct3D 12-Ressourcen als Eingabe- und Ausgabetensoren binden. Notieren Sie in Ihrer Befehlsliste die Bindung und die Ausführung Ihrer Operatoren.
- Schließen Sie Ihre Befehlsliste, und führen Sie sie aus.
Genau wie bei Direct3D 12 liegen die Lebensdauer und Synchronisierung der Ressourcen in Ihrer Verantwortung. Geben Sie z. B. Ihre DirectML-Objekte frühestens so lange frei, wie sie die Ausführung auf der GPU abgeschlossen haben.
Layer-by-Layer- und diagrammbasierte Workflows in DirectML
DirectML unterstützt sowohl schichtweise als auch diagrammbasierte Ansätze für die Modellausführung. Beim Ausführen von Schicht für Schicht sind Sie für das Erstellen und Initialisieren der einzelnen DirectML-Operatoren verantwortlich und für die Ausführung in einer Befehlsliste einzeln aufzuzeichnen. Im Gegensatz dazu erstellen Sie beim Ausführen eines Diagramms stattdessen einen Satz von Knoten und Kanten, wobei jeder Knoten einen DirectML-Operator darstellt und Kanten Tensordaten darstellen, die zwischen Knoten fließen. Das gesamte Diagramm wird dann auf einmal zur Initialisierung oder Ausführung übermittelt, und DirectML übernimmt die Planung und Aufzeichnung der einzelnen Operatoren in Ihrem Namen.
Beide Muster sind in verschiedenen Situationen nützlich. Ein Layer-by-Layer-Ansatz gibt Ihnen maximale Kontrolle über die Reihenfolge und Planung von Rechenarbeiten. Diese Steuerungsebene ermöglicht es Ihnen beispielsweise, Direct3D 12-Renderingworkloads mit Ihren DirectML-Compute-Dispatches zu verschachteln. Dies kann nützlich sein, um die Vorteile von asynchronen Compute- oder Shader-Einheiten auf Ihrer GPU zu nutzen, die sich andernfalls im Leerlauf befinden würden. Das manuelle Ausführen von Schicht für Schicht gibt Entwicklern auch die explizite Kontrolle über Tensor-Layouts und Speichernutzung.
Modelle des maschinellen Lernens werden jedoch häufig in Form von Graphen von Schichten ausgedrückt. Als Alternative zum Layer-by-Layer-Ansatz können Sie mit DirectML Ihr Modell als gerichteten azyklischen Graphen von Knoten (DirectML-Operatoren) und Kanten zwischen ihnen (Tensorbeschreibungen) ausdrücken. Nachdem Sie eine Beschreibung des Diagramms erstellt haben, können Sie alles auf einmal kompilieren und zur Initialisierung und Ausführung an DirectML übermitteln. Bei diesem Ansatz entscheidet DirectML über eine Durchlaufreihenfolge und verarbeitet jeden einzelnen Operator und den Datenfluss zwischen ihnen in Ihrem Namen. Dies ist oft eine einfachere und natürlichere Methode, um ein maschinelles Lernmodell auszudrücken und die automatische Anwendung architekturspezifischer Optimierungen zu ermöglichen. Darüber hinaus bietet die DirectMLX-Hilfsbibliothek eine saubere und praktische Syntax zum Erstellen komplexer Diagramme von DirectML-Operatoren.
Unabhängig davon, welchen Ansatz Sie bevorzugen, haben Sie immer Zugriff auf die gleiche umfangreiche Suite von DirectML-Operatoren. Das bedeutet, dass Sie nie auf Funktionalität verzichten müssen, egal ob Sie die fein abgestufte Steuerung des Layer-by-Layer-Ansatzes oder den Komfort des Graphenansatzes bevorzugen.
In diesem Abschnitt
Thema | BESCHREIBUNG |
---|---|
Kurzanleitung | Erste Schritte mit DirectML. |
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 Debug-Schicht. |
DirectML-Versionsverlauf | DirectML ist eine Systemkomponente von Windows 10 und auch als eigenständiges verteilbares Paket verfügbar. |
DirectML-Featureebenenverlauf | Ein Manifest der Typen, die in den einzelnen Featureebenen eingeführt wurden. |
DirectML-Beispielanwendungen | Links zu DirectML-Beispielanwendungen, einschließlich eines Beispiels einer minimalen DirectML-Anwendung. |
GPU-beschleunigtes ML-Training | Behandelt die Aspekte, die derzeit vom GPU-beschleunigten Machine Learning (ML)-Training für das Windows-Subsystem für Linux (WSL) und systemeigenes Windows unterstützt werden. |
DirectML-API-Referenz | In diesem Abschnitt werden DirectML-APIs (Direct Machine Learning) behandelt, die in deklariert sind DirectML.h . |