Il formato numerico bfloat16

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

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

immagine

L'intervallo dinamico di bfloat16 e float32 è equivalente. Tuttavia, bfloat16 occupa metà dello spazio di memoria. Per ulteriori informazioni sulle prestazioni di bfloat16, consulta Uno studio di BFLOAT16 per il deep learning.

Scelta di bfloat16

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

Le reti neurali sono più sensibili alle dimensioni dell'esponente rispetto a quelle della mantissa. Per garantire un comportamento identico per underflow, overflow e NaN, bfloat16 ha la stessa dimensione esponente di float32. bfloat16 gestisce i valori denormali a differenza di float32, li cancella a zero. A differenza di float16, che in genere richiede una gestione speciale come la scalabilità della perdita, bfloat16 sostituisce float32 durante l'addestramento e l'esecuzione di reti neurali profonde.

Addestramento a precisione mista

La maggior parte dei calcoli in una rete neurale profonda può svolgere un'attività con la stessa precisione, utilizzando valori di precisione inferiori. Alcuni modelli possono anche raggiungere una precisione superiore con valori di precisione più bassi.

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

Dettagli sulla conversione di formato

La conversione del formato da float32 a bfloat16 viene inserita automaticamente dal compilatore XLA. Su TPU, lo schema di arrotondamento nella conversione è arrotondato al pari più vicino e con overflow a inf. Inoltre, l'oggetto bfloat16 su Cloud TPU non supporta i subnormali, pertanto tutti i subnormali vengono cancellati a zero durante la conversione. I valori speciali, come NaN e inf, vengono conservati nella conversione.

Il compilatore XLA inserisce automaticamente anche la conversione del formato da bfloat16 a float32. Poiché float32 può rappresentare tutti i valori esatti in bfloat16, la conversione occupa semplicemente 16 zeri nei bit 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 distribuiti su altre piattaforme hardware (ad esempio, inferenza o ottimizzazione su CPU o GPU) senza conversioni manuali estese.

Migliorare le prestazioni con bfloat16

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

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

  2. Alcune operazioni sono vincolate alla larghezza di banda della memoria, il che significa che il tempo necessario per caricare i dati dalla memoria può rallentare il tempo complessivo dedicato all'esecuzione del calcolo. L'archiviazione degli operandi e degli 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 fare un po' di pratica con uno dei modelli di riferimento abilitati per bfloat16 ottimizzati per le Cloud TPU. Successivamente, 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 modelli di machine learning in modo autonomo.