1-bit vs 3-bit on a DGX Spark: 27% faster, no cost

dgx-spark Qwen3.8-Flash-Next

The DeepSeek post established that on this machine throughput tracks how much of a model is resident, not how much is activated. Shrinking Qwen3.8-Flash-Next from 83.8 GiB to 67.6 GiB — the same model, same build, same flags, only the quantisation changed — took throughput from 23.54 to 29.81 tok/s. Resident size to 0.807×, speed to 1.27×.

That leaves the obvious question. Three bits per weight down to roughly one is an aggressive squeeze. What does it cost?

The answer, at the sample size I can afford: nothing I can detect.

The measurement

MMLU-Pro, engineering and law, 200 questions each per arm — 800 questions in total. Both subjects at an 8192-token generation cap, which the generation-cap post showed is where engineering stops being truncated. Engineering is the subject most sensitive to a model’s reasoning holding together; law is the control that barely moved under any other intervention.

Subject (accuracy %) 3-bit (UD-Q3_K_XL)1-bit (UD-IQ1_S)
engineering 70.5 66.0
law 68.5 71.0
Qwen3.8-Flash-Next at two quantisations, MMLU-Pro accuracy, 200 questions per cell at max_gen_toks 8192. Same model, same llama.cpp build, same 12288-token slots. All four categories exited zero.
Subject 3-bit 1-bit Change 95% interval
engineering 70.5 66.0 −4.5 ±9.1
law 68.5 71.0 +2.5 ±9.0

Why this reads as no effect rather than a small loss

Both differences sit inside the interval that 200 questions permits. That alone would only mean “we cannot resolve it.”

The stronger signal is the direction. Engineering fell 4.5 points; law rose 2.5. A real degradation from crushing weights to one bit would push both subjects the same way — it would show up as the model reasoning less reliably everywhere, not as a loss on one subject paid back on another.

Opposite signs across two subjects is what scatter looks like. It is the same reasoning that settled the reboot question: when a real effect was present, twelve out of twelve measurements moved together; when it was absent, they split.

What you get for it

End-to-end throughput — chat_short 168 prompt tokens · median of 5 runs
Machine Model Resident size tok/s
NVIDIA DGX Spark (GB10)
NVIDIA GB10
Qwen/Qwen3.8-Flash-Next
UD-IQ1_S · llama.cpp · no spec · 8k ctx
67.6 GiB — 1-bit
29.8 ±0.3
NVIDIA DGX Spark (GB10)
NVIDIA GB10
Qwen/Qwen3.8-Flash-Next
UD-Q3_K_XL · llama.cpp · no spec · 8k ctx
83.8 GiB — 3-bit
23.5 ±0.1
Same two builds measured on the throughput harness. Both passed the coherence gate 3/3.

27% more throughput and 16.2 GiB back. On a 121 GiB machine that 16 GiB is not a rounding error — it is the difference between two concurrent slots and six, or between running alongside your other services and not.

The honest limit

±9 points is a wide band. This rules out a large degradation. It does not rule out a small one. Unsloth’s own retention figures put UD-IQ1_S at 80.2% of full quality against UD-Q3_K_XL’s 90.4% — a gap that, if it translated directly to MMLU-Pro, would sit right at the edge of what 200 questions can resolve.

The claim is “no measurable cost at this sample size”, not “no cost”. Resolving a five-point difference with confidence needs roughly four times the questions, which is roughly four times 13 hours of GPU time.

Two subjects, not fourteen. Engineering and law were chosen as the extremes of answer length. The other twelve were not measured at these quantisations.

One model. Qwen3.8-Flash-Next is a sparse MoE with about 6B active parameters and a 51B N-gram lookup table. How aggressive quantisation treats a lookup table of that size is not something to generalise from one model, and it is a plausible reason this particular architecture survives 1-bit better than a dense model would.

Total run time

Arm What ran Questions Machine time
3-bit (UD-Q3_K_XL) 2 subjects · 8,192-token cap 400 8.4 h
1-bit (UD-IQ1_S) 2 subjects · 8,192-token cap 400 4.8 h
Total 800 13.2 h
Machine time for the two quality arms, from data/subject-sweep/. Scoring time only, and it excludes the three attempts that failed before these two succeeded.

Thirteen hours for 800 questions — two subjects, 200 questions, two quantisations.

Per question that is far more expensive than any other sweep on this site, for two reasons. The 8,192-token cap lets answers run nearly three times longer than the 3,072 default most sweeps used, and llama.cpp on a 67.6 GiB model is slow enough that the smaller arm still only manages about 30 tok/s.

The gap between the arms is the finding restated as time: the 3-bit model took 8.4 hours and the 1-bit model 4.8 for identical work. That is the 27% throughput difference compounded over 400 questions each.

It is also the reason the sample stops at 800 questions. Resolving a five-point accuracy difference needs roughly four times the sample, which is another fifty-odd hours for a result that would still be a single model at a single context length.

A note on the three attempts that failed first

This sweep took four tries. The first three produced no data at all, and the reason is worth writing down because it was not what I assumed.

I lost 4.7 hours to a run where every category failed with Session is closed, and diagnosed it as a client timeout. It was not. The server log showed 384 requests killed by “Context size has been exceeded”. llama.cpp reports n_ctx_slot = 16384 while also reporting kv_unified = true — and when the KV cache is unified, --ctx-size is a total divided across slots. Four slots meant about 4,096 tokens each, against the ~11,000 an MMLU-Pro request needs once a five-shot prompt and an 8192-token answer are counted.

Acting on that finding is what broke the machine: I raised the context to 49152 without checking it against the 14 GiB of headroom I had measured myself an hour earlier, and drove the box into memory exhaustion severe enough that sshd could accept connections but not fork a session. It needed a physical power cycle.

What the failures did not do is produce numbers. Every failed category recorded accuracy: null. That is the result of a fix made earlier in this campaign, after the harness was caught reporting a previous run’s score when lm-eval had written nothing — a three-bit GGUF’s engineering figure that was really an eight-thousand-token-cap run read back off disk. The failed records are committed alongside the successful ones, nulls and all.

A benchmark that fails loudly is worth more than one that fails quietly, and that is not a platitude here: without that fix, this post would have reported two fabricated accuracy figures and I would not have known.

Source data: 028ad1c3369daa8df7c97943