Il formato numerico b floating16

L'uso di numeri a virgola mobile a precisione ridotta è un metodo comune utilizzato per ridurre il tempo di convergenza senza perdere precisione. Le TPU utilizzano il formato numerico bfloat16 per le operazioni con le matrici. Le operazioni di moltiplicazione delle matrici vengono eseguite sui valori bfloat16, mentre gli accumuli vengono eseguiti sui valori IEEE float32.

bfloat16 è un formato personalizzato a 16 bit con virgola mobile per il machine learning, composto da un bit di segno, otto bit di esponente e sette bit di mantissa. Il seguente diagramma mostra gli elementi interni di tre formati con virgola mobile: float32: precisione singola IEEE, float16: precisione parziale IEEE e bfloat16.

immagine

L'intervallo dinamico bfloat16 e float32 è equivalente. Tuttavia, bfloat16 occupa metà dello spazio di memoria. Per saperne di più sulle prestazioni bfloat16, consulta uno studio su BFLOAT16 per il deep learning.

Scegliere bFlo16

Il team per l'hardware di Google ha scelto bfloat16 per le Cloud TPU al fine di migliorare l'efficienza hardware mantenendo al contempo la possibilità di addestrare modelli di deep learning in modo accurato, il tutto con costi di trasferimento minimi da float32. Le dimensioni fisiche di un moltiplicatore di hardware si adattano al quadrato della larghezza della mantissa. Con un numero di punte mantissa inferiore a FP16, i moltiplicatori bfloat16 sono circa la metà delle dimensioni del silicio di un moltiplicatore FP16 tipico e sono otto volte più piccoli di un moltiplicatore float32.

Le reti neurali sono più sensibili alle dimensioni dell'esponente rispetto alle dimensioni della mantissa. Per garantire lo stesso comportamento per underflow, overflow e NaN, bfloat16 ha le stesse dimensioni dell'esponente di float32. bfloat16 gestisce i anomalie in modo diverso da float32, riducendoli a zero. A differenza di float16, che in genere richiede una gestione speciale, come la scalabilità di perdita, bfloat16 sostituisce il float32 per l'addestramento e l'esecuzione di reti neurali profonde.

Allenamento di precisione mista

La maggior parte dei calcoli all'interno di una rete neurale profonda può svolgere un'attività con la stessa precisione, utilizzando valori di precisione inferiore. Alcuni modelli possono raggiungere una precisione maggiore con valori di precisione inferiore.

Durante la programmazione di Cloud TPU, il compilatore XLA converte automaticamente i valori tra float32 e bfloat16.

Dettagli sulla conversione dei formati

La conversione del formato da fluttuare 32 a flottante 16 viene inserita automaticamente dal compilatore XLA. Su TPU, lo schema di arrotondamento nella conversione è arrotondato al più vicino uniforme e overflow ad inf. Inoltre, bFlo16 su Cloud TPU non supporta i valori subnormali, quindi tutti i valori anomali vengono azzerati durante la conversione. I valori speciali, come NaN e inf, vengono conservati nella conversione.

Anche la conversione del formato da bFlo16 a Floft32 viene inserita automaticamente dal compilatore XLA. Poiché fluttuante32 può rappresentare tutti i valori esatti in bfloating16, la conversione inserisce semplicemente 16 zeri nelle punte di mantissa. I valori speciali vengono conservati nella conversione.

Portabilità del modello

I valori dei parametri e delle attivazioni in un modello possono essere archiviati in formato a 32 bit perché l'hardware TPU può trasmettere automaticamente questi valori a bfloat16. I checkpoint ottenuti da un modello addestrato su Cloud TPU possono essere sottoposti a deployment su altre piattaforme hardware (ad esempio, l'inferenza o la messa a punto su CPU o GPU) senza numerose conversioni manuali.

Migliorare le prestazioni con bFlo16

La conversione automatica del formato nelle TPU consente di evitare di pensare alla precisione numerica, ma è possibile ottenere ulteriori miglioramenti delle prestazioni trasmettendo esplicitamente i valori a bfloat16. Esistono due motivi per trasmettere esplicitamente i valori a bfloat16:

  1. L'archiviazione di valori in formato bfloat16 consente di risparmiare memoria su chip, consentendo alle Cloud TPU di addestrare modelli più grandi o di utilizzare batch di dimensioni maggiori.

  2. Alcune operazioni prevedono limiti di larghezza di banda di memoria, ovvero il tempo necessario per caricare i dati dalla memoria può rallentare il tempo complessivo necessario per eseguire il calcolo. L'archiviazione di operandi e output di queste operazioni in formato bfloat16 riduce la quantità di dati che devono essere trasferiti, migliorando la velocità complessiva.

Per iniziare, ti consigliamo di acquisire esperienza pratica con uno dei modelli di riferimento abilitati per bfloat16 che sono stati ottimizzati per le Cloud TPU. Dopodiché, la nostra guida al rendimento, la guida agli strumenti di profilazione e la guida alla risoluzione dei problemi forniscono informazioni tecniche approfondite per aiutarti a creare e ottimizzare autonomamente i modelli di machine learning.