Kvantizace LLM: spuštění modelů o velikosti 160 GB na notebooku s minimálními ztrátami
Modely jako Qwen-3-Coder-Next s 80 miliardami parametrů zabírají 159,4 GB paměti. Kvantizace umožňuje snížit velikost čtyřnásobně a zrychlit inferenci dvakrát při ztrátě kvality pouze 5–10 %. To dělá možným spouštění velkých LLM na běžné spotřebitelské výpočetní technice bez výrazného snížení výkonu.
Parametry a jejich vliv na velikost modelu
Parametry – váhy neuronové sítě – určují objem LLM v paměti. Každý parametr je uložen jako číslo s plovoucí desetinnou čárkou. Nejjednodušší blok: vstup se vynásobí váhou a vytvoří výstup. Ve skutečných modelech jsou stovky vrstev s tisíci uzly, což vede ke miliardám parametrů.
Například síť s 2 vstupy, 3 vrstvami po 4 uzlech a 2 výstupy má 64 parametrů. Při škálování na stovky tisíc uzlů dostanete triliony vah. Histogramy rozložení parametrů populárních modelů ukazují: 99 % hodnot je blízko nuly, v rozmezí [-0,5; 0,5].
Zobrazení čísel v paměti
Počítače ukládají float32: 1 bit znaménka, 8 bitů exponentu, 23 bitů mantisy. Rozsah ±3,4×10³⁸ s 7 platnými číslicemi. Rozložení není rovnoměrné: hustší kolem nuly, řidší na okrajích. To je ideální pro LLM, kde jsou parametry malé.
Float16: 1+5+10 bitů, 3–4 číslice přesnosti, rozsah ±65 504. Bfloat16 (1+8+7): široký rozsah, 2–3 číslice. Float8/Float4 – experimentální, s 3–4 bity mantisy.
Aproximace sinusoidy: float32 hladká, float4 krokovaná s výraznými chybami.
Principy kvantizace
Kvantizace je ztrátové komprimování: mapování float do menšího souboru hodnot. Jednoduché zaokrouhlení (round-to-nearest) z bfloat16 do float4 zničí model: parametry se nulují, výstup je nula. Důvod: rozsah float4 [-3;3] neodpovídá parametrům [-0,89;0,16].
Symetrická kvantizace
Škálování dat pod celočíselný rozsah. Formule: scale = max_abs / (2^(bits-1) - 1). Kvantizujeme: round(value / scale), dekvantizujeme: quantized * scale.
Příklad kódu v JavaScriptu:
function quantize({ values, bits }) {
const vmax = Math.max(...values.map(Math.abs));
const qmax = 2 ** (bits - 1) - 1;
const scale = vmax / qmax;
return {
values: values.map((v) => Math.round(v / scale)),
scale,
};
}
function dequantize({ values, scale }) {
return values.map((v) => v * scale);
}
Pro values = [-0,89, 0,16, 0,08, -0,13, 0,16, -0,54], bits=4:
- quantized: [-7,1,1,-1,1,-4], scale≈0,127
- dequantized: [-0,89,0,127,0,127,-0,127,0,127,-0,509]
- průměrná chyba: 18%
Výstup modelu po 4bitové kvantizaci: odchylka 30 % od originálu, ale čtyřnásobně menší paměť.
Asymetrická kvantizace
Vylepšení symetrické: zohledňuje min/max samostatně. Rozsah [min, max] se škáluje do [qmin, qmax]. Formule:
- offset = min
- scale = (max - min) / (qmax - qmin)
- quantized = round((value - offset) / scale)
Efektivně využívá prostor: u asymetrických dat (více záporných) kladná strana se neztrácí. Průměrná chyba klesá na 5–10 %.
Použití na tenzorech: kvantizujte podle kanálů nebo skupin (per-group quantization) pro minimalizaci chyb ve aktivacích.
Hodnocení kvality po kvantizaci
Měřte perplexity na validačním datasetu nebo metriky úkolu (BLEU, ROUGE). Benchmarks:
- Qwen-3-Coder-Next 4-bit: perplexity +7 % proti FP16
- Rychlost: x2 na GPU bez tensorových jader
| Formát | Velikost (GB) | Perplexity | Rychlost (toků/s) |
|--------|---------------|------------|-------------------|
| FP16 | 159,4 | 1,00 | 1,0 |
| INT8 | 39,8 | 1,05 | 1,8 |
| INT4 | 19,9 | 1,09 | 2,1 |
Co je důležité
- Kvantizace zmenší model 4–8krát bez přeškolování.
- Symetrická pro symetrická data, asymetrická pro zkreslená rozložení.
- Per-group kvantizace (skupiny po 128 prvcích) vyváží přesnost a rychlost.
- Podpora v llama.cpp, bitsandbytes: INT4/INT8 z krabice.
- Testujte na downstream úlohách: programování, QA.
— Editorial Team
Zatím žádné komentáře.