Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Architettura XLA

Perché abbiamo costruito XLA?

Avevamo diversi obiettivi per XLA per lavorare con TensorFlow:

  • Migliora la velocità di esecuzione. Compilare sottografi per ridurre il tempo di esecuzione di operazioni di breve durata per eliminare l'overhead dal runtime di TensorFlow, fondere operazioni pipeline per ridurre l'overhead della memoria e specializzarsi su forme tensoriali 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 per abbinare le prestazioni delle operazioni personalizzate che sono state fuse a mano.

  • Riduci l'impronta mobile. 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'impronta per l'inferenza mobile di diversi ordini di grandezza.

  • Migliora la portabilità. Rendi relativamente facile scrivere un nuovo backend per un nuovo hardware, a quel punto una grande frazione dei programmi TensorFlow verrà eseguita senza modifiche su quell'hardware. Ciò è in contrasto con l'approccio di specializzare le singole operazioni monolitiche per il nuovo hardware, che richiede la riscrittura dei programmi TensorFlow per utilizzarle.

Come funziona XLA?

La lingua di input per XLA si chiama "HLO IR", o semplicemente HLO (High Level Optimizer). La semantica di HLO è descritta nella pagina Operation Semantics . È più conveniente pensare a HLO come a un compilatore IR .

XLA prende i grafici ("calcoli") definiti in HLO e li compila in istruzioni macchina per varie architetture. XLA è modulare, nel senso che è facile da inserire in un backend alternativo per indirizzare alcune nuove architetture 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 diverse ottimizzazioni e passaggi di analisi indipendenti dall'obiettivo, come CSE , fusione di operazioni indipendenti dall'obiettivo e analisi del buffer per l'allocazione della memoria di runtime per il calcolo.

Dopo il passaggio indipendente dalla destinazione, XLA invia il calcolo dell'HLO a un back-end. Il backend può eseguire ulteriori ottimizzazioni a livello di HLO, questa volta tenendo presenti le informazioni e le esigenze specifiche del target. Ad esempio, il backend della GPU XLA può eseguire la fusione di operazioni vantaggiosa specificamente per il modello di programmazione GPU e determinare come suddividere il calcolo in flussi. In questa fase, i backend possono anche abbinare determinate operazioni o loro combinazioni a chiamate di libreria ottimizzate.

Il passaggio successivo è la generazione di codice specifico per il target. I backend CPU e GPU inclusi con XLA utilizzano LLVM per IR di basso livello, ottimizzazione e generazione di codice. Questi backend emettono l'IR LLVM necessario per rappresentare il calcolo XLA HLO in modo efficiente, quindi richiamano LLVM per emettere codice nativo da questo IR LLVM.

Il backend GPU attualmente supporta le GPU NVIDIA tramite il backend LLVM NVPTX; il backend della CPU supporta più ISA della CPU.