Condividi tramite


Panoramica di DirectML

Riassunto

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 carichi di lavoro di inferenza di Machine Learning nel gioco, nel motore, nel middleware, nel back-end o in un'altra applicazione. DirectML è supportato da tutti gli hardware compatibili con DirectX 12.

Le primitive di Machine Learning con accelerazione hardware (denominate operatori) sono i blocchi predefiniti di DirectML. Da questi blocchi di base, è possibile sviluppare tecniche di apprendimento automatico come l'upscaling, l'anti-aliasing e il trasferimento dello stile, per citarne alcuni. La riduzione del rumore e la super-risoluzione, ad esempio, consentono di ottenere effetti a ray tracing impressionanti con un minor numero di raggi per pixel.

È possibile integrare carichi di lavoro di inferenza di 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 per l'hardware e l'architettura. 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. Comprendere quali operatori eseguire e quando farlo è tua responsabilità in quanto 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 possiede una conoscenza di alto livello dei grafici (è possibile codificare direttamente il 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, si registra il lavoro negli elenchi di comandi e poi li si esegue su una coda.

Inizializzazione

  1. Creare le risorse Direct3D 12, ovvero il dispositivo Direct3D 12, la coda dei comandi, la lista 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, registri l'associazione e l'inizializzazione di (ad esempio) l'operatore di convoluzione nella lista di comandi. Quindi, chiudi ed esegui il tuo elenco di comandi nella coda come di consueto.

Esecuzione

  1. Carica 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, lo si fa nello stesso modo in cui lo si farebbe 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. Registra nell'elenco dei comandi il collegamento e l'esecuzione dei tuoi 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 a strati e basati su grafi in DirectML

DirectML supporta sia approcci basati su livelli che su grafi per l'esecuzione del modello. Quando si esegue strato per strato, si è responsabili della creazione e dell'inizializzazione di ogni operatore DirectML e della loro registrazione individuale per l'esecuzione su una lista 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 alternare i carichi di lavoro di rendering Direct3D 12 con i processi 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 strato per strato offre anche un controllo esplicito sugli schemi dei tensori 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 alla programmazione 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 accelerato dalla GPU per il sottosistema Windows per Linux (WSL) e da Windows nativo.
Informazioni di riferimento sulle API DirectML Questa sezione illustra le API Direct Machine Learning (DirectML) dichiarate in DirectML.h.

Vedere anche