Share via


Panoramica di DirectML

Riepilogo

Direct Machine Learning (DirectML) è un'API di basso livello per Machine Learning (ML). L'API ha un'interfaccia di programmazione e un flusso di lavoro comuni (C++, nano-COM) nativi nello stile di DirectX 12. È possibile integrare i carichi di lavoro del machine learning nel gioco, nel motore, nel middleware, nel back-end o in un'altra applicazione. DirectML è supportato da tutto l'hardware compatibile con DirectX 12.

Le primitive di Machine Learning con accelerazione hardware (denominate operatori) sono i blocchi predefiniti di DirectML. Da questi blocchi predefiniti, è possibile sviluppare tecniche di Machine Learning come l'upscaling, l'anti-aliasing e il trasferimento dello stile, per denominare ma alcuni. La denoizzazione e la super risoluzione, ad esempio, consentono di ottenere effetti raytraced impressionanti con un minor numero di raggi per pixel.

È possibile integrare i carichi di lavoro del machine learning nel gioco, nel motore, nel middleware, nel back-end o in un'altra applicazione. DirectML ha un'interfaccia di programmazione e un flusso di lavoro di tipo DirectX 12 (C++, nano-COM) nativi ed è supportata da tutti gli hardware compatibili con DirectX 12. Per le applicazioni di esempio DirectML, incluso un esempio di applicazione DirectML minima, vedere Applicazioni di esempio DirectML.

DirectML è stato introdotto in Windows 10 versione 1903 e nella versione corrispondente di Windows SDK.

DirectML è appropriato per il progetto?

DirectML è un livello di astrazione hardware di basso livello che consente di eseguire carichi di lavoro di Machine Learning in qualsiasi GPU compatibile con DirectX 12.

Se è necessario ottimizzare le prestazioni di Machine Learning per scenari in tempo reale, prestazioni elevate, bassa latenza o vincoli di risorse, DirectML offre il controllo e la flessibilità più elevati. È possibile usare DirectML per integrare Machine Learning direttamente nel motore o nella pipeline di rendering esistente oppure per creare framework di Machine Learning personalizzati e middleware in Windows.

È anche possibile usare DirectML indirettamente tramite ONNX Runtime, ovvero una libreria multipiattaforma che supporta il formato ONNX standard aperto per i modelli di Machine Learning. Il runtime ONNX può usare DirectML come provider di esecuzione, insieme ad altri back-end, ad esempio CPU, CUDA o TensorRT. In questo modo, è possibile sfruttare le prestazioni e la compatibilità di DirectML senza scrivere codice DirectML manualmente.

In alternativa, è possibile usare l'API WinML, ovvero un'API basata su modelli di livello superiore che semplifica il flusso di lavoro di Machine Learning con il modello load-bind-evaluate. WinML usa anche il formato ONNX per i modelli e può usare DirectML come back-end. WinML è progettato per scenari in cui è necessario integrare facilmente e rapidamente l'apprendimento automatico nelle applicazioni Windows, senza doversi preoccupare dei dettagli dell'hardware o del framework sottostante.

Che cosa funziona DirectML; e che lavoro devo fare come sviluppatore?

DirectML esegue in modo efficiente i singoli livelli del modello di inferenza nella GPU (o nei core di accelerazione intelligenza artificiale, se presente). Ogni livello è un operatore e DirectML offre una libreria di operatori primitivi di Machine Learning con accelerazione hardware di basso livello. È possibile eseguire operazioni DirectML in isolamento o come grafico (vedere la sezione Flussi di lavoro basati su layer per livello e su grafo in DirectML).

Gli operatori e i grafici applicano ottimizzazioni specifiche dell'architettura e specifiche dell'hardware. Allo stesso tempo, lo sviluppatore vede un'unica interfaccia indipendente dal fornitore per l'esecuzione di tali operatori.

La libreria degli operatori in DirectML fornisce tutte le operazioni consuete che si prevede di poter usare in un carico di lavoro di Machine Learning.

  • Operatori di attivazione, ad esempio lineari, ReLU, sigmoid, tanh e altro ancora.
  • Operatori a livello di elemento, ad esempio add, exp, log, max, min, sub e altro ancora.
  • Operatori di convoluzione, come la convoluzione 2D e 3D e altro ancora.
  • Operatori di riduzione, ad esempio argmin, media, l2, somma e altro ancora.
  • Operatori di pooling, ad esempio media, lp e max.
  • Operatori di rete neurale (NN), ad esempio gemm, gru, lstm e rnn.
  • E molti altri.

Per ottenere prestazioni ottimali e in modo da non pagare per ciò che non si usa, DirectML inserisce il controllo nelle mani di uno sviluppatore sul modo in cui viene eseguito il carico di lavoro di Machine Learning sull'hardware. Capire quali operatori eseguire, e quando, è responsabilità dell'utente come sviluppatore. Le attività lasciate alla propria discrezione includono: trascrizione del modello; semplificare e ottimizzare i livelli; peso di caricamento; allocazione delle risorse, associazione, gestione della memoria (proprio come con Direct3D 12); e l'esecuzione del grafico.

Si mantiene una conoscenza generale dei grafici (è possibile impostare direttamente il codice del modello oppure scrivere il proprio caricatore di modelli). È possibile progettare un modello di upscaling, ad esempio, usando diversi livelli ognuno degli operatori upsample, convoluzione, normalizzazione e attivazione. Con tale familiarità, pianificazione attenta e gestione delle barriere, è possibile estrarre il parallelismo e le prestazioni più elevate dall'hardware. Se si sviluppa un gioco, l'attenta gestione delle risorse e il controllo sulla pianificazione consente di interleavere i carichi di lavoro di Machine Learning e il lavoro di rendering tradizionale per saturare la GPU.

Qual è il flusso di lavoro DirectML di alto livello?

Ecco la ricetta generale per come ci aspettiamo che DirectML venga usato. Nelle due fasi principali dell'inizializzazione e dell'esecuzione, registrare il lavoro negli elenchi di comandi e quindi eseguirli in una coda.

Inizializzazione

  1. Creare le risorse direct3D 12, ovvero il dispositivo Direct3D 12, la coda dei comandi, l'elenco di comandi e le risorse, ad esempio gli heap del descrittore.
  2. Poiché si esegue l'inferenza di Machine Learning e il carico di lavoro di rendering, creare risorse DirectML, ovvero le istanze del dispositivo e dell'operatore DirectML. Se si dispone di un modello di Machine Learning in cui è necessario eseguire un particolare tipo di convoluzione con una determinata dimensione del tensore di filtro con un particolare tipo di dati, questi sono tutti parametri nell'operatore di convoluzione di DirectML.
  3. I record DirectML funzionano in elenchi di comandi Direct3D 12. Quindi, una volta completata l'inizializzazione, registrare l'associazione e l'inizializzazione di (ad esempio) l'operatore di convoluzione nell'elenco di comandi. Quindi, chiudere ed eseguire l'elenco di comandi nella coda come di consueto.

Esecuzione

  1. Caricare i tensori di peso nelle risorse. Un tensore in DirectML viene rappresentato usando una normale risorsa Direct3D 12. Ad esempio, se si vogliono caricare i dati di peso nella GPU, si esegue la stessa operazione con qualsiasi altra risorsa Direct3D 12 (usare un heap di caricamento o la coda di copia).
  2. Successivamente, è necessario associare le risorse Direct3D 12 come tensori di input e output. Registrare nell'elenco dei comandi l'associazione e l'esecuzione degli operatori.
  3. Chiudere ed eseguire l'elenco dei comandi.

Come per Direct3D 12, la durata delle risorse e la sincronizzazione sono responsabilità dell'utente. Ad esempio, non rilasciare almeno gli oggetti DirectML fino a quando non hanno completato l'esecuzione nella GPU.

Flussi di lavoro basati su più livelli e su grafo in DirectML

DirectML supporta sia approcci basati su layer che su grafo per l'esecuzione del modello. Quando si esegue layer per livello, si è responsabili della creazione e dell'inizializzazione di ogni operatore DirectML e della registrazione individuale per l'esecuzione in un elenco di comandi. Al contrario, quando si esegue un grafico, si crea invece un set di nodi e archi, in cui ogni nodo rappresenta un operatore DirectML e i bordi rappresentano il flusso di dati tensor tra i nodi. L'intero grafico viene quindi inviato per l'inizializzazione o l'esecuzione contemporaneamente e DirectML gestisce la pianificazione e la registrazione dei singoli operatori per conto dell'utente.

Entrambi i modelli sono utili in situazioni diverse. Un approccio di livello per livello consente di controllare al massimo l'ordinamento e la pianificazione del lavoro di calcolo. Ad esempio, questo livello di controllo consente di interleavere i carichi di lavoro di rendering direct3D 12 con i dispatch di calcolo DirectML. Ciò può essere utile per sfruttare le unità di calcolo asincrone o shader nella GPU che altrimenti sarebbero inattive. L'esecuzione manuale del livello per livello offre anche un controllo esplicito sugli schemi tensor e sull'utilizzo della memoria.

Tuttavia, i modelli di Machine Learning vengono spesso espressi in termini di grafici di livelli. In alternativa all'approccio di livello per livello, DirectML consente di esprimere il modello come grafo aciclico diretto di nodi (operatori DirectML) e bordi tra di essi (descrizioni tensor). Dopo aver compilato una descrizione del grafo, è possibile compilarlo e inviarlo contemporaneamente a DirectML per l'inizializzazione e l'esecuzione. In questo approccio DirectML decide in base a un ordine di attraversamento e gestisce ogni singolo operatore e il flusso di dati tra di essi per conto dell'utente. Questo è spesso un modo più semplice e più naturale per esprimere un modello di Machine Learning e consentire l'applicazione automatica di ottimizzazioni specifiche di achitecture. Inoltre, la libreria helper DirectMLX fornisce una sintassi pulita e pratica per creare grafici complessi di operatori DirectML.

Indipendentemente dall'approccio preferito, si avrà sempre accesso alla stessa vasta gamma di operatori DirectML. Ciò significa che non è mai necessario sacrificare la funzionalità se si preferisce il controllo granulare dell'approccio layer per livello o la praticità dell'approccio al grafico.

In questa sezione

Argomento Descrizione
Guida introduttiva Introduzione all'uso di DirectML.
Strumenti di sviluppo Strumenti per profilare, ottimizzare ed eseguire il debug di DirectML.
Guida per programmatori Argomenti relativi al data binding, alle barriere, alle diapositive, alle fusioni, alla gestione degli errori, alla rimozione dei dispositivi e alle funzioni helper.
Risoluzione dei problemi Gestione delle condizioni di errore e utilizzo del livello di debug.
Cronologia delle versioni di DirectML DirectML è un componente di sistema di Windows 10 ed è disponibile anche come pacchetto ridistribuibile autonomo.
Cronologia del livello di funzionalità DirectML Manifesto dei tipi introdotti in ogni livello di funzionalità.
Applicazioni di esempio DirectML Collegamenti ad applicazioni di esempio DirectML, incluso un esempio di applicazione DirectML minima.
Training di Machine Learning accelerato con GPU Vengono illustrati gli elementi attualmente supportati dal training di Machine Learning (ML) accelerato dalla GPU per il sottosistema Windows per Linux (WSL) e windows nativo.
Informazioni di riferimento sulle API DirectML Questa sezione illustra le API Direct Machine Learning (DirectML) dichiarate in DirectML.h.

Vedi anche