
Perché abbiamo costruito XLA?
Avevamo diversi obiettivi per far lavorare XLA con TensorFlow:
Migliora la velocità di esecuzione. Compila sottografi per ridurre il tempo di esecuzione delle operazioni di breve durata per eliminare l'overhead dal runtime di TensorFlow, fondere le operazioni in pipeline per ridurre l'overhead della memoria e specializzarti in forme di tensore note per consentire una propagazione costante più aggressiva.
Migliora l'utilizzo della memoria. Analizza e pianifica l'utilizzo della memoria, eliminando in linea di principio molti buffer di archiviazione intermedi.
Riduci la dipendenza dalle operazioni personalizzate. Elimina la necessità di molte operazioni personalizzate migliorando le prestazioni delle operazioni di basso livello fuse automaticamente in modo che corrispondano alle prestazioni delle operazioni personalizzate che sono state fuse a mano.
Riduci l'ingombro dei dispositivi mobili. Elimina il runtime di TensorFlow compilando in anticipo il sottografo ed emettendo una coppia di file oggetto/intestazione che può essere collegata direttamente a un'altra applicazione. I risultati possono ridurre l'ingombro per l'inferenza mobile di diversi ordini di grandezza.
Migliora la portabilità. Rendi relativamente facile la scrittura di un nuovo backend per hardware nuovo, a quel punto una gran parte dei programmi TensorFlow verrà eseguita senza modifiche su quell'hardware. Ciò è in contrasto con l'approccio di specializzazione delle singole operazioni monolitiche per il nuovo hardware, che richiede la riscrittura dei programmi TensorFlow per utilizzare tali operazioni.
Come funziona XLA?
La lingua di input per XLA si chiama "HLO IR", o semplicemente HLO (High Level Operations). La semantica di HLO sono descritte sul funzionamento Semantica pagina. E 'più conveniente pensare HLO come IR compilatore .
XLA prende i grafici ("calcoli") definiti in HLO e li compila in istruzioni macchina per varie architetture. XLA è modulare, nel senso che è facile scanalatura in un backend alternativa ad indirizzare qualche romanzo architettura HW . Il backend della CPU per x64 e ARM64 e il backend della GPU NVIDIA si trovano nell'albero dei sorgenti di TensorFlow.
Il diagramma seguente mostra il processo di compilazione in XLA:

XLA viene fornito con diversi ottimizzazioni e passaggi di analisi che sono indipendente dal target, come CSE , bersaglio indipendente fusione funzionamento, e tampone di analisi per l'allocazione di memoria runtime per il calcolo.
Dopo il passaggio indipendente dal target, XLA invia il calcolo HLO a un backend. Il backend può eseguire ulteriori ottimizzazioni a livello di HLO, questa volta tenendo conto delle informazioni e delle esigenze specifiche del target. Ad esempio, il backend della GPU XLA può eseguire la fusione di operazioni vantaggiose in modo specifico per il modello di programmazione della GPU e determinare come partizionare il calcolo in flussi. In questa fase, i backend possono anche abbinare determinate operazioni o combinazioni di esse a chiamate di libreria ottimizzate.
Il passaggio successivo è la generazione di codice specifico per il target. I backend CPU e GPU in dotazione con XLA uso LLVM per basso livello IR, l'ottimizzazione e la generazione di codice. Questi backend emettono l'IR LLVM necessario per rappresentare il calcolo XLA HLO in modo efficiente, quindi invocano LLVM per emettere codice nativo da questo IR LLVM.
Il backend della GPU attualmente supporta le GPU NVIDIA tramite il backend LLVM NVPTX; il backend della CPU supporta più ISA CPU.