Benchmarks

Benchmarks

My machines, my runs, noted down.

Qwen3.5-4B-Base quantization

I took one 4.33B base model, made eight quantizations of it, and scored every one against the same bf16 reference on the same held-out text.

Why this model

I wanted to be able to keep the full-precision model in memory. A 9B model at bf16 needs about 18 GB, and my Mac has 24 GB shared between everything. That leaves no room for a context buffer or anything else, and swapping to disk on every token is not a fair test.

Qwen3.5-4B-Base at bf16 is 8.67 GB. It fits on the GPU with room to spare, so I could run a real bf16 baseline instead of a fake one. That baseline is the reference for every perplexity and KL number on this page. A model that only fits on disk cannot give me that.

How I ran it

Model
Qwen/Qwen3.5-4B-Base — 4.33B parameters in the text model. The Hugging Face repo lists 4.66B in total, but 334M of that is a vision encoder I did not quantize.
Reference
bf16 GGUF, 8.67 GB, 16.02 bits per weight
Hardware
MacBook Pro, M5 Pro, 10-core, 24 GB, on AC power, Low Power Mode off
Runtime
llama.cpp 0.6.0 (Homebrew), Metal backend
Test text
wikitext-2-raw test split, 100 chunks at 512 context = 25,500 scored tokens
Calibration
bartowski calibration v6, 200 chunks at 512 context
Speed test
llama-bench, 5 repeats, plus a streaming test at 128, 1k and 4k prompt tokens
Off
Speculative decoding off everywhere

The results

Quant GB bpw PPL ΔPPL KLD KLD p99 Top-1% tok/s TTFT 1k RSS MB
bf16 reference8.6716.028.2897————14.79918928
Q8_04.618.538.2874+0.0030.000200.00199.2026.09415082
Q6_K3.566.598.2873+0.0030.002160.01497.5132.79934111
Q5_K_M +i3.165.858.3271+0.0430.004260.02896.5635.810183738
Q5_K_M3.165.858.3170+0.0330.006180.04396.0735.710333739
Q4_K_M +i2.785.158.4085+0.1240.015520.11093.7339.89943391
Q4_K_M2.785.158.3986+0.1140.022110.16392.8638.710273392
IQ4_XS +i2.584.778.4426+0.1580.020450.14092.7641.39683204
IQ4_XS2.594.808.4671+0.1830.024730.18292.1642.59743217

bf16 scores 8.2897 for perplexity. ΔPPL is the paired difference that llama.cpp reports with its own error bar, not a subtraction of two separate numbers. tok/s is llama-bench tg128 over 5 repeats. TTFT is the median of 5 streaming requests at a 1024-token prompt. Memory is the llama-server process, so it is a low figure. +i means I built that file with an importance matrix.

What I take from this

  • I use an importance matrix every time now. Three minutes to build, and every 4-bit and 5-bit file came out closer to bf16 with no size worth measuring.
  • Perplexity alone would not have shown me this change.
  • Quantizing gives you about 2.9× more tokens per second, from 14.7 to 42.5. It gives you almost nothing on time to first token.
  • IQ4_XS with an importance matrix is the smallest file at 2.58 GB. Q4_K_M with one is 205 MB bigger but 32% closer to the original. Pick one based on what you need.

The charts for this set, the full method, and a plain-English list of every column name, are in the write-up.