TakéKvantizace neuronové sítě, Quantization, INT8 kvantizace, Post-training quantizationPokročilý
Definice
Kvantizace modelu je převod vah a někdy i aktivací neuronové sítě z přesnějšího číselného formátu, typicky 32bitového float, do formátu s menším počtem bitů, například INT8 nebo 4bitového celého čísla. Model tím zabere méně paměti a počítá rychleji, výměnou za malou a měřitelnou ztrátu přesnosti výstupů.
Nezaměňujte: Ve zpracování signálu a v grafice znamená kvantizace obecné zaokrouhlení spojité veličiny na diskrétní úrovně (například barevná hloubka), zatímco kvantizace modelu se týká výhradně parametrů neuronové sítě.
Než se na to spolehnete: Uvedené velikosti (7B ve FP16 ≈ 14 GB, 4bit ≈ 4 GB, 70B ve FP16 ≈ 140 GB) jsou zaokrouhlené odhady odvozené z počtu parametrů, ne měřená čísla konkrétní implementace. Oblast se rychle vyvíjí, konkrétní metody (GPTQ, AWQ, FP8) a jejich hardwarová podpora se mohou měnit.
Co se s čísly v modelu vlastně stane
Váhy natrénované neuronové sítě jsou obyčejná desetinná čísla, standardně uložená ve 32 bitech (FP32). Kvantizace modelu tato čísla nahradí hrubší mřížkou hodnot. U INT8 existuje jen 256 úrovní, u 4bitových formátů dokonce 16. Aby to fungovalo, ke každé skupině vah se dopočítá měřítko (scale) a případně posun (zero point), které mřížku roztáhnou na skutečný rozsah hodnot: real ≈ scale * (q - zero_point).
Klíčové je, jak jemně se měřítko počítá. Jedno měřítko na celý tenzor je nejlevnější, ale jediná odlehlá váha roztáhne rozsah a zbytek hodnot se slepí dohromady. Proto se v praxi měřítko počítá per kanál nebo po blocích několika desítek hodnot, což u velkých jazykových modelů dělá rozdíl mezi použitelným a rozbitým výstupem.
Proč to zrychluje, i když jde jen o paměť
Inference velkého modelu bývá omezená propustností paměti, ne výpočtem. Načíst 70 miliard vah ve FP16 znamená přesunout zhruba 140 GB dat na každý průchod; ve 4 bitech je to řádově kolem 35 GB. Menší objem dat znamená kratší čekání a také to, že se model vejde do VRAM jedné karty místo několika. Navíc moderní GPU a NPU mají dedikované jednotky pro celočíselné násobení, takže při plné INT8 cestě roste i surový výpočetní výkon.
Po trénování, nebo během něj
Post-training quantization
Post-training quantization (PTQ) vezme hotový model a převede ho bez dalšího učení. Kalibrace na několika stovkách reprezentativních vzorků zjistí typické rozsahy aktivací. PTQ je rychlá záležitost v řádu minut až hodin a u INT8 obvykle stačí.
Quantization-aware training
Quantization-aware training (QAT) simuluje zaokrouhlování už během trénování nebo dolaďování, takže se model naučí být vůči hrubší mřížce odolný. QAT stojí výpočetní čas navíc, ale u agresivních režimů (4 bity a méně) nebo u malých modelů pro mobil vrací většinu ztracené přesnosti.
Kde kvantizace bolí
Ztráta přesnosti není rovnoměrná. Průměrná metrika může klesnout zanedbatelně, zatímco konkrétní schopnost, typicky práce s čísly, dlouhý kontext nebo méně zastoupený jazyk, se rozpadne. U jazykových modelů se také po tvrdé kvantizaci častěji objevují halucinace u okrajových dotazů. Proto se kvantizovaný model vždy vyhodnocuje na stejné testovací sadě jako originál, ne jen "od oka" podle několika promptů.
Druhý problém je podpora hardwaru a runtime. Formát, který na serverové GPU běží nativně, může na mobilním čipu spadnout do emulace a být pomalejší než původní model. Zisk je proto vždy nutné změřit na cílovém zařízení.
Formáty, které se dnes potkávají v praxi
- INT8: nejrozšířenější kompromis, dobře podporovaný napříč hardwarem.
- FP16 a BF16: poloviční přesnost, technicky spíš snížení přesnosti než klasická kvantizace.
- GPTQ, AWQ: 4bitové metody pro jazykové modely, které váhy kvantizují s ohledem na chybu na reálných datech.
- GGUF: kontejner s několika úrovněmi kvantizace používaný pro běh modelů na CPU i běžných GPU.
Příklady z praxe
Model 7B na notebooku bez dedikované grafiky
Jazykový model se 7 miliardami parametrů zabírá ve FP16 zhruba 14 GB, což se do běžného notebooku nevejde. Po 4bitové kvantizaci do formátu GGUF klesne velikost souboru přibližně na 4 GB a model se rozběhne na CPU s 8 GB volné RAM. Odezva je v jednotkách tokenů za sekundu a kvalita odpovědí u běžných úloh zůstává blízko originálu.
INT8 kvantizace klasifikátoru v PyTorch
U menší konvoluční sítě pro klasifikaci obrázků stačí dynamická post-training kvantizace lineárních vrstev. Model se zmenší přibližně čtyřnásobně a inference na CPU zrychlí, aniž by se sahalo na trénovací pipeline. Přesnost se pak porovná na stejné validační sadě jako u FP32 verze.
import torch model_fp32 = MyClassifier() model_fp32.load_state_dict(torch.load("model.pt")) model_fp32.eval() model_int8 = torch.quantization.quantize_dynamic( model_fp32, {torch.nn.Linear}, dtype=torch.qint8, ) torch.save(model_int8.state_dict(), "model_int8.pt")
Časté omyly
- MýtusKvantizace model zrychlí vždy, je to přece méně bitů.
- Ve skutečnostiZrychlení nastane jen tehdy, když cílový hardware a runtime umí daný formát počítat nativně. Pokud se kvantizované váhy musí za běhu rozbalovat zpět do float, výsledek může být pomalejší než původní model.
- MýtusČtyřbitová kvantizace model prakticky nezhorší, testy to ukazují.
- Ve skutečnostiPrůměrné skóre na běžných benchmarcích opravdu klesá málo, ale ztráta se koncentruje do konkrétních schopností: aritmetika, dlouhý kontext, méně zastoupené jazyky nebo přesné dodržení formátu výstupu. Bez vlastního vyhodnocení na cílové úloze je číslo z benchmarku málo vypovídající.
- MýtusKvantizovaný model se nedá dál dolaďovat.
- Ve skutečnostiDoladění kvantizovaného modelu je běžná praxe, typicky pomocí adaptérů LoRA nad zmrazenými kvantizovanými vahami. Alternativou je quantization-aware training, kdy se zaokrouhlování simuluje přímo během učení.
Časté dotazy
- Kolik paměti kvantizace modelu reálně ušetří?
- Kvantizace modelu zmenšuje váhy zhruba podle poměru bitových šířek. Přechod z 32 bitů na 8 bitů znamená přibližně čtyřnásobnou úsporu, z 16 bitů na 4 bity zhruba čtyřnásobnou také. Úspora se ale netýká celé paměťové stopy: při inferenci zabírá místo i cache klíčů a hodnot, aktivace a režie runtime, které kvantizované být nemusí. U dlouhého kontextu může KV cache dokonce převážit velikost samotných vah, takže reálná úspora bývá menší, než napovídá poměr bitů.
- Jak poznám, že kvantizace poškodila model příliš?
- Poškození se pozná srovnávacím měřením proti původnímu modelu na stejné testovací sadě, ideálně složené z úloh, které aplikace skutečně řeší. U jazykových modelů se sleduje perplexita jako rychlý indikátor a vedle toho konkrétní metriky úlohy: přesnost odpovědí, dodržení JSON formátu, kvalita ve výstupním jazyce. Varovné signály jsou opakování textu, rozpad na delších vstupech a chyby v jednoduchých výpočtech. Pokud pokles překročí předem stanovenou hranici, je namístě mírnější formát nebo quantization-aware training.
- Který kvantizační formát zvolit pro nasazení na server s GPU?
- Pro serverové GPU je rozumným výchozím bodem INT8 nebo FP8 tam, kde ho čip podporuje, protože obojí běží nativně na tensor jednotkách a nabízí předvídatelnou kvalitu. Pokud je limitem VRAM, sahá se u jazykových modelů po 4bitových metodách typu GPTQ nebo AWQ, které kvantizují váhy s ohledem na chybu měřenou na kalibračních datech. Volbu vždy rozhoduje kombinace hardwaru a inference runtime, ne samotný formát: stejná váhová reprezentace může mít na dvou serverech výrazně odlišnou propustnost.
- Vyplatí se kvantizace i u malých modelů na mobilu?
- Kvantizace modelu má na mobilních zařízeních obvykle větší přínos než na serveru, protože šetří baterii, paměť i čas startu aplikace. Mobilní NPU a DSP navíc často počítají výhradně celočíselně, takže INT8 je zde spíš podmínkou nasazení než optimalizací. U malých sítí ale bývá citlivost na kvantizaci vyšší, protože chyba se rozloží mezi méně parametrů. Proto se u nich častěji sahá po quantization-aware training, které ztrátu přesnosti z velké části vrátí zpět.
Zdroje
- Quantization(otevře se v novém okně)
- Post-training quantization(otevře se v novém okně)
- Quantization(otevře se v novém okně)
- Quantization (signal processing)(otevře se v novém okně)