Kimi-K3 at 0.0086 bits per parameter, on one Spark (it is a joke)
- This build cannot write. Its output is token-shaped noise. It is not a small model, not a cheap model, and not a usable model. Nothing below should be deployed.
- The number is honest and the number is meaningless. 0.0086 bits per parameter is 3.01 GB divided by 2.8 trillion. It is a true arithmetic statement about a model that is 0.56% present.
- The article is about the division, not the model. If you have read a bits-per-weight claim recently, the interesting part was the denominator, and nobody printed it.
What I actually did
Kimi-K3 is 2.8 trillion parameters in 93 layers, with 896 routed experts per layer and 16 selected per token. That structure is the whole opportunity: 2.723T of the 2.8T are routed experts, and any given token touches 16 of 896. Keep 16 and you have removed 87% of the bytes without changing the format at all.
So the build is three moves, none of them clever:
- Fetch 16 of 896 expert slabs per layer over HTTP byte ranges. Split GGUF shards each carry their own tensor table; the expert axis is the last dimension of
*_exps.weight, so each expert is a contiguous byte range. I read the headers, computed the spans, and pulled 56.10 GB out of 594.0 GB in 7.7 minutes at 122 MB/s. The other 537.9 GB was never requested. The tensors that are present are verbatim copies — no re-initialization, no synthetic weights. - Throw away 81 of 93 layers. Depth is what costs decode time on one box, and quality was already conceded.
- Requantize everything to Q1_0 with the stock
llama-quantize --allow-requantize. No patched quantizer, no custom kernel, no fork. 1.125 bits per weight is llama.cpp's floor and I did not go below it.
Result: 3.01 GB, 15.60 billion parameters actually present, serving on one GB10 at 83.65 tok/s decode and 1,806.63 tok/s prefill, on -ngl 99, no tuning, no speculation, no KV quantization.
The generated recipe card. Note the two numbers sitting next to each other on purpose, and the amber "not measured" box where a concurrency claim would go if I had one. Card is generated from the recipe's measurements by the repo's renderer, not drawn by hand.
The ladder that gives the joke away
Same source tensors. Same quantizer. Same box. Same three lines of command. The only thing that changes between these rows is how much of the model I deleted.
| layers kept | experts used | file | parameters in the file | "bits per parameter" | real bits per parameter | decode tok/s |
|---|---|---|---|---|---|---|
| 93 of 93 | 16 of 16 retained | 15.64 GB | 104.78 B (3.74%) | 0.0447 | 1.194 | 11.27 |
| 24 of 93 | 4 of 16 retained | 4.88 GB | 28.84 B (1.03%) | 0.0140 | 1.355 | 49.03 |
| 12 of 93 | 2 of 16 retained | 3.01 GB | 15.60 B (0.56%) | 0.0086 | 1.544 | 83.65 |
llama-bench -p 128 -n 128 -ngl 99 -r 3, one idle node, spread ≤ 0.2% on decode. Two things fall out of that table:
- Depth is linear. 93 → 24 layers should be 3.9× fewer layer-seconds per token; the bench moved 4.35×. Nothing about the quantizer or the GPU enters into it. Each layer is a serial dependency.
- The headline moved 5.2× without touching the quantization. 0.0447 → 0.0086 is the same Q1_0 on the same weights. The number that goes in the tweet is a function of what I deleted, and the file's real density went up (1.194 → 1.544) because the fixed-cost tensors — embeddings, router, shared experts — became a larger share of a smaller file.
That last clause is the part I find genuinely funny. The "0.0086 bit" model is, in bits-per-weight terms over the tensors it actually contains, the worst of the three.
What it says
Greedy, temperature 0, 48 tokens, prompt "Write one sentence about quantization:"
Not degraded. Not quirky. Not language. The health check passes (48 tokens requested, 48 returned, 81.30 tok/s on that request, timings reported by the server) and the quality gate is recorded in the recipe as FAIL AS DESIGNED, because there is no output to gate.
I want to be exact here, because this is the part where a shitpost usually becomes a lie: there is no version of this that "still works". Much of the real Kimi-K3 is in there — the attention stack, the shared experts, the router, the embeddings, and 1.8% of the expert table — and none of it is enough, because the thing that was deleted is not redundancy, it is the model.
Why "lower quant" is the wrong lever
My first instinct when 11 tok/s was too slow was to quantize harder. That instinct is wrong, and the reason is worth keeping:
- 1.125 bpw is llama.cpp's floor. Q1_0 is the smallest type the quantizer has. There is no 0.5-bit format to reach for.
- Decode is bandwidth-bound, and already close to the wall. The 93-layer build reads 15.64 GB of weights per token and ran at 11.27 tok/s — about 176 GB/s of effective weight traffic, against a GB10 that can realistically deliver ~200 GB/s. Even a hypothetical 0.5 bpw format buys roughly 2×, and the arithmetic gets worse as fixed costs dominate.
- What actually moved the number was depth and active experts. Those are file-shape decisions, not quantization decisions, and they are free to make precisely because nobody is checking the output.
So the honest summary of the speed work is: I did not make the quantization better, I made the model smaller. In a real recipe that distinction is the difference between a result and a fabrication.
What this is arguing, if it argues anything
Three claims, in decreasing order of confidence:
- A bits-per-weight number without expert retention and layer count is not a measurement. It is a ratio with a declared denominator. That is not a moral failing — it is just a thing everyone should print, because the ratio can be moved by an order of magnitude without changing a single byte of the quantization format.
- "It runs on one box" is a weaker claim than it sounds. A 3 GB file will always run on one box. What makes a big-model result interesting is that the model is there, and "there" is exactly the variable that gets quietly optimized away.
- The engine is not the story. llama.cpp, a stock quantizer, and one afternoon did this. There was no novel kernel, no research contribution, no clever format. The interesting engineering in this post is the byte-range fetch, and it exists to avoid a 594 GB download, not to make the model better.
If someone posts a sub-1-bit number and does not say how many experts survived, they have run this recipe with worse manners and a straight face.
Reproducing it, if you must
The recipe is PR #83 in J-M-Recipes, recipes/dgx-spark-1x/kimi-k3-q0-0086-1x-spark, marked experimental with a README that opens by telling you not to deploy it. The three scripts are the artifact; the 3 GB GGUF is not published, because Kimi-K3 carries the Kimi K3 license (not Modified MIT) and a derivative repack is a licensing question that a script is not.
# what survives, and the two-number receipt
python3 scripts/k3_slice.py plan --dir UD-IQ1_S --shards 14
python3 scripts/k3_slice.py build k3-iq1s-sliced.gguf --dir UD-IQ1_S --shards 14 --jobs 8
python3 scripts/local_subset.py k3-iq1s-sliced.gguf k3-12l.gguf --layers 12 --expert-used 2
llama-quantize --allow-requantize k3-12l.gguf k3-q01-L12.gguf Q1_0
python3 scripts/receipts.py k3-q01-L12.gguf
The last line prints both numbers, side by side, in the order they should always be printed:
DECLARED bits/param : 0.0086 <- the tweet
REAL bits/param : 1.544 <- divide by what you actually shipped
weight volume missing: 99.4%
When you see a bits-per-weight claim you cannot reproduce, ask two questions: how many experts did you keep, and how many layers did you keep. If the answer is "all of them, obviously", the number means something. If there is no answer, you are looking at a smaller model with a bigger label, and the label is doing the work.