Udostępnij przez


Omówienie języka DirectML

Podsumowanie

Direct Machine Learning (DirectML) to interfejs API niskiego poziomu do uczenia maszynowego (ML). Interfejs API ma znany (natywny interfejs programowania C++, nano-COM) i przepływ pracy w stylu DirectX 12. Obciążenia wnioskowania uczenia maszynowego można zintegrować z grą, silnikiem, oprogramowaniem pośredniczącym, backendem lub inną aplikacją. DirectML jest obsługiwany przez wszystkie urządzenia zgodne ze standardem DirectX 12.

Przyspieszane sprzętowo typy pierwotne uczenia maszynowego (nazywane operatorami) to bloki konstrukcyjne języka DirectML. Z tych bloków konstrukcyjnych można opracowywać takie techniki uczenia maszynowego, jak skalowanie, antyaliasing i transfer stylu, aby wymienić tylko kilka. Na przykład, usuwanie szumów i super-rozdzielczość umożliwiają osiągnięcie imponujących efektów śledzenia promieni przy użyciu mniejszej liczby promieni na piksel.

Obciążenia wnioskowania uczenia maszynowego można zintegrować z grą, silnikiem, oprogramowaniem pośredniczącym, backendem lub inną aplikacją. DirectML ma znany interfejs programowania w stylu DirectX 12 (natywny C++, nano-COM) i przepływ pracy, które są obsługiwane przez cały sprzęt kompatybilny z DirectX 12. Aby zapoznać się z przykładowymi aplikacjami DirectML, w tym próbką minimalnej aplikacji DirectML, zobacz Przykładowe aplikacje DirectML.

DirectML zostało wprowadzone w systemie Windows 10 w wersji 1903 oraz w odpowiedniej wersji Windows SDK.

Czy kod DirectML jest odpowiedni dla mojego projektu?

DirectML to warstwa abstrakcji sprzętu niskiego poziomu, która umożliwia uruchamianie obciążeń uczenia maszynowego na dowolnym zgodnym procesorze GPU DirectX 12.

Jeśli potrzebujesz zoptymalizować wydajność uczenia maszynowego pod kątem scenariuszy uczenia maszynowego w czasie rzeczywistym, o wysokiej wydajności, małych opóźnieniach lub ograniczonych zasobach, usługa DirectML zapewnia największą kontrolę i elastyczność. Możesz użyć DirectML, aby zintegrować uczenie maszynowe bezpośrednio z istniejącym silnikiem lub potokiem renderowania albo stworzyć własne niestandardowe frameworki uczenia maszynowego i oprogramowanie pośredniczące w systemie Windows.

Można również użyć języka DirectML pośrednio za pośrednictwem środowiska uruchomieniowego ONNX, który jest biblioteką międzyplatformową, która obsługuje otwarty standardowy format ONNX dla modeli uczenia maszynowego. Środowisko uruchomieniowe ONNX może używać DirectML jako jednego z dostawców środowiska uruchomieniowego, a także innych zapleczy, takich jak CPU, CUDA lub TensorRT. Dzięki temu możesz samodzielnie wykorzystać wydajność i zgodność języka DirectML bez konieczności samodzielnego pisania kodu DirectML.

Alternatywnie możesz użyć interfejsu API WinML, który jest interfejsem API skoncentrowanym na modelu wyższego poziomu, który upraszcza przepływ pracy uczenia maszynowego przy użyciu wzorca load-bind-evaluate. WinML używa również formatu ONNX dla modeli i może używać języka DirectML jako zaplecza. WinML jest przeznaczony dla scenariuszy, w których konieczne jest szybkie i łatwe integrowanie uczenia maszynowego z aplikacjami systemu Windows bez obaw o szczegóły podstawowego sprzętu lub struktury.

Jaką pracę wykonuje DirectML, a jaką muszę wykonać jako deweloper?

Funkcja DirectML efektywnie wykonuje poszczególne warstwy modelu wnioskowania na procesorze GPU (lub na rdzeniach przyspieszania sztucznej inteligencji, jeśli istnieje). Każda warstwa jest operatorem, a directML udostępnia bibliotekę operatorów pierwotnych uczenia maszynowego o niskim poziomie. Operacje DirectML można wykonywać w izolacji lub jako graf (zobacz sekcję Przepływy pracy oparte na warstwach i grafach w języku DirectML).

Operatory i grafy stosują optymalizacje specyficzne dla sprzętu i architektury. Jednocześnie jako deweloper widzisz jeden, niezależny od dostawcy interfejs do wykonywania tych operatorów.

Biblioteka operatorów w języku DirectML dostarcza wszystkie typowe operacje, których można użyć w obciążeniu uczenia maszynowego.

  • Operatory aktywacji, takie jak linear, ReLU, sigmoid, tanh i inne.
  • Operatory elementarne, takie jak dodawanie, exp, log, max, min, sub i nie tylko.
  • Operatory konwolucji, takie jak splot 2D i 3D oraz inne.
  • Operatory redukcji, takie jak argmin, średnia, l2, suma i inne.
  • Operatory zagregowania, takie jak średnia, lp i maks.
  • Operatory sieci neuronowej (NN), takie jak gemm, gru, lstm i rnn.
  • I wiele innych.

Aby uzyskać maksymalną wydajność i nie płacić za to, czego nie wykorzystujesz, DirectML oddaje kontrolę w twoje ręce jako dewelopera nad sposobem wykonywania obciążenia uczenia maszynowego na sprzęcie. Twoim zadaniem jako programisty jest ustalenie, które operatory należy wykonać i kiedy. Zadania pozostawione do uznania obejmują: transkrypcję modelu; upraszczanie i optymalizowanie warstw; ładowanie wag; alokację zasobów, powiązanie, zarządzanie pamięcią (podobnie jak w przypadku Direct3D 12); oraz wykonanie grafu.

Zachowasz zaawansowaną wiedzę na temat grafów (możesz bezpośrednio osadzić swój model w kodzie lub napisać własny program ładujący model). Można na przykład zaprojektować model upscaling, używając kilku warstw, z których każda zawiera operatory upsample, konwolucji, normalizacji oraz aktywacji. Dzięki tej znajomości, starannemu planowaniu i zarządzaniu barierami można wyodrębnić najwięcej równoległości i wydajności ze sprzętu. Jeśli tworzysz grę, staranne zarządzanie zasobami i kontrola nad planowaniem umożliwiają przeplatanie obciążeń uczenia maszynowego i tradycyjnej pracy renderowania w celu saturacji procesora GPU.

Jaki jest przepływ pracy wysokiego poziomu w DirectML?

Oto ogólny schemat, w jaki oczekujemy, że DirectML będzie używany. W dwóch głównych fazach inicjowania i wykonywania rejestrujesz pracę na listach poleceń, a następnie wykonujesz je w kolejce.

Inicjalizacja

  1. Utwórz zasoby Direct3D 12 — urządzenie Direct3D 12, kolejkę poleceń, listę poleceń i zasoby, takie jak stosy deskryptorów.
  2. Ponieważ wykonujesz zarówno wnioskowanie uczenia maszynowego, jak i obciążenie związane z renderowaniem, utwórz zasoby DirectML: instancje urządzenia DirectML oraz operatorów. Jeśli masz model uczenia maszynowego, w którym musisz wykonać określony rodzaj splotu z użyciem tensora filtra o określonym rozmiarze i typie danych, to wszystkie te parametry są parametrami operatora konwolucji DirectML.
  3. Rekordy DirectML działają na listach poleceń Direct3D 12. Dlatego po zakończeniu inicjowania należy zarejestrować powiązanie i inicjowanie operatora konwolucji (na przykład) na liście poleceń. Następnie zamknij i wykonaj listę poleceń w kolejce, jak zwykle.

Egzekucja

  1. Prześlij swoje tensory wagi do zasobów. W DirectML tensor jest reprezentowany przy użyciu zwykłego zasobu Direct3D 12. Jeśli na przykład chcesz przekazać dane wagi do GPU, zrób to w taki sam sposób jak przy użyciu dowolnego innego zasobu Direct3D 12 (użyj sterty przekazywania lub kolejki kopiowania).
  2. Następnie należy powiązać te zasoby Direct3D 12 jako twoje tensory wejściowe i wyjściowe. Zapisz na liście poleceń powiązanie i wykonywanie operatorów.
  3. Zamknij i wykonaj listę poleceń.

Podobnie jak w przypadku wersji Direct3D 12 okres istnienia zasobów i synchronizacja są Twoim zadaniem. Na przykład nie zwalniaj obiektów DirectML co najmniej do momentu ukończenia wykonywania na procesorze GPU.

Przepływy pracy oparte na warstwach i grafach w DirectML

DirectML obsługuje zarówno metody warstwa po warstwie, jak i oparte na grafach dla wykonywania modeli. Podczas wykonywania warstwy po warstwie odpowiadasz za tworzenie i inicjowanie każdego operatora DirectML oraz indywidualne rejestrowanie ich do wykonania na liście poleceń. Natomiast podczas wykonywania grafu zamiast tego tworzysz zestaw węzłów i krawędzi — gdzie każdy węzeł reprezentuje operator DirectML, a krawędzie reprezentują dane tensor przepływające między węzłami. Cały graf jest następnie przesyłany do jednoczesnej inicjalizacji lub wykonania, a DirectML obsługuje planowanie i rejestrowanie poszczególnych operatorów w Twoim imieniu.

Oba wzorce są przydatne w różnych sytuacjach. Podejście warstwowe po warstwie zapewnia maksymalną kontrolę nad kolejnością i planowaniem pracy obliczeniowej. Na przykład ten poziom kontroli umożliwia przeplatanie zadań renderowania Direct3D 12 z wysyłaniem obliczeń DirectML. Może to być przydatne w przypadku korzystania z asynchronicznych jednostek obliczeniowych lub cieniujących na procesorze GPU, które w przeciwnym razie byłyby bezczynne. Ręczne wykonywanie warstwy według warstwy zapewnia również jawną kontrolę dewelopera nad układami tensorowymi i użyciem pamięci.

Jednak modele uczenia maszynowego są często wyrażane w postaci grafów warstw. Alternatywą dla podejścia warstwa-po-warstwie jest język DirectML, który umożliwia wyrażanie modelu jako skierowanego acyklicznego grafu węzłów (operatorów DirectML) i krawędzi między nimi (opisy tensorów). Po utworzeniu opisu grafu można skompilować i przesłać je jednocześnie do języka DirectML na potrzeby inicjowania i wykonywania. W tym podejściu DirectML decyduje o kolejności przetwarzania i zarządza każdym operatorem oraz przepływem danych między nimi w Twoim imieniu. Jest to często prostszy i bardziej naturalny sposób wyrażania modelu uczenia maszynowego i umożliwia automatyczne stosowanie optymalizacji specyficznych dla architektury. Ponadto biblioteka pomocnika DirectMLX zapewnia czystą i wygodną składnię do tworzenia złożonych grafów operatorów DirectML.

Niezależnie od preferowanego podejścia zawsze będziesz mieć dostęp do tego samego obszernego zestawu operatorów DirectML. Oznacza to, że nigdy nie trzeba poświęcać funkcjonalności, niezależnie od tego, czy preferujesz precyzyjną kontrolę podejścia warstwowego, czy też wygodę podejścia grafowego.

W tym dziale

Temat Opis
Przewodnik Szybki start Wprowadzenie do korzystania z języka DirectML.
Narzędzia deweloperskie Narzędzia do profilowania, optymalizowania i debugowania języka DirectML.
Przewodnik programowania Tematy dotyczące powiązań danych, barier, slajdów, łączenia, obsługi błędów, usuwania urządzeń i funkcji pomocnika.
Rozwiązywanie problemów Obsługa warunków błędów i używanie warstwy debugowania.
Historia wersji języka DirectML DirectML jest składnikiem systemu Windows 10 i jest również dostępny jako autonomiczny pakiet redystrybucyjny.
Historia poziomu funkcji DirectML Manifest typów wprowadzonych na każdym poziomie funkcji.
Przykładowe aplikacje DirectML Linki do przykładowych aplikacji DirectML, w tym próbki minimalnej aplikacji DirectML.
Szkolenie uczenia maszynowego przyspieszone przez GPU Obejmuje to, co jest obecnie obsługiwane przez szkolenie uczenia maszynowego przyspieszane przez GPU dla podsystemu Windows dla systemu Linux (WSL) i natywnego systemu Windows.
Dokumentacja interfejsu API directML W tej sekcji opisano interfejsy API usługi Direct Machine Learning (DirectML) zadeklarowane w pliku DirectML.h.

Zobacz także