Segno, Esponente, Mantissa
Formato Punto Fluttuante IEEE 754
Ogni numero in punto fluttuante memorizza tre campi:
- Bit di segno (1 bit): positivo o negativo
- Esponente (E bit): la scala di grandezza, una potenza intera di 2
- Mantissa (M bit): la precisione frazionaria, un numero tra 1.0 e ~2.0
Bit totali = 1 + E + M. Il valore è approssimativamente (-1)^sign (1 + mantissa) 2^(exponent - bias).
Due proprietà sono importanti per l'addestramento:
Estensione dinamica = 2^(2^E) (approssimativamente). Più bit per l'esponente significa rappresentare numeri più piccoli e più grandi senza overflow.
Precisione = 2^M valori distinti per potenza di 2. Più bit nel mantissa significa una rappresentazione più fine tra potenze di 2 consecutive.
I Tre Formati
| Formato | Bit totali | Segno | Esp | Mant | Estensione dinamica | Precisione |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 a ~10^38 | ~7 cifre |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 to ~10^5 | ~3 cifre |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 to ~448 | ~2 cifre |
FP8 E4M3 significa "4 bit esponente, 3 bit mantissa". Un'alternativa FP8 E5M2 scambia precisione per range; gli esperimenti ANDREA usano E4M3 perché le attivazioni del transformer rimangono in bande di magnitudine ristrette dove la precisione extra prevale sul range extra.
Byte Per Parametro
Perché la Precisione Inferiore Esegue Più Velocemente
La Larghezza di Banda della Memoria Domina la Velocità di Addestramento
Le GPU moderne passano più tempo in attesa della memoria che a calcolare. La RTX 4090 ha una larghezza di banda della memoria di 1008 GB/s e 165 TFLOPS di calcolo FP16. Un layer tipico legge i pesi dalla VRAM, moltiplica le attivazioni, scrive i risultati. È la larghezza di banda, non il calcolo, a decidere il throughput.
Dimezzare la precisione dimezza i byte per parametro, quindi leggere gli stessi pesi usa metà della larghezza di banda della memoria. Il throughput raddoppia approssimativamente.
Tensor Cores: Moltiplicazione di Matrici Accelerata dall'Hardware
La RTX 4090 include unità dedicate ai tensor core che calcolano moltiplicazioni di matrici in FP16 o FP8 direttamente. Una singola operazione di tensor core moltiplica un piccolo blocco (es. 16x16) in un ciclo, drasticamente più veloce delle moltiplicazioni scalari FP32.
Numeri empirici da ANDREA-120M:
| Precisione | Passi/min | Note |
|---|---|---|
| FP32 | ~3 | baseline; nessuna accelerazione tensor core |
| FP16 | ~6 | cuBLAS tensor cores; 2x speedup |
| FP8 E4M3 | ~6 | tensor cores; paragonabile a FP16 |
FP8 non ha superato FP16 in throughput su questo workload perché il throughput di calcolo ha smesso di essere il collo di bottiglia; la larghezza di banda della memoria e l'overhead di lancio sono diventati vincolanti. ANDREA-120M v3 è distribuito su FP16 cuBLAS a 6 passi/min per un margine di sicurezza confortevole senza perdere throughput.
Rischio NaN con FP8
FP8 E4M3 rappresenta numeri da ~2^-9 a ~448. Attivazioni o gradienti al di fuori di quell'intervallo causano overflow in NaN (not a number) o underflow a zero. Un singolo NaN avvelena ogni computazione downstream: moltiplicazioni di matrici con un NaN restituiscono tutto-NaN; gradienti tutto-NaN corrompono lo stato di AdamW; AdamW con NaN m & v produce aggiornamenti NaN; i pesi diventano NaN; l'intero run di training muore.
Gli esperimenti FP8 di ANDREA hanno prodotto occasionali "cliffs" NaN che richiedevano loss scaling, commutazione programmata di precisione o percorsi di fallback. Il range dinamico di FP16 (~10^-5 a ~10^5) è abbastanza ampio da mantenere rari gli eventi NaN senza trucchi di scaling intricati.
Scegliere la Precisione per una Nuova Esecuzione
Adattare 120M su una Singola 4090
Il Moltiplicatore 6-8x dalla Lezione Introduttiva
Ricorda da grow_a_language_model_intro che la memoria di addestramento equivale approssimativamente a 6-8x il conteggio grezzo dei pesi, tenendo conto di:
- Peso (1x)
- Primo momento Adam m (1x)
- Secondo momento Adam v (1x)
- Buffer gradiente (1x)
- Attivazioni & temporanei (~2-4x, dipende da batch & contesto)
ANDREA-120M a FP16 con batch_size=8, context=1024:
| Componente | Dimensione FP16 |
|---|---|
| Pesi | 240 MB |
| m (primo momento) | 240 MB |
| v (secondo momento) | 240 MB |
| Gradienti | 240 MB |
| Attivazioni | ~2-4 GB (batch, ctx) |
| Totale | ~3.5 GB |
RTX 4090 ha 24 GB di VRAM. ANDREA-120M usa ~14% a FP16. Plenty of room for larger batch sizes o longer context windows. ANDREA-12M ha usato solo 1.4 GB totali.
Dove Vive la Precisione Mista
ANDREA NON mantiene tutto a una singola precisione. L'addestramento a precisione mista memorizza:
- Pesi master: FP32 (preserva la stabilità dell'addestramento)
- Calcolo forward & backward: FP16 (utilizza i tensor cores)
- Stato ottimizzatore AdamW: FP32 (m & v necessitano di precisione per aggiornamenti long-tail)
- Buffer gradienti: FP16 (lato compute)
Il budget di memoria finale mescola entrambi. L'impronta reale di ANDREA si trova tra FP16 puro (720 MB stato ottimizzatore) e FP32 puro (1.44 GB stato ottimizzatore), più vicino a FP32 perché m e v rimangono in FP32.
Dimensionamento di un Budget per ANDREA-480M
Precisione in Pratica
Attività Adiacenti
Tre attività correlate si collegano alla precisione:
- Attività 1: Intro / Budget VRAM. La precisione moltiplica ogni termine nell'aritmetica del budget memoria. La regola empirica del moltiplicatore 6-8x è senza unità; bytes-per-param le dà unità.
- Attività 10: AdamW. Lo stato dell'ottimizzatore (m & v) rimane tipicamente in FP32 anche quando il calcolo forward/backward avviene in FP16. Motivo: la precisione dell'accumulatore long-tail è più importante della velocità di runtime per l'ottimizzatore.
- Attività 12: Clip del gradiente. Il clipping limita le magnitudini del gradiente prima degli aggiornamenti dello stato dell'ottimizzatore. Con forward/backward in FP16 & ottimizzatore in FP32, il clipping avviene al confine dove cambia la precisione & dove si concentra il rischio di overflow.
La precisione è una manopola gratuita: cambiala, il modello si allena più velocemente & usa meno memoria. Il costo è la cura numerica: gestione NaN, scaling della loss, disciplina mixed-precision. ANDREA-120M v3 dimostra il payoff: 120M parametri addestrati su hardware consumer in 23 giorni perché FP16 ha dimezzato tutto.