Views
No views yet
ffn_down (which feeds the residual stream) never drops below q4_K.| quant | size | PPL |
|---|---|---|
| unsloth UD-Q4_K_XL | 232.4 GiB | 3.5417 ± 0.0265 |
| unsloth UD-Q4_K_S | 217.0 GiB | 3.5471 ± 0.0266 |
| doublestuff (this repo) | 198.4 GiB | 3.5758 ± 0.0268 |
| flat-q4 experts (ablation) | 213.3 GiB | 3.5790 ± 0.0269 |
| imatrix q3-band only (ablation) | 196.4 GiB | 3.5809 ± 0.0269 |
| unsloth UD-Q3_K_XL | 170.3 GiB | 3.6116 ± 0.0271 |
| size | PPL | decode tg128 | prefill pp512 | |
|---|---|---|---|---|
| doublestuff (K-quant) | 198.4 GiB | 3.5758 | 33.3 t/s | 290.9 t/s |
| UD-Q3_K_XL (IQ) | 170.3 GiB | 3.6116 | 29.1 t/s | 286.2 t/s |
-ngl 999 --split-mode layer -fa on --no-mmap,
HIP_VISIBLE_DEVICES=0,2,3,4,5,7,8,9 (adjust to your cards).1# A) single-stream, latency-optimized (chat / agentic)
2-ngl 999 -sm layer -fa on --no-mmap -np 1 -ub 2048 \
3 --spec-type draft-mtp --spec-draft-n-max 2
4
5# B) max-context, two concurrent 256K sessions
6-ngl 999 -sm layer -fa on --no-mmap -np 2 -c 524288 -ub 1024 \
7 --cache-type-k q8_0 --cache-type-v q8_0 \
8 --tensor-split 0.98,1.13,1.13,1.12,1.07,0.92,0.82,0.95--spec-type draft-mtp, the model's own blk.60 nextn head — no
external draft model) speeds up single-stream decode, best at --spec-draft-n-max 2
(~+5% prose / +16% structured, lossless). n-max ≥ 3 loses to pipeline-verify cost, and
plain n-gram speculation is a net loss on an all-GPU layer split. draft-mtp is -np 1 only,
so it's mutually exclusive with mode B — pick latency or max-context.output + the MTP block make the last
cards heavy, so a naive contiguous split OOMs at 2×256K. The split above (measured under a
real long prefill, so the compute buffer is fully accounted) flattens the peak to
30.5 GiB @ ub512 / 31.6 GiB @ ub1024 of ~32. Single 256K contexts fit on an even split.-ub (~2.1 / 3.3 / 5.5 GiB
at ub 512 / 1024 / 2048). In the double-slot config, -ub 2048 overflows the 256 GB
aggregate — use -ub 1024 there (biggest prefill that fits both full slots) and reserve
-ub 2048 for single-stream mode A, which has the headroom.Q4_K_M; token_embd / output forced q6_K; routers kept F32; the MTP/nextn
block (blk.60) at q4_K. Routed experts graded from the imatrix ranking:ffn_(gate|up)_exps: q3_K on the 38 least-important layers (blk1–38), q5_K on blk53–58, else q4_K.ffn_down_exps: q4_K floor everywhere, q5_K on blk50–59, q6_K on blk0.ffn_(gate|up)_shexp (always-active shared expert) and attn_output: q6_K.recipe_v2.txt) and the importance tooling (compute_importance.py,
gen_recipe_v2.py) are in this repo.b3ce5ce (earlier llama-quantize rejects MTP models with
Bad layer 60). Quantize from Unsloth's BF16 GGUF shards — their imatrix matches their
conversion's layout; a fresh convert_hf_to_gguf.py run will not.1python3 compute_importance.py imatrix_unsloth.gguf # -> importance.json
2python3 gen_recipe_v2.py 38 6 10 # -> recipe_v2.txt
3llama-quantize \
4 --imatrix imatrix_unsloth.gguf \
5 --token-embedding-type q6_K --output-tensor-type q6_K \
6 --tensor-type-file recipe_v2.txt \
7 Qwen3.5-397B-A17B-BF16-00001-of-00018.gguf \
8 Qwen3.5-397B-A17B-doublestuff.gguf Q4_K_M $(nproc)analysis/ notes.