Kvantizacija u praksi: GGUF, Q4_K_M i AWQ

Model od osam milijardi parametara u punoj preciznosti traži šesnaest gigabajta memorije. Isti taj model, kvantizovan, staje u pet i radi gotovo jednako dobro. Cela razlika između „ovo ne može na mom serveru" i „ovo radi bez problema" svodi se na jednu oznaku u imenu fajla.

Ovaj tekst objašnjava šta se tačno dešava kada se model kvantizuje, kako se čitaju oznake tipa Q4_K_M i koji format odgovara kom alatu za pokretanje.

Šta kvantizacija zapravo radi

Model je skup brojeva — težina. Posle treniranja svaka težina je zapisana u šesnaest bitova, kao decimalni broj. Kvantizacija te brojeve zapisuje u manje bitova: osam, pet, četiri, ponekad i manje.

Postupak nije obično zaokruživanje. Težine se dele u blokove, za svaki blok se izračuna faktor skaliranja, pa se pojedinačne vrednosti unutar bloka čuvaju kao mali celi brojevi u odnosu na taj faktor. Zato četvorobitna kvantizacija u praksi troši nešto više od četiri bita po težini — faktori skaliranja se takođe moraju negde zapisati.

Kao što je pokazano u tekstu o proceni VRAM-a, računica je jednostavna: broj parametara pomnožen brojem bajtova po parametru.

Preciznost Bajtova po težini Model od 8B Model od 70B
FP16 / BF16 2 16 GB 140 GB
INT8 1 8 GB 70 GB
INT4 0,5 4 GB 35 GB

Ove brojke su samo težine. Stvarno zauzeće je deset do dvadeset odsto veće zbog KV keša, aktivacija i režije samog alata — o čemu niže ima poseban odeljak.

Čitanje oznake Q4_K_M

Oznaka izgleda kao šifra, ali ima tri jasna dela.

Deo Značenje
Q4 Nominalan broj bitova po težini
_K K-kvantizacija: važniji slojevi dobijaju više bitova od ostalih
_M Veličina varijante — S mala, M srednja, L velika

Starije oznake bez slova KQ4_0, Q4_1, Q8_0 — ravnomerno tretiraju sve slojeve. Zadržane su zbog kompatibilnosti, ali za četiri i pet bitova k-varijante su bolje pri istoj veličini.

Postoji i treća porodica, IQIQ2_XXS, IQ3_M i slično. Te koriste matricu važnosti dobijenu merenjem na uzorku teksta i drže kvalitet znatno bolje na vrlo niskim bitovima. Cena je sporije izvršavanje, naročito na procesoru.

Kako se veličine odnose

Za model od osam milijardi parametara, okvirno:

Varijanta Veličina Gubitak kvaliteta
Q8_0 8,5 GB Praktično nemerljiv
Q6_K 6,6 GB Zanemarljiv
Q5_K_M 5,7 GB Vrlo mali
Q4_K_M 4,9 GB Mali, prihvatljiv za sve namene
Q3_K_M 4,0 GB Primetan, greške u dužem tekstu
Q2_K 3,2 GB Veliki, upotrebljivo samo u nuždi

Krivulja nije ravnomerna. Između osam i pet bitova gubitak je jedva merljiv, između pet i četiri mali, a ispod četiri počinje naglo da raste. Zato je Q4_K_M podrazumevani izbor gotovo svuda — tu se seče tačka u kojoj se najviše memorije uštedi za najmanje kvaliteta.

Pravilo koje vredi zapamtiti

Kada biraš između većeg modela u nižoj i manjeg u višoj preciznosti pri istoj potrošnji memorije, veći model u Q4_K_M gotovo uvek pobeđuje manji u Q8_0. Broj parametara nosi više nego preciznost njihovog zapisa — sve dok se ne spusti ispod tri bita, gde pravilo prestaje da važi.

Praktično: na kartici od dvadeset četiri gigabajta model od trideset dve milijarde u Q4_K_M daje bolje rezultate od modela od četrnaest milijardi u Q8_0.

Formati i alati

Oznake tipa Q4_K_M pripadaju GGUF formatu. To nije jedini format, i izbor zavisi od toga čime pokrećeš model.

Format Alat Kada ga biraš
GGUF Ollama, llama.cpp, LM Studio Jedan korisnik, mešano CPU i GPU, skromniji hardver
AWQ vLLM, SGLang Više paralelnih zahteva, sve na GPU-u
GPTQ vLLM, TGI Stariji, koristi se kad AWQ varijanta ne postoji
FP8 vLLM Novije kartice sa hardverskom podrškom, gotovo bez gubitka
bitsandbytes Transformers Dodatno treniranje, ne za produkciju

Formati nisu međusobno zamenljivi. vLLM ne učitava GGUF na način na koji to radi llama.cpp, a Ollama ne prihvata AWQ. Format se bira zajedno sa alatom, ne posle njega.

GGUF i mešano izvršavanje

Glavna prednost GGUF-a je što deo slojeva može ostati na procesoru kada model ne stane ceo u karticu. To je razlog zašto se model od trideset milijardi uopšte može pokrenuti na kartici od dvanaest gigabajta.

Cena je drastična. Kao što pokazuje poređenje procesorske i grafičke inferencije, svaki sloj koji se prelije na procesor povlači brzinu naniže, i to nesrazmerno broju prelivenih slojeva.

Kvantizacija KV keša

Težine nisu jedino što troši memoriju. Kontekst se čuva u KV kešu, a on raste sa dužinom razgovora i može premašiti sam model.

Za dugačke kontekste keš se takođe može kvantizovati. U llama.cpp:

$ llama-server -m model.gguf \
    --cache-type-k q8_0 \
    --cache-type-v q8_0 \
    -c 32768

U Ollama, kroz varijablu okruženja:

$ OLLAMA_KV_CACHE_TYPE=q8_0 ollama serve

Osmobitni keš prepolovi njegovo zauzeće uz gubitak koji se u praksi ne primećuje. Četvorobitni ide dalje, ali tu kvalitet dugih razgovora počinje da trpi.

Izbor u praksi

Ollama

Varijanta se navodi u oznaci modela:

$ ollama pull qwen3:8b-q4_K_M
$ ollama pull qwen3:8b-q8_0

Bez navedene varijante Ollama uzima podrazumevanu, po pravilu četvorobitnu:

$ ollama pull qwen3:8b

Šta je preuzeto i koliko zauzima:

$ ollama list
NAME                ID              SIZE      MODIFIED
qwen3:8b-q4_K_M     a1b2c3d4e5f6    4.9 GB    2 hours ago
qwen3:8b-q8_0       f6e5d4c3b2a1    8.5 GB    5 days ago

Detalji o učitanom modelu:

$ ollama show qwen3:8b-q4_K_M

Hugging Face

Kvantizovane verzije stoje u zasebnim repozitorijumima, obično sa sufiksom -GGUF, -AWQ ili -GPTQ u imenu. Unutar GGUF repozitorijuma stoji više fajlova, po jedan za svaku varijantu. Preuzimanje i organizacija fajlova biće obrađeni u posebnom tekstu o Hugging Face CLI alatu (u pripremi).

Sopstvena kvantizacija

Ako varijanta koja ti treba ne postoji, pravi se iz llama.cpp:

$ ./llama-quantize model-f16.gguf model-q4_k_m.gguf Q4_K_M

Spisak svih podržanih tipova:

$ ./llama-quantize --help

U najvećem broju slučajeva ovo nije potrebno — popularni modeli imaju sve varijante spremne.

Merenje gubitka

Standardna mera je perpleksnost, izračunata nad istim tekstom za obe verzije modela:

$ ./llama-perplexity -m model-q4_k_m.gguf -f test.txt

Niža vrednost je bolja, a poredi se isključivo isti model u različitim varijantama. Poređenje između različitih modela ovim putem ne znači ništa.

U svakodnevnom radu je korisnija jednostavna provera: pusti dvadesetak zadataka kakve stvarno radiš kroz obe varijante i uporedi odgovore. Ako razliku ne primećuješ, nema razloga da držiš veću.

Praktični scenariji

Scenario 1: model staje u memoriju ali je spor

Proveri koliko je slojeva stvarno na kartici. Ako je kontekst velik, KV keš je pojeo prostor i deo modela se prelio na procesor. Rešenje je manji kontekst, kvantizovan keš ili niža varijanta modela.

Scenario 2: model greši u kodu, a u razgovoru je uredan

Kod je osetljiviji na kvantizaciju od proznog teksta — jedan pogrešan znak kvari ceo ispis. Pređi sa Q4_K_M na Q5_K_M ili Q6_K i uporedi.

Scenario 3: mali model daje besmislice

Modeli ispod četiri milijarde parametara mnogo lošije podnose agresivnu kvantizaciju od velikih. Za takve drži bar Q5_K_M, a Q8_0 ionako zauzima malo.

Scenario 4: vLLM odbija da učita fajl

Verovatno je u pitanju GGUF. Nađi AWQ ili FP8 verziju istog modela, ili pređi na llama.cpp za taj fajl.

Scenario 5: biraš između dva modela za istu karticu

Uzmi veći model u nižoj varijanti, sve dok ne siđeš ispod tri bita. Proveri obavezno i koliko ostaje slobodno za kontekst — model koji taman stane nema gde da smesti razgovor.

Kratka referenca

  • Q4_K_M — podrazumevani izbor za većinu postavki
  • Q5_K_M, Q6_K — kada ima memorije na pretek ili kod mora da bude tačan
  • Q8_0 — za male modele i za poređenje kao referenca
  • Q3 i niže — samo kada drugačije ne ide
  • _K — k-kvantizacija, bolja od starih _0 i _1
  • IQ — bolji kvalitet na niskim bitovima, sporije izvršavanje
  • GGUF — Ollama i llama.cpp, mešano CPU i GPU
  • AWQ, GPTQ, FP8 — vLLM, sve na GPU-u
  • ollama pull model:8b-q4_K_M — izbor varijante
  • ollama list — veličina preuzetih modela
  • llama-quantize ulaz.gguf izlaz.gguf Q4_K_M — sopstvena kvantizacija
  • --cache-type-k q8_0 — kvantizovan KV keš
  • Veći model u Q4 nadmašuje manji u Q8 pri istoj potrošnji memorije
  • Ispod četiri bita kvalitet pada naglo, ne postepeno

Vežba

  1. Izračunaj koliko memorije traži model od četrnaest milijardi parametara u Q4_K_M, pa proveri rezultat stvarnom veličinom fajla.
  2. Preuzmi isti model u dve varijante i uporedi ispis komande ollama list.
  3. Postavi istih pet pitanja obema varijantama i zapiši gde se odgovori razlikuju.
  4. Prati nvidia-smi tokom rada obe varijante i uporedi zauzeće memorije sa veličinom fajla.
  5. Pokreni model sa kontekstom od trideset dve hiljade tokena, pa isto to sa kvantizovanim KV kešom, i uporedi razliku u zauzeću.

Sledeći tekst u serijalu: Ollama: instalacija na Linux serveru od nule (u pripremi)

Povezano:

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd