FP32, FP16, BF16 en INT8: bitindeling, bereik, precisie en toepassingen

FP32 is een 32-bits floating-pointgetal met enkele precisie en dient als referentie voor berekeningen. FP16 en BF16 zijn allebei 16 bits, maar verdelen de bits anders. FP16 besteedt veel bits aan de mantisse voor precisie, waardoor het bereik smal is, met een maximum van 65504. BF16 geeft de exponent dezelfde 8 bits als FP32 en houdt het bereik zo op FP32-niveau, ten koste van precisie. INT8 is een 8-bits integer die wordt gebruikt voor kwantisatie, waarbij reële getallen met een schaalfactor worden benaderd; zo kunnen geheugen en vermogen bij AI-inferentie sterk worden verlaagd.

KenmerkFP32FP16BF16INT8
Aantal bits32 bits16 bits16 bits8 bits
Bits voor teken, exponent en mantisse1, 8, 231, 5, 101, 8, 7Geen exponent of mantisse. Integer in tweecomplement van −128 tot 127
Grootste representeerbare waardeOngeveer 3,4 × 10³⁸65504Ongeveer 3,4 × 10³⁸ (vrijwel gelijk aan FP32)127 (reële getallen worden met een schaalfactor weergegeven)
Kleinste genormaliseerde getalOngeveer 1,2 × 10⁻³⁸Ongeveer 6,1 × 10⁻⁵ (2⁻¹⁴)Ongeveer 1,2 × 10⁻³⁸Niet van toepassing (de stapgrootte van de waarden wordt door de schaalfactor bepaald)
Indicatie van de precisieOngeveer 7 decimale cijfers (verschil tussen 1 en het volgende getal 2⁻²³ ≈ 1,2 × 10⁻⁷)Ongeveer 3 decimale cijfers (2⁻¹⁰ ≈ 9,8 × 10⁻⁴)2 tot 3 decimale cijfers (2⁻⁷ ≈ 7,8 × 10⁻³)Een schaal met 256 stappen
Conversie vanuit FP32Niet nodig (referentie)Door het smalle bereik kunnen grote waarden overlopen en kleine waarden 0 wordenAlleen de bovenste 16 bits nemen en afronden; het bereik loopt niet overKwantiseren na het bepalen van schaal (en nulpunt). Kalibratie om het waardebereik te onderzoeken is nodig
Geheugen per waarde4 bytes2 bytes2 bytes1 byte
Efficiëntie van rekeneenhedenGrote vermenigvuldigers; weinig multiply-accumulates per oppervlakKleinere rekeneenheden dan FP32; er passen veel multiply-accumulates naast elkaarVergelijkbaar met FP16. Door de kortere mantisse is de vermenigvuldiger nog kleinerKleinste en zuinigste vermenigvuldigers. Producten worden vaak in 32-bits integers opgeteld
Gebruik bij trainingMasterweights, optimizertoestand en accumulatie van productenTraining met gemengde precisie. Loss scaling voorkomt dat kleine gradiënten 0 wordenVeel gebruikt bij training met gemengde precisie. Loss scaling is meestal niet nodigNormaal niet gebruikt (bij quantization-aware training wordt het effect van kwantisatie nagebootst)
Gebruik bij inferentieReferentie voor nauwkeurigheid. Wanneer juistheid voorgaat op prestatiesInferentie op onder meer GPU'sInferentie op GPU's en AI-acceleratorsInferentie met gekwantiseerde modellen. Vooral op edge-NPU's en dergelijke

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

FP32
Berekeningen die precisie vereisen, masterweights en accumulatie van producten bij training, en als referentie om resultaten met lage precisie te controleren.
FP16 en BF16
Wanneer geheugen en rekenwerk bij AI-training en -inferentie moeten worden gehalveerd. BF16 voor training waarbij bereik telt; FP16 als de waarden binnen het bereik blijven en precisie belangrijk is.
INT8
Wanneer een getraind model moet worden gekwantiseerd om inferentie sneller en zuiniger te maken. Inferentie op edge-apparaten met beperkt geheugen en vermogen.

Veelgestelde vragen

Waarom heeft BF16 bij AI-training vaak de voorkeur boven FP16?

BF16 heeft dezelfde 8-bits exponent als FP32 en dus vrijwel hetzelfde bereik. Bij FP16 is loss scaling nodig om te voorkomen dat kleine gradiënten 0 worden of grote waarden overlopen, maar bij BF16 is dat meestal niet nodig en is ook de conversie vanuit FP32 eenvoudig. De precisie is lager, maar dat is bij het trainen van neurale netwerken zelden een probleem.

Waarom is de maximale waarde van FP16 65504?

FP16 heeft een exponent van 5 bits (bias 15), en de waarde met alle bits op 1 wordt gebruikt voor oneindig en NaN, zodat de grootste exponent 2 tot de macht 15 is. Met alle 10 mantissebits op 1 is (2 − 2⁻¹⁰) × 2¹⁵ de grootste eindige waarde, en dat is 65504.

Hoe stelt INT8 waarden met decimalen voor?

Door te benaderen in de vorm reëel getal ≈ schaal × (integer − nulpunt). Bij symmetrische kwantisatie rond 0 is het nulpunt 0 en wordt de schaal bijvoorbeeld gekozen als ‘grootste absolute waarde ÷ 127’. De schaal wordt per tensor of per kanaal vastgelegd.

Kan INT8 ook voor training worden gebruikt?

Voor training worden doorgaans floating-pointformaten gebruikt. Bij training hebben gradiënten een breed waardebereik en moeten ook kleine updates van de gewichten worden verwerkt. INT8 wordt vooral gebruikt voor inferentie met gekwantiseerde getrainde modellen; ook bij quantization-aware training worden de gewichten in floating point bijgewerkt.

Test uw begrip

Welke combinatie van aantallen bits voor teken, exponent en mantisse geldt voor een IEEE 754-getal met enkele precisie (32 bit)?

  1. A1 · 11 · 20
  2. B1 · 8 · 23
  3. C1 · 5 · 26
Antwoord en toelichting tonen

Antwoord: B. 1 · 8 · 23

Enkele precisie (FP32) bestaat uit 1 tekenbit, 8 exponentbits en 23 mantissebits, samen 32 bit. Bij genormaliseerde getallen wordt de voorste 1 van de mantisse weggelaten, zodat de precisie 24 bit bedraagt, ongeveer 7 decimale cijfers. Dubbele precisie (FP64) heeft 1 teken-, 11 exponent- en 52 mantissebits, met een groter exponentbereik en een hogere precisie. 1 · 11 · 20 verwart met de exponentbreedte van dubbele precisie en 1 · 5 · 26 met die van halve precisie.

Wat is de grootste eindige waarde die FP16 (1 teken, 5 exponentbits (bias 15), 10 mantissebits) kan weergeven?

  1. A32768
  2. B65536
  3. C65504
Antwoord en toelichting tonen

Antwoord: C. 65504

Een exponentveld van alleen enen (31) wordt gebruikt voor oneindig en NaN, dus de grootste exponent is 30 en de werkelijke exponent is 30 − 15 = 15. Wanneer de mantisse uit alleen enen bestaat, is de waarde (1 + 1 − 2⁻¹⁰) × 2¹⁵ = (2 − 2⁻¹⁰) × 32768 = 65536 − 32 = 65504. Een groter resultaat wordt oneindig, zodat bij training in FP16 ook op overflow moet worden gelet. 32768 is 2¹⁵ bij een mantisse van 0 en 65536 is 2¹⁶; geen van beide is het maximum.

Wat is de belangrijkste reden dat bfloat16 wordt gebruikt bij het trainen van AI?

  1. ADe exponent is, net als bij FP32, 8 bit, zodat het bereik van weer te geven getallen groot is
  2. BDe mantisse is langer dan bij FP32, zodat de precisie hoger is
  3. CEr kan met gehele-getalbewerkingen worden gerekend
Antwoord en toelichting tonen

Antwoord: A. De exponent is, net als bij FP32, 8 bit, zodat het bereik van weer te geven getallen groot is

bfloat16 is een 16-bitsformaat met 1 tekenbit, 8 exponentbits en 7 mantissebits. Omdat de exponent gelijk is aan die van FP32, is het weer te geven bereik vrijwel hetzelfde; zelfs zeer kleine of grote waarden zoals gradiënten tijdens de training veroorzaken niet snel overflow of underflow, en overstappen vanaf een FP32-model is eenvoudig. De precisie is lager, maar training is tamelijk bestand tegen kleine fouten, zodat dit zelden een probleem is, en de hoeveelheid data en het oppervlak van de rekeneenheid kunnen met de helft worden verminderd. De mantisse is korter dan bij FP32 en er wordt niet met gehele getallen maar met drijvendekommabewerkingen gerekend.

  1. Wat is een probleem bij het trainen van een neuraal netwerk met FP16 (halve precisie: 1 teken, 5 exponent, 10 mantissebits) dat wordt aangepakt door de verliesfunctie een aantal keer te vergroten voor de berekening (loss scaling)?
  2. Wat is het belangrijkste voordeel van het omzetten (kwantiseren) van gewichten van FP32 naar INT8 bij AI-inferentie?
  3. Wat is de belangrijkste reden dat bij AI-training met gemengde precisie het grootste deel van de berekeningen in FP16 of bfloat16 gebeurt, terwijl de oorspronkelijke waarde van de gewichten (master weights) in FP32 wordt bewaard?

Oefenvragen over Computerarithmetiek

Belangrijke termen uitgelegd

IEEE 754
Internationale norm die de weergave van drijvendekommagetallen en de rekenregels vastlegt. Definieert formaten zoals enkele precisie (32 bits) en dubbele precisie (64 bits), afrondmethoden en speciale waarden zoals oneindig en NaN, zodat rekenresultaten op elke computer gelijk zijn.
bfloat16
16-bits drijvendekommaformaat met 1 tekenbit, 8 exponentbits en 7 mantissebits. Omdat de exponent gelijk is aan die van FP32, is het bereik groot; de precisie is laag, maar het wordt gebruikt voor AI-training. FP16 heeft 5 exponentbits en 10 mantissebits: hogere precisie maar smaller bereik.
INT8
Geheel getal van 8 bits met teken (−128 tot 127). Bij AI-inferentie leiden het omzetten (kwantiseren) van gewichten en activaties naar INT8 met een schaalfactor tot sterk lagere reken- en geheugenlast, en kleine gehele-getalschakelingen kunnen het snel verwerken.
Gemengde precisie (mixed precision)
Het gebruik van getallen met verschillende precisie voor verschillende delen van een berekening. Vermenigvuldigen gebeurt in bijvoorbeeld FP16 en accumuleren in FP32, zodat snelheid en nauwkeurigheid samengaan.
Post-training quantization (PTQ)
Methode waarbij de gewichten en activaties van een getraind model worden omgezet naar een lagere precisie nadat het waardebereik met representatieve gegevens is bepaald. PTQ.

Verwante vergelijkingen