Zpět na domů

Kvantizace LLM: 160GB modelu na notebooku

Článek rozebírá kvantizaci LLM pro spuštění 160GB modelů na notebookech. Jsou popsány symetrická a asymetrická metody, kód implementace, hodnocení kvality podle perplexity. Benchmarky ukazují x4 kompresi při 5-10% ztrátě.

Spuštění 160GB LLM na notebooku: kvantizace od nuly
Advertisement 728x90

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].

Google AdInline article slot

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.

Google AdInline article slot

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:

Google AdInline article slot
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

Advertisement 728x90

Číst dál