Visualizzatore dei bit di FP16 e bfloat16
Strumento gratuito che mostra la configurazione dei bit dei numeri in virgola mobile a mezza precisione, cioè FP16 secondo la norma IEEE 754 binary16, e di bfloat16. Converte in entrambi i sensi, dal decimale ai bit e viceversa, distinguendo con colori diversi segno, esponente e mantissa. Utile per studiare la quantizzazione e l'accelerazione dell'inferenza nell'apprendimento automatico.
Confronto fra la struttura di FP16 e quella di bfloat16
Entrambi occupano sedici bit in tutto, ma li ripartiscono in modo diverso fra esponente e mantissa: l'intervallo dei valori rappresentabili e la precisione risultano quindi completamente diversi.
| Voce | FP16 (IEEE 754 mezza precisione) | bfloat16 |
|---|---|---|
| Bit complessivi | 16 | 16 |
| Bit dell'esponente | 5 | 8 |
| Bit della mantissa | 10 | 7 |
| Intervallo dei valori rappresentabili | Da circa ±6,1×10⁻⁵ a ±65504 (intervallo ristretto, ma mantissa ampia e quindi precisione elevata) | Da circa ±1,2×10⁻³⁸ a ±3,4×10³⁸ (stesso ampio intervallo di float32, ma precisione inferiore) |
| Impieghi principali | Elaborazione delle immagini e grafica; risparmio di memoria nell'inferenza, cioè apprendimento a mezza precisione | Addestramento nell'apprendimento profondo, su TPU e schede grafiche recenti. Nella conversione da float32 non occorre preoccuparsi del traboccamento dell'esponente |
Poiché bfloat16 ha lo stesso esponente di float32, cioè a precisione singola — otto bit e polarizzazione 127 — presenta il vantaggio pratico di poter essere ottenuto dal float32 con il semplice troncamento della mantissa.
Vedere come i bit si dispongano in FP16 e bfloat16
Benché entrambi occupino sedici bit, l'FP16, ossia l'IEEE 754 binary16, e il bfloat16 ripartiscono quei bit in modi assai diversi. Questo strumento converte fra valori decimali e schemi di bit e colora separatamente il segno, l'esponente e la mantissa, affinché la differenza si veda e non soltanto si legga.
Il punto sta nella ripartizione. L'FP16 dà cinque bit all'esponente e dieci alla mantissa, mentre il bfloat16 ne dà otto all'esponente e sette alla mantissa. Otto bit di esponente sono esattamente quanto usa la precisione singola, e di qui discendono due proprietà. La prima è che il bfloat16 abbraccia lo stesso intervallo di valori dell'FP32; la seconda, che convertire dall'FP32 si riduce a troncare ai sedici bit superiori. Ecco perché l'apprendimento automatico predilige il bfloat16: il rischio che un valore esca dall'intervallo e rovini un addestramento è assai minore. Il prezzo è una mantissa di soli sette bit, sicché la precisione riesce più grossolana di quella dell'FP16. Scegliete l'FP16 dove conti la precisione e il bfloat16 dove conti l'intervallo.
Come si usa
- Scegliete il verso della conversione Da decimale a bit e da bit a decimale sono entrambi disponibili.
- Inserite un valore Vanno ugualmente bene un numero decimale o una sequenza di uni e zeri.
- Leggete i bit colorati Il segno, l'esponente e la mantissa compaiono ciascuno con il proprio colore.
- Accostate FP16 e bfloat16 Rappresentare lo stesso valore nei due formati mostra con esattezza dove si separino.
Consigli per sfruttarlo al meglio
- Anche per uno stesso valore come 0,1, l'errore di arrotondamento si manifesta in modo del tutto diverso in FP16 e in bfloat16. Provate a cambiare formato e a confrontare le sequenze di bit della mantissa.
- Poiché bfloat16 ha l'esponente della stessa ampiezza e polarizzazione di float32, difficilmente trabocca anche con valori grandi, superiori a 65504. FP16, al contrario, diventa infinito non appena si supera quella soglia.
- Convertendo 70000 in FP16 si ottiene un traboccamento e quindi l'infinito, mentre in bfloat16 il valore è ancora rappresentabile, seppure con precisione ridotta.
- Quando si quantizza un modello con le principali librerie per l'apprendimento automatico, bfloat16 si ottiene facilmente da float32, mentre FP16, per il suo intervallo ristretto, può richiedere una scalatura preventiva.
- Nella conversione inversa a partire dai bit occorre indicare quattro cifre esadecimali con il prefisso
0xoppure sedici cifre binarie, con il prefisso0bfacoltativo.
Quando torna utile
Nel comprendere che cosa costi la quantizzazione
Potete stabilire in concreto fin dove un valore venga arrotondato quando un modello scende a sedici bit.
Nel decidere fra i due formati
Vi dà il materiale per soppesare se il vostro caso richieda intervallo o precisione.
Nel trovare dove cominci il traboccamento
Potete provare, su valori reali, che cosa accada non appena si superi il massimo numero rappresentabile in FP16.
Nell'apprendere il funzionamento della virgola mobile
Potete seguire, bit per bit, come un esponente e una mantissa si compongano a esprimere un solo numero.
Termini della virgola mobile
- Bit di segno
- L'unico bit più alto, che dà il segno: 0 per positivo e 1 per negativo.
- Esponente
- La parte che esprime l'ordine di grandezza del valore. L'FP16 gli assegna cinque bit e il bfloat16 otto.
- Mantissa
- La parte corrispondente alle cifre significative. L'FP16 ne ha dieci bit e il bfloat16 sette, e quel divario è per l'appunto la differenza di precisione.
- Bfloat16
- Un formato a sedici bit che tiene l'esponente agli otto bit dell'FP32. Dimezza la memoria senza sacrificare l'intervallo.
- Numero subnormale
- La rappresentazione usata quando l'esponente è al minimo, che consente valori estremamente vicini allo zero.
- Quantizzazione
- La pratica di esprimere i pesi di un modello con meno bit. Calano la memoria e il calcolo, e con essi la precisione.
Domande frequenti
A proposito — perché l'apprendimento automatico ha voluto rappresentazioni numeriche «meno precise»
Intorno al 2018 Google ideò per le proprie unità di elaborazione tensoriale un nuovo formato in virgola mobile a sedici bit, bfloat16. FP16, la mezza precisione della norma IEEE 754, esisteva già da tempo ed era in uso nell'elaborazione delle immagini e nella grafica, ma con soli cinque bit di esponente copriva un intervallo troppo ristretto e non reggeva i fenomeni tipici dell'addestramento profondo, in cui i gradienti diventano ora minuscoli ora enormi: la loro scomparsa e la loro esplosione.
Il principio ispiratore di bfloat16 è limpido: sacrificare la precisione della mantissa e conservare invece per l'esponente esattamente la stessa ampiezza di float32, cioè otto bit, in modo da trattare senza rischi i valori estremamente grandi o piccoli che ricorrono durante l'addestramento. Il nome «Brain Floating Point» deriva da Google Brain, la divisione di ricerca sull'apprendimento automatico dell'azienda.
Nell'informatica tradizionale ridurre la precisione dei numeri in virgola mobile è sempre stato considerato un invito agli errori. I modelli di apprendimento profondo, però, hanno la singolare proprietà di conservare quasi intatta l'accuratezza finale delle previsioni pur in presenza di qualche imprecisione numerica. Aver rovesciato a proprio favore questa caratteristica — «funziona nel complesso anche se non è esatto» — e aver diffuso rappresentazioni a sedici bit che dimezzano memoria e costo di calcolo è un'ottimizzazione tipica del solo apprendimento automatico, distante dal senso comune dell'informatica.