Naar de inhoud
NLEN
Illustratie: Kwantisatie uitgelegd: INT4, FP8 en modelcompressie

Kwantisatie uitgelegd: hoe modellen krimpen met INT4 en FP8

Door Ivo Donker — samengesteld met AI-ondersteuning (Claude & Gemini)

Module 5 — Onder de motorkap

Wat je hiervoor moet weten: Voor dit artikel is basiskennis nodig over hoe gewichten worden opgeslagen en berekend. Lees desgewenst eerst hoe parameters en gewichten werken en verken de basisstructuur in de uitleg over de transformer-architectuur.

Grote taalmodellen bevatten tientallen tot honderden miljarden parameters. Tijdens de trainingsfase worden deze gewichten doorgaans opgeslagen als 16-bits floating-point getallen (zoals FP16 of BF16). Voor een model met 70 miljard parameters betekent dit dat er puur voor de gewichten al ongeveer 140 gigabyte aan videogeheugen (VRAM) gereserveerd moet worden, nog los van de contextverwerking. Kwantisatie (quantization) is de wiskundige techniek waarbij de numerieke precisie van deze parameters wordt verlaagd naar bijvoorbeeld 8-bits of 4-bits representaties. Hierdoor krimpt de geheugenvoetafdruk aanzienlijk en kunnen berekeningen sneller worden uitgevoerd op gespecialiseerde hardware.

De wiskundige kern: lineaire projectie en schaalfactoren

In de basis transformeert kwantisatie een continue verzameling getallen met een hoge precisie naar een discrete verzameling met een lagere precisie. Wanneer we overstappen van een 16-bits floating-point weergave naar een 8-bits of 4-bits integer, moeten we een continue waardereeks projecteren op een beperkt aantal gehele getallen. Voor een 8-bits integer (INT8) zijn er 256 mogelijke niveaus (-128 tot 127), terwijl een 4-bits integer (INT4) slechts 16 verschillende waarden kan aannemen (-8 tot 7 of 0 tot 15).

De eenvoudigste vorm hiervan is uniforme symmetrische kwantisatie. Hierbij bepalen we eerst de absolute maximumwaarde van de gewichtenmatrix, aangeduid als alpha = max(|W|). De schaalfactor (scale factor) S wordt vervolgens berekend door dit maximum te delen door de maximale representeerbare integerwaarde q_max (bijvoorbeeld 127 voor signed INT8). Het kwantiseren van een gewicht w gebeurt via de formule:

# Berekening van uniforme symmetrische kwantisatie
q = clip(round(w / S), -q_max, q_max)
w_gereconstrueerd = q * S

Omdat de oorspronkelijke waarden continu zijn en de geconverteerde waarden discreet, ontstaat er onvermijdelijk een afrondingsfout: de quantization error. Het doel van geavanceerde kwantisatie-algoritmes is om deze fout zo te verdelen over de matrices dat de uiteindelijke uitkomst van de matrixvermenigvuldigingen zo min mogelijk afwijkt van de oorspronkelijke wiskundige toestand.

Numerieke formaten vergeleken: INT8, INT4 en FP8

Niet alle kwantisatie gebruikt gehele getallen. Waar INT4 en INT8 strikt gebruikmaken van integers, behoudt FP8 een floating-point structuur met een expliciet tekenbit (sign), exponentbits en mantissabits (fraction). Hierdoor kan FP8 veel beter omgaan met getallenreeksen die een groot dynamisch bereik beslaan.

Binnen FP8 bestaan twee belangrijke standaarden:

Formaat Bits per parameter Geheugenreductie t.o.v. FP16 Dynamisch bereik Typische toepassing
FP16 / BF16 16 bits (2 bytes) 1x (referentie) Zeer hoog Training en ongekwantiseerde baseline
FP8 (E4M3) 8 bits (1 byte) 2x Gemiddeld Moderne inferentie en FP8 mixed-precision training
INT8 8 bits (1 byte) 2x Laag (uniform) Standaard enterprise-inferentie en serving
INT4 (AWQ / GPTQ) 4 bits (0,5 byte) 4x Zeer laag (discrete stappen) Lokale inferentie en geheugenkritische systemen

Post-Training Quantization (PTQ) versus Quantization-Aware Training (QAT)

Kwantisatie kan op twee momenten in de levenscyclus van een model worden toegepast: achteraf op een reeds getraind model, of direct tijdens het trainingsproces.

Post-Training Quantization (PTQ) is de meest toegepaste methode vanwege de lage computationele kosten. Een bestaand FP16-model wordt geanalyseerd met behulp van een kleine kalibratieset (bijvoorbeeld een representatieve verzameling van enkele honderden teksten). Het algoritme meet hoe de activaties zich door de lagen bewegen, bepaalt per laag of per matrixblok de optimale schaalfactoren, en zet de gewichten om naar het doelfrimaat. Dit proces duurt doorgaans slechts enkele minuten tot een paar uur.

Quantization-Aware Training (QAT) modelleert de kwantisatiefout al tijdens het trainen of finetunen. Omdat de afrondingsfunctie niet-differentieerbaar is (de afgeleide is overal nul behalve bij sprongpunten), gebruikt QAT een zogeheten Straight-Through Estimator (STE). Tijdens de voorwaartse berekening worden de gewichten virtueel gekwantiseerd om de storing te simuleren, maar tijdens de backward pass worden de gradiënten direct doorgegeven aan de onderliggende FP32-gewichten. Het model leert hierdoor compenseren voor de precisieverliezen. QAT levert bij extreem lage bitrates (zoals 2-bit of agressieve 4-bit) aanzienlijk betere prestaties op dan PTQ, maar vereist aanzienlijke rekenkracht en een volledige trainingspijplijn.

Het probleem van activatie-outliers

Wanneer taalmodellen groeien voorbij een bepaalde omvang (vaak rond de 6 tot 13 miljard parameters), treedt een specifiek fenomeen op: emergent activation outliers. In specifieke dimensies van de verborgen lagen schieten bepaalde activatiewaarden plotseling omhoog naar waarden die tientallen malen groter zijn dan het gemiddelde. Hoewel deze uitschieters minder dan 0,1% van alle activaties uitmaken, zijn ze cruciaal voor de syntactische samenhang en redeneercapaciteit van het netwerk.

Bij klassieke INT8- of INT4-kwantisatie dwingen deze uitschieters de schaalfactor S omhoog. Hierdoor worden alle overige 99,9% normale waarden samengedrukt in slechts een handvol discrete niveaus, wat leidt tot een catastrofaal verlies van precisie en het instorten van de perplexity-score. Moderne kwantisatie-architecturen lossen dit op door methodes zoals bloksgewijze schaling (per-channel of per-group quantization met blokgroottes van bijvoorbeeld 32 of 128 getallen) of door de outliers apart in FP16 te verwerken terwijl de rest naar lage precisie gaat (zoals toegepast in LLM.int8()).

Moderne algoritmes onder de loep: GPTQ en AWQ

Om modellen succesvol naar 4-bit te brengen zonder noemenswaardig kwaliteitsverlies, zijn gespecialiseerde algoritmes ontwikkeld die slimmer omgaan met de foutcompensatie.

GPTQ (Generalized Post-Training Quantization) is gebaseerd op de klassieke Optimal Brain Surgeon-theorie. Het algoritme kwantiseert gewichten kolom voor kolom. Zodra een gewicht wordt afgerond naar een discrete 4-bits waarde, wordt het ontstane foutverschil direct gecompenseerd door de nog niet gekwantiseerde gewichten in dezelfde rij aan te passen. Hiervoor gebruikt GPTQ de inverse Hessiaan-matrix van de activaties. Dit wiskundige mechanisme zorgt ervoor dat afrondingsfouten elkaar actief uitdoven naarmate de matrix verder wordt verwerkt.

AWQ (Activation-aware Weight Quantization) kiest een andere invalshoek. Het algoritme observeert dat niet alle gewichten even belangrijk zijn; gewichten die corresponderen met kanalen met grote activaties hebben de grootste invloed op de uiteindelijke modeloutput. In plaats van alle gewichten gelijk te behandelen, identificeert AWQ de top 1% belangrijkste gewichten op basis van activatiemagitudes. Door deze specifieke kanalen wiskundig op te schalen vóór kwantisatie, wordt de relatieve afrondingsfout op de meest kritieke verbindingen geminimaliseerd, zonder dat er mixed-precision matrices bewaard hoeven te blijven.

Impact op latentie, geheugenbandbreedte en rekenkracht

Het verlagen van de precisie heeft directe gevolgen voor de hardware-efficiëntie tijdens het uitvoeren van een model. Om te begrijpen hoe deze hardware-optimalisaties renderen bij dagelijks gebruik, is het verhelderend om te lezen over wat er onder de motorkap gebeurt tijdens AI-inference.

Bij LLM-inferentie moeten we onderscheid maken tussen twee afzonderlijke fases:

Omdat INT4-gewichten viermaal minder data vereisen dan FP16, hoeft de geheugenbus per gegenereerde token slechts een kwart van de datahoeveelheid te transporteren. Hierdoor stijgt de generatiesnelheid (tokens per seconde) aanzienlijk op geheugengelimiteerde systemen, zelfs als de INT4-gewichten tijdens de berekening on-the-fly moeten worden teruggerekend naar FP16 (weight-only quantization).

De grens van compressie: kwaliteitsverlies meten

Kwantisatie is geen gratis ingreep. Naarmate de compressiegraad toeneemt, treden er imperfecties op. Om de kwaliteit van een gekwantiseerd model vast te stellen, kijkt men primair naar twee indicatoren: perplexity en taakspecifieke benchmarks.

Perplexity meet hoe verrast een taalmodel is door een ongeziene referentietekst. Een lagere perplexity duidt op een beter taalbegrip. Wanneer we een model comprimeren van FP16 naar FP8 of INT8, stijgt de perplexity over het algemeen nauwelijks (vaak minder dan 0,05 tot 0,1 punt). Bij INT4 blijft de schade bij algoritmes zoals AWQ en GPTQ zeer beperkt. Zodra we echter zakken naar 3-bit of 2-bit, vertoont de perplexity een exponentiële verslechtering: het model verliest zijn coherentie, begint grammaticale structuren door elkaar te halen en slaat vaker de plank mis bij logische gevolgtrekkingen.

Daarnaast zijn specifieke computertaken gevoeliger voor afrondingsfouten dan andere. Creatief schrijven en algemene samenvattingen blijven bij 4-bit kwantisatie uitstekend overeind. Complexe taken zoals wiskundig redeneren, formele code-syntaxis en lange redeneerketens (chain-of-thought) laten bij agressieve kwantisatie vaker degradatie zien doordat subtiele numerieke verhoudingen in de aandachtsmechanismen verloren gaan.

Implementatieoverwegingen in de praktijk

Bij het ontwerpen van een productiesysteem bepaalt de use-case welk formaat optimaal is. Wie modellen lokaal of op dedicated servers wil uitrollen, kan in de praktische gids over lokale kwantisatie lezen welke hardwareconfiguraties aansluiten bij verschillende formaten.

In moderne infrastructuren zien we grofweg de volgende taakverdeling:

Hierna verder met:

Wil je dieper ingaan op de geheugenoptimalisaties die optreden tijdens de actieve uitvoering van een model? Bestudeer dan hoe de tijdelijke aandachtsvectoren worden beheerd in het artikel over grouped-query attention en geheugengebruik.