Teken, Exponent, Mantisse
IEEE 754 Floating-Point Formaat
Elk floating-point getal slaat drie velden op:
- Tekenbit (1 bit): positief of negatief
- Exponent (E bits): de schaal van de grootte, een geheel getal macht van 2
- Mantissa (M bits): de fractionele precisie, een getal tussen 1.0 & ~2.0
Totaal aantal bits = 1 + E + M. De waarde is ongeveer (-1)^sign (1 + mantissa) 2^(exponent - bias).
Twee eigenschappen zijn belangrijk voor training:
Dynamisch bereik = 2^(2^E) (ongeveer). Meer exponent bits betekent het kunnen vertegenwoordigen van kleinere & grotere getallen zonder overflow.
Precisie = 2^M verschillende waarden per macht van 2. Meer mantisse-bits betekent een fijnere representatie tussen opeenvolgende machten van 2.
De Drie Format
| Format | Totaal bits | Teken | Exp | Mant | Dynamisch bereik | Precisie |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 tot ~10^38 | ~7 cijfers |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 tot ~10^5 | ~3 cijfers |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 tot ~448 | ~2 cijfers |
FP8 E4M3 betekent "4 exponentbits, 3 mantissabits". Een alternatieve FP8 E5M2 ruilt precisie voor bereik; ANDREA-experimenten gebruiken E4M3 omdat transformeractivaties in smalle magnitudebanden blijven waar extra precisie wint van extra bereik.
Bytes Per Parameter
Waarom Lagere Precisie Sneller Draait
Geheugenbandbreedte Domineert Trainingsnelheid
Moderne GPU's brengen meer tijd door met wachten op geheugen dan met berekenen. De RTX 4090 heeft 1008 GB/s geheugenbandbreedte & 165 TFLOPS FP16-rekenkracht. Een typische laag leest gewichten uit VRAM, vermenigvuldigt activaties, schrijft resultaten terug. Bandbreedte, niet rekenkracht, bepaalt de doorvoer.
Het halveren van de precisie halveert bytes per parameter, dus het lezen van dezelfde gewichten gebruikt helft van de geheugenbandbreedte. Doorvoer verdubbelt ruwweg.
Tensor Cores: Hardwareversnelde Matrixvermenigvuldiging
De RTX 4090 heeft speciale tensor core-eenheden die matrixvermenigvuldigingen op FP16 of FP8 direct berekenen. Een enkele tensor core-operatie vermenigvuldigt een klein blok (bijv. 16x16) in één cyclus, veel sneller dan scalaire FP32-vermenigvuldigingen.
Empirische cijfers van ANDREA-120M:
| Precisie | Stappen/min | Opmerkingen |
|---|---|---|
| FP32 | ~3 | basislijn; geen tensor core-versnelling |
| FP16 | ~6 | cuBLAS tensor cores; 2x speedup |
| FP8 E4M3 | ~6 | tensor cores; vergelijkbaar met FP16 |
FP8 versloeg FP16 niet in doorvoer bij deze werklast omdat de rekenkrachtdoorvoer niet langer de bottleneck was; geheugenbandbreedte & lanceeroverhead werden limiterend. ANDREA-120M v3 wordt geleverd op FP16 cuBLAS met 6 stappen/min voor een comfortabele veiligheidsmarge zonder doorvoer te verliezen.
NaN-risico bij FP8
FP8 E4M3 vertegenwoordigt getallen van ~2^-9 tot ~448. Activaties of gradiënten buiten dat bereik overlopen naar NaN (not a number) of onderlopen naar nul. Een enkele NaN vergiftigt elke downstream berekening: matrixvermenigvuldigingen met een NaN geven all-NaN terug; all-NaN gradiënten corrumperen AdamW-staat; AdamW met NaN m & v geeft NaN-updates; gewichten worden NaN; de gehele training run sterft.
De FP8-experimenten van ANDREA produceerden occasionele NaN-kliffen die loss scaling, geplande precisie-wisselingen of fallback-paden vereisten. Het dynamische bereik van FP16 (~10^-5 tot ~10^5) is breed genoeg dat NaN-gebeurtenissen zeldzaam blijven zonder ingewikkelde scaling-trucs.
Precisie Kiezen voor een Nieuwe Run
120M passen op een enkele 4090
De 6-8x Vermenigvuldiger uit de Introles
Herinner je van grow_a_language_model_intro dat trainingsgeheugen ruwweg 6-8x het rauwe gewichtenaantal bedraagt, rekening houdend met:
- Gewicht (1x)
- Adam eerste moment m (1x)
- Adam tweede moment v (1x)
- Gradient buffer (1x)
- Activaties & tijdelijke waarden (~2-4x, afhankelijk van batch & context)
ANDREA-120M op FP16 met batch_size=8, context=1024:
| Component | FP16 grootte |
|---|---|
| Weights | 240 MB |
| m (eerste moment) | 240 MB |
| v (tweede moment) | 240 MB |
| Gradienten | 240 MB |
| Activaties | ~2-4 GB (batch, ctx) |
| Totaal | ~3.5 GB |
RTX 4090 heeft 24 GB VRAM. ANDREA-120M gebruikt ~14% bij FP16. Ruim voldoende voor grotere batch-groottes of langere contextvensters. ANDREA-12M gebruikte slechts 1.4 GB totaal.
Waar Mixed Precision Thuis Is
ANDREA houdt NIET alles op één precisie. Mixed-precision training slaat op:
- Master weights: FP32 (behoudt trainingsstabiliteit)
- Forward & backward compute: FP16 (gebruikt tensor cores)
- AdamW optimizer state: FP32 (m & v hebben precisie nodig voor long-tail updates)
- Gradient buffer: FP16 (compute side)
De uiteindelijke geheugenbudget mixt beide. ANDREA's werkelijke footprint zit tussen pure FP16 (720 MB optimizer state) & pure FP32 (1.44 GB optimizer state), dichter bij FP32 omdat m & v in FP32 blijven.
Een Budget Opstellen voor ANDREA-480M
Precisie in de Praktijk
Aangrenzende Activiteiten
Drie broers/zussen linken aan precisie:
- Activiteit 1: Intro / VRAM-budget. Precisie vermenigvuldigt elke term in de geheugenbudget-aritmetiek. De vuistregel van 6-8x vermenigvuldiger is eenheidloos; bytes-per-param geeft het eenheden.
- Activiteit 10: AdamW. Optimalisatorstatus (m & v) blijft typisch op FP32, zelfs wanneer forward/backward berekeningen op FP16 draaien. Reden: precisie van de long-tail accumulator is belangrijker dan runtime-snelheid voor de optimalisator.
- Activiteit 12: Gradient clipping. Clipping beperkt de grootte van gradiënten vóór optimalisatorstatusupdates. Met FP16 forward/backward & FP32 optimalisator vindt clipping plaats op de grens waar precisie verandert & waar overflow-risico zich concentreert.
Precisie is een gratis knop: verander het, het model traint sneller & gebruikt minder geheugen. De kosten zijn numerieke zorg: NaN-behandeling, loss scaling, mixed-precision discipline. ANDREA-120M v3 demonstreert het rendement: 120M parameters getraind op consumentenhardware in 23 dagen omdat FP16 alles halveerde.