English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

ospite
1 / ?
torna alle lezioni

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


FormatoBit totaliSegnoEspMantEstensione dinamicaPrecisione
FP32321823~10^-38 a ~10^38~7 cifre
FP16161510~10^-5 to ~10^5~3 cifre
FP8 E4M38143~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

ANDREA-120M contiene approssimativamente 120.000.000 parametri. Calcola l'ingombro di storage solo delle matrici dei pesi in (a) FP32, (b) FP16, (c) FP8. Mostra i tuoi calcoli in MB. Poi calcola (d) l'ingombro di storage con pesi + primo momento Adam + secondo momento Adam (3x il conteggio dei pesi) in FP16.

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:


PrecisionePassi/minNote
FP32~3baseline; nessuna accelerazione tensor core
FP16~6cuBLAS tensor cores; 2x speedup
FP8 E4M3~6tensor 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.


Confronto Precisione: FP32 vs FP16 vs FP8

Scegliere la Precisione per una Nuova Esecuzione

Stai avviando una nuova esecuzione di addestramento in stile ANDREA su una RTX 4090. Hai due priorità in conflitto: (1) massimizzare steps/min, (2) evitare debug di crash NaN a metà addestramento. ANDREA-120M v3 ha scelto FP16 cuBLAS rispetto a FP8 E4M3 nonostante entrambi girino a ~6 steps/min. Ragiona sul perché FP16 ha vinto questa decisione. Fai riferimento al range dinamico e al supporto tensor core nella tua risposta.

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:


ComponenteDimensione FP16
Pesi240 MB
m (primo momento)240 MB
v (secondo momento)240 MB
Gradienti240 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

ANDREA-480M (il terzo membro pianificato della famiglia) ha ~480 milioni di parametri. Stima (a) solo pesi FP16 in MB, (b) pesi FP16 + m + v in MB (assumi m e v anche FP16 per semplicità), e (c) dato la regola empirica del moltiplicatore 6-8x, impronta totale durante il training in FP16. ANDREA-480M entra in una singola RTX 4090 (24 GB)?

Precisione in Pratica

Supponi di aver scoperto a metà addestramento che ANDREA-120M produceva occasionali perdite NaN ogni ~5000 step a FP16, & ogni NaN richiedeva un riavvio da un checkpoint. Quale **UNICA** modifica proveresti per prima per ridurre la frequenza dei NaN senza abbandonare FP16? Giustifica con un meccanismo in una frase.

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.