GGUF i kwantyzacja: Q4_K_M, Q6_K czy Q8_0? Test Bielika na RTX 4090
Co to jest GGUF, co znaczą Q4_K_M, Q5_K_M, Q6_K, Q8_0 i IQ oraz który wariant wybrać. Mój test 17 wersji polskiego Bielika (1.5B, 4.5B, 11B) na RTX 4090: perplexity na prozie Nałkowskiej, zgodność z pełną wersją, szybkość, VRAM i 12 polskich zadań. Plus gotowy skrypt PowerShell do własnego porównania.

👁 120 przeczytań
- Dla Bielika 11B na RTX 4090 najlepszym kompromisem są Q5_K_M i Q6_K, bo różnica perplexity względem Q8_0 mieści się w błędzie pomiaru wynoszącym około ±0,10.
- Bielik 11B w Q4_K_M zajmuje 6,72 GB i trafia w ten sam token co Q8_0 w 94,1% przypadków, czyli jest wyraźnie mniejszy przy minimalnej stracie jakości.
- Większy model w niższej kwantyzacji bije mniejszy w wyższej: Bielik 11B w Q3_K_M (5,40 GB) rozwiązał 11 z 12 zadań, a Bielik 4.5B w Q8_0 (5,06 GB) tylko 5.
GGUF to format pliku z modelem językowym dla llama.cpp, a dopisek w nazwie (Q4_K_M, Q6_K, Q8_0) mówi, jak mocno model ściśnięto. Krótko: Q4_K_M to rozsądne minimum, Q5_K_M i Q6_K są prawie nieodróżnialne od oryginału, a Q8_0 ma sens, gdy VRAM nie jest problemem. 17 października 2026 zmierzyłem to na polskim Bieliku (1.5B, 4.5B i 11B) na RTX 4090: perplexity na prozie Nałkowskiej, zgodność z pełną wersją, szybkość i VRAM. Więcej o uruchamianiu modeli u siebie znajdziesz w przewodniku lokalne AI.
Stan na 17 października 2026
- Oficjalne pliki GGUF Bielika v3.0 publikuje SpeakLeash na Hugging Face (organizacja speakleash). Licencja Apache 2.0, użycie komercyjne dozwolone.
- Repozytorium 1.5B ma tylko F16 i Q8_0, 4.5B tylko F16 i Q8_0, 11B ma Q4_K_M, Q5_K_M, Q6_K, Q8_0, BF16 i F16.
- Test zrobiłem na llama.cpp z CUDA (kompilacja 11194 z 26 września). Najnowsze wydanie llama.cpp to 0.7.0 z 15 października. Licencja MIT.
- W Ollamie Bielik 11B v3.0 nie ma tagu domyślnego, trzeba podać wariant, np.
:Q4_K_M.
Co wybrać: odpowiedź w punktach
- Q4_K_M - najmniejszy wariant, przy którym polski tekst nie cierpi wyraźnie. Bielik 11B w Q4_K_M ma 6,72 GB i trafia w ten sam najbardziej prawdopodobny token co Q8_0 w 94,1% przypadków.
- Q5_K_M i Q6_K - jeśli VRAM wystarcza, to najlepszy kompromis. Różnica perplexity względem Q8_0 mieści się w błędzie pomiaru.
- Q8_0 - praktycznie oryginał (96,7% zgodności z F16 w Bieliku 1.5B), ale prawie dwa razy większy od Q4_K_M i wolniejszy.
- Q3_K_M i niżej - tylko dla dużych modeli i w ostateczności. Bielik 1.5B w Q2_K przestaje sensownie odpowiadać (0 z 12 zadań).
- Większy model w Q4 jest lepszy niż mniejszy w Q8. Bielik 11B w Q3_K_M (5,40 GB) zrobił 11 z 12 zadań, Bielik 4.5B w Q8_0 (5,06 GB) zrobił 5.
Co to jest GGUF
GGUF to binarny format pliku opracowany przez zespół ggml-org (twórców llama.cpp) i używany od sierpnia 2023. Jeden plik zawiera wagi modelu i wszystkie metadane potrzebne do uruchomienia: architekturę, tokenizer, szablon czatu i maksymalny kontekst. Dzięki temu ten sam plik otworzysz w llama.cpp, w LM Studio i w Ollamie (która pod spodem korzysta z tego samego formatu).
Specyfikacja opisuje też konwencję nazw: Nazwa-Rozmiar-Dostrojenie-Wersja-Kodowanie.gguf. W pliku Bielik-11B-v3.0-Instruct.Q4_K_M.gguf ostatni człon to właśnie kwantyzacja.
Co to kwantyzacja i co znaczą Q4_K_M, Q6_K, Q8_0, F16, IQ
Kwantyzacja modelu to zapisanie wag mniejszą liczbą bitów. Oryginał trzyma każdą wagę w 16 bitach (F16 albo BF16). Q8_0 zapisuje ją w około 8,5 bita, Q4_K_M w niecałych 5. Plik robi się mniejszy, mieści się w mniejszej karcie i generuje szybciej, bo przy generowaniu wąskim gardłem jest przepustowość pamięci. Ceną jest drobny błąd w każdej wadze.
| Oznaczenie | Bitów na wagę | Co to znaczy |
|---|---|---|
| F16 / BF16 | 16 | bez kwantyzacji, punkt odniesienia |
| Q8_0 | 8,5 | bloki po 32 wagi, prosta skala |
| Q6_K | 6,56 | k-quant, superbloki po 256 wag |
| Q5_K_M | 5,70 | Q5_K, ważniejsze tensory w Q6_K |
| Q4_K_M | 4,89 | Q4_K, połowa attn_v i ffn_down w Q6_K |
| Q3_K_M | 4,00 | Q3_K, część tensorów w Q4_K |
| IQ4_XS, IQ3, IQ2 | 2,4-4,5 | i-quants, siatki nieliniowe, zwykle z imatrix |
Bity na wagę pochodzą z dokumentacji llama-quantize (pomiar dla Llama 3.1 8B). Litera K oznacza k-quants: wagi dzielone są na superbloki po 256, a skale bloków też są kwantyzowane. Końcówka _S, _M, _L to mieszanka: w Q4_K_M część najwrażliwszych tensorów dostaje wyższą precyzję (Q6_K), w Q4_K_S wszystko idzie w Q4_K. IQ to nowsza rodzina z nieliniowym rozkładem poziomów, przydatna poniżej 4 bitów. imatrix (macierz ważności) to plik liczony na próbce tekstu, który mówi narzędziu, które wagi są ważniejsze, żeby tam zostawić mniejszy błąd.
Mój test: Bielik na RTX 4090
Sprawdziłem 17 października 2026 na RTX 4090 24 GB (i9-14900KF, 64 GB RAM, Windows 11), llama.cpp CUDA, cały model na GPU.
- Pliki: oficjalne F16 i Q8_0 Bielika 1.5B v3.0 oraz Q8_0 Bielika 4.5B i 11B ze speakleash na Hugging Face (sumy sha256 zgodne z repozytorium). Pozostałe warianty zrobiłem sam przez llama-quantize: dla 1.5B z F16, dla 4.5B i 11B z Q8_0, bo większe oficjalne pliki przekraczały mój limit 5 GB na pobranie. Dla 11B dołożyłem też oficjalny Q4_K_M, który miałem już w Ollamie.
- Perplexity i zgodność: llama-perplexity, kontekst 2048, na początku „Romansu Teresy Hennert” Zofii Nałkowskiej (ok. 7900 słów, Wolne Lektury, domena publiczna od 2025). Zgodność to odsetek tokenów, przy których najbardziej prawdopodobny token jest ten sam co w wersji bazowej (F16 dla 1.5B, Q8_0 dla 4.5B i 11B).
- Szybkość: llama-bench, generowanie 128 tokenów, 3 powtórzenia.
- VRAM: przyrost w nvidia-smi przy działającym llama-server, kontekst 4096 (niższy z dwóch pomiarów).
- Zadania: 12 krótkich polskich zadań z jedną poprawną odpowiedzią (odmiana, korekta, procenty, JSON, liczebnik słownie, frazeologia), temperatura 0.
Bielik 1.5B: cała drabinka od F16 do Q2_K
| Wariant | Plik | Perplexity | Zgodność z F16 |
|---|---|---|---|
| F16 | 3,20 GB | 51,04 | baza |
| Q8_0 | 1,70 GB | 51,08 | 96,7% |
| Q6_K | 1,31 GB | 50,86 | 93,2% |
| Q5_K_M | 1,14 GB | 51,64 | 90,1% |
| Q4_K_M | 0,97 GB | 54,27 | 83,6% |
| Q4_K_M + imatrix | 0,97 GB | 52,21 | 88,1% |
| IQ4_XS + imatrix | 0,87 GB | 53,44 | 85,8% |
| Q3_K_M | 0,78 GB | 68,20 | 67,0% |
| Q2_K | 0,61 GB | 401,80 | 30,9% |
| Wariant | Generowanie | VRAM | Zadania |
|---|---|---|---|
| F16 | 216,9 tok/s | 3,5 GB | 5/12 |
| Q8_0 | 327,4 tok/s | 2,1 GB | 4/12 |
| Q6_K | 368,9 tok/s | 1,8 GB | 6/12 |
| Q5_K_M | 365,7 tok/s | 1,6 GB | 7/12 |
| Q4_K_M | 422,1 tok/s | 1,4 GB | 6/12 |
| Q3_K_M | 376,6 tok/s | 1,3 GB | 3/12 |
| Q2_K | 464,0 tok/s | 1,1 GB | 0/12 |
Model 1.5B jest za mały na poważne zadania niezależnie od kwantyzacji: już w F16 przypisał „Lalkę” Witkacemu. W Q3_K_M autorem został Stanisław Lem, a Q2_K na pytanie o Konstytucję 3 maja w kółko powtarzał „1997”.
Bielik 11B: od Q8_0 do Q3_K_M
| Wariant | Plik | Perplexity | Zgodność z Q8_0 |
|---|---|---|---|
| Q8_0 (oficjalny) | 11,87 GB | 4,74 | baza |
| Q6_K | 9,16 GB | 4,74 | 97,2% |
| Q5_K_M | 7,91 GB | 4,75 | 96,0% |
| Q4_K_M (oficjalny) | 6,72 GB | 4,76 | 94,1% |
| Q4_K_M (mój z Q8_0) | 6,72 GB | 4,77 | 94,1% |
| Q3_K_M | 5,40 GB | 4,89 | 89,9% |
| Wariant | Generowanie | VRAM 4096 / 32768 | Zadania |
|---|---|---|---|
| Q8_0 | 67,0 tok/s | 12,2 / 17,7 GB | 9/12 |
| Q6_K | 84,0 tok/s | 9,7 / 15,2 GB | 10/12 |
| Q5_K_M | 94,9 tok/s | 8,6 / 14,1 GB | 10/12 |
| Q4_K_M | 108,0 tok/s | 7,5 / 13,0 GB | 10/12 |
| Q3_K_M | 127,3 tok/s | 6,3 / 11,7 GB | 11/12 |
Wiersz Q4_K_M w drugiej tabeli to plik oficjalny. Mój Q4_K_M zrobiony z Q8_0 ma identyczny rozmiar, inną sumę sha256 i praktycznie te same wyniki (109,1 tok/s, 10/12).
Co z tego wynika
Nie przepłacaj za te subskrypcje
Prowadzę sklep z rocznymi dostępami do narzędzi AI - te same konta, o których piszę wyżej, tylko taniej niż w cenniku producenta.
- Do Q5_K_M różnice w perplexity są mniejsze niż błąd pomiaru (dla 11B około ±0,10). Pierwszy wyraźny spadek zgodności to Q4_K_M w małym modelu i Q3_K_M w dużym.
- Im większy model, tym lepiej znosi kwantyzację. Q4_K_M w 11B zachował 94,1% zgodności, w 1.5B 83,6%, w 4.5B 82,7% (tu liczone względem Q8_0).
- imatrix pomaga za darmo: Q4_K_M z macierzą ważności (policzoną na innym fragmencie „Lalki”) ma ten sam rozmiar, a zgodność wzrosła z 83,6% do 88,1%.
- 12 zadań nie rozróżnia wariantów 11B: wyniki 9-11 na 12 to szum przy pojedynczych odpowiedziach (Q8_0 przy liczebniku podał tylko „osiemdziesiątego czwartego”). Zgodność i perplexity mierzą to dokładniej.
- Perplexity na „Lalce” Prusa wyszła dla Bielika 11B 1,20, czyli model zna ten tekst prawie na pamięć. Dlatego do porównań użyłem Nałkowskiej. Liczb nie porównuj między 1.5B a 11B: modele mają różne tokenizery (ten sam tekst to 14 767 albo 23 760 tokenów).
Co wybrać na 8, 12, 16 i 24 GB VRAM
Liczby VRAM z testu to sam model w llama-server, bez pulpitu Windows i przeglądarki, które zwykle zajmują dodatkowo 1-2 GB. Szersze tło znajdziesz w tekstach co to jest VRAM i ile VRAM potrzeba na model lokalnie.
- 8 GB: Bielik 11B w Q3_K_M (6,3 GB przy kontekście 4096) albo Bielik 4.5B w Q8_0 (5,3 GB). Q4_K_M 11B zajmuje 7,5 GB, więc na 8 GB jest na styk.
- 12 GB: Bielik 11B w Q4_K_M albo Q5_K_M (7,5-8,6 GB) z zapasem na dłuższy kontekst.
- 16 GB: Bielik 11B w Q6_K (9,7 GB) albo Q4_K_M z pełnym kontekstem 32 768 tokenów (13,0 GB).
- 24 GB: Bielik 11B w Q8_0 nawet z kontekstem 32 768 (17,7 GB) albo większy model w Q4_K_M. Porównanie modeli znajdziesz w tekście najlepszy lokalny model AI po polsku.
Jak samemu porównać kwantyzacje krok po kroku
- Pobierz llama.cpp z GitHuba ggml-org (dla kart NVIDIA paczka z CUDA) i rozpakuj do folderu, np.
D:\llama-cuda. - Pobierz 2-3 kwantyzacje jednego modelu z oficjalnego repozytorium do jednego folderu, np.
hf download speakleash/Bielik-11B-v3.0-Instruct-GGUF Bielik-11B-v3.0-Instruct.Q4_K_M.gguf --local-dir D:\modele. - Sprawdź sumę:
Get-FileHash D:\modele\*.ggufi porównaj z SHA256 na stronie pliku w Hugging Face. - Przygotuj plik .txt po polsku (UTF-8, kilka tysięcy słów, najlepiej tekst, którego model nie zna na pamięć).
- Uruchom skrypt poniżej. Dostaniesz tabelę z rozmiarem, szybkością i perplexity oraz plik CSV.
Gotowy skrypt: porownaj-kwantyzacje.ps1
Przetestowałem go 17 października na czystym folderze z dwoma plikami Bielika 1.5B. Na samym procesorze (-Warstwy 0) Q4_K_M dał perplexity 54,31, na GPU w głównym teście 54,27. Pobierz porownaj-kwantyzacje.ps1.
# porownaj-kwantyzacje.ps1 - porównanie kwantyzacji GGUF w llama.cpp (promptowy.com/gguf/)
# Dla każdego pliku .gguf w folderze: rozmiar, szybkość (llama-bench: prompt 512 i generowanie 128 tokenów, 3 powtórzenia)
# i opcjonalnie perplexity na Twoim pliku tekstowym (llama-perplexity, kontekst 2048). Wynik: tabela + plik CSV.
#
# Użycie (PowerShell):
# powershell -ExecutionPolicy Bypass -File .\porownaj-kwantyzacje.ps1 -Modele D:\modele -Llama D:\llama-cuda -Tekst D:\tekst.txt
# -Modele folder z plikami .gguf (różne kwantyzacje tego samego modelu)
# -Llama folder z llama-bench.exe i llama-perplexity.exe (paczka llama.cpp z GitHuba ggml-org, wersja CUDA dla kart NVIDIA)
# -Tekst (opcjonalnie) plik .txt w UTF-8, najlepiej 5-20 tysięcy słów po polsku; bez niego tylko szybkość
# -Warstwy (opcjonalnie) ile warstw na GPU, domyślnie 99 = wszystkie
param(
[Parameter(Mandatory = $true)][string]$Modele,
[Parameter(Mandatory = $true)][string]$Llama,
[string]$Tekst = "",
[int]$Warstwy = 99
)
$ErrorActionPreference = "Continue" # llama.cpp pisze logi na stderr - "Stop" w PowerShell 5.1 przerwałby skrypt
$bench = Join-Path $Llama "llama-bench.exe"
$ppl = Join-Path $Llama "llama-perplexity.exe"
if (-not (Test-Path $bench)) { throw "Nie ma $bench - podaj folder z rozpakowanym llama.cpp w -Llama" }
$pliki = Get-ChildItem -Path $Modele -Filter *.gguf | Sort-Object Length -Descending
if ($pliki.Count -eq 0) { throw "W folderze $Modele nie ma plików .gguf" }
if ($Tekst -and -not (Test-Path $Tekst)) { throw "Nie ma pliku tekstowego $Tekst" }
$wyniki = @()
foreach ($p in $pliki) {
Write-Host "== $($p.Name)" -ForegroundColor Cyan
$w = [ordered]@{ Plik = $p.Name; GB = [math]::Round($p.Length / 1e9, 2); Prompt_tok_s = ""; Generowanie_tok_s = ""; Perplexity = "" }
# 1. Szybkość: llama-bench zwraca JSON (jedna pozycja dla pp512, druga dla tg128)
$json = & $bench -m $p.FullName -p 512 -n 128 -r 3 -ngl $Warstwy -o json 2>$null | Out-String
$start = $json.IndexOf("[")
if ($start -ge 0) {
foreach ($e in ($json.Substring($start) | ConvertFrom-Json)) {
if ($e.n_prompt -gt 0) { $w.Prompt_tok_s = [math]::Round($e.avg_ts, 1) } else { $w.Generowanie_tok_s = [math]::Round($e.avg_ts, 1) }
}
} else { Write-Host "llama-bench nie zwrócił wyniku (za mało VRAM? spróbuj -Warstwy 20)" -ForegroundColor Yellow }
# 2. Perplexity (im niżej, tym lepiej; porównuj tylko pliki tego samego modelu na tym samym tekście)
if ($Tekst) {
$log = & $ppl -m $p.FullName -f $Tekst -c 2048 -ngl $Warstwy 2>&1 | Out-String
$m = [regex]::Match($log, "Final estimate: PPL = ([\d.]+)")
if ($m.Success) { $w.Perplexity = [double]::Parse($m.Groups[1].Value, [Globalization.CultureInfo]::InvariantCulture) }
else { Write-Host "llama-perplexity: brak wyniku (tekst za krótki? potrzeba min. ok. 4100 tokenów)" -ForegroundColor Yellow }
}
$wyniki += [pscustomobject]$w
Write-Host (" {0} GB | prompt {1} tok/s | generowanie {2} tok/s | PPL {3}" -f $w.GB, $w.Prompt_tok_s, $w.Generowanie_tok_s, $w.Perplexity)
}
$wyniki | Format-Table -AutoSize
$csv = Join-Path $Modele ("porownanie-kwantyzacji-{0}.csv" -f (Get-Date -Format "yyyyMMdd-HHmm"))
$wyniki | Export-Csv -Path $csv -NoTypeInformation -Encoding UTF8 -Delimiter ";"
Write-Host "Zapisano: $csv" -ForegroundColor GreenW Ollamie nie musisz niczego konwertować: ollama run SpeakLeash/bielik-11b-v3.0-instruct:Q4_K_M pobiera dokładnie ten sam plik co Hugging Face (sprawdziłem sha256 warstwy modelu w rejestrze Ollamy). Szczegóły uruchamiania Bielika opisałem w tekstach Bielik i Bielik AI lokalnie.
Najczęstsze pytania
Co to jest GGUF?
Format pliku z modelem językowym dla llama.cpp i programów na nim opartych (LM Studio, Ollama, KoboldCpp, Jan). Jeden plik zawiera wagi, tokenizer, szablon czatu i metadane, więc nie potrzebujesz dodatkowych plików konfiguracyjnych.
Co to jest kwantyzacja modelu?
Zapisanie wag mniejszą liczbą bitów, np. 4-5 zamiast 16. Model zajmuje 2-4 razy mniej miejsca i VRAM, generuje szybciej, a traci trochę dokładności. W moim teście Bielik 11B w Q4_K_M generował 108,0 tok/s, a w Q8_0 67,0 tok/s.
Q4_K_M czy Q8_0?
Jeśli model w Q8_0 mieści się w VRAM razem z kontekstem, którego potrzebujesz, wybierz Q6_K albo Q8_0. Jeśli nie, Q4_K_M dużego modelu da więcej niż Q8_0 małego. Różnica jakości między Q4_K_M a Q8_0 w Bieliku 11B to 4,76 wobec 4,74 perplexity.
Czy kwantyzacja psuje polski?
Do Q4_K_M w modelu 11B nie zauważyłem pogorszenia w zadaniach, a perplexity wzrosła tylko w granicach błędu (4,76 wobec 4,74). W modelu 1.5B od Q3_K_M widać błędy w faktach i odmianie, a Q2_K generuje pętle i nieistniejące słowa.
Gdzie pobrać GGUF Bielika?
Tylko z oficjalnej organizacji speakleash na Hugging Face albo z konta SpeakLeash w bibliotece Ollamy. W wyszukiwarce obu serwisów jest wiele kopii od osób prywatnych z podobnymi nazwami, nie zawsze aktualnych i nie zawsze z tym samym szablonem czatu. Po pobraniu porównaj sumę sha256 z repozytorium.
Źródła i data sprawdzenia
- ggml-org: specyfikacja formatu GGUF
- llama.cpp: dokumentacja llama-quantize (typy, bity na wagę)
- llama.cpp PR 1684: opis k-quants i mieszanek _S/_M
- speakleash/Bielik-11B-v3.0-Instruct-GGUF
- speakleash/Bielik-4.5B-v3.0-Instruct-GGUF
- speakleash/Bielik-1.5B-v3.0-Instruct-GGUF
- Ollama: SpeakLeash/bielik-11b-v3.0-instruct
- llama.cpp: wydania
- Wolne Lektury: Zofia Nałkowska, „Romans Teresy Hennert”
- Wolne Lektury: Bolesław Prus, „Lalka”, tom I
- Mój pomiar z 17 października 2026: RTX 4090, llama.cpp CUDA build 11194, 17 wariantów GGUF
Sprawdzone 17 października 2026.
Cały tydzień w AI, w jednym mailu
Wybrane premiery, narzędzia i analizy. Raz w tygodniu, prosto do skrzynki.
Zapisz się za darmo →
