Repository navigation
Description
First: thank you for DFlash — on the same machine described below, your Qwen3.6 drafters are delivering excellent results (details at the end). This report is about the one model where we could not make it work, with what we hope is a useful elimination matrix.
Setup
- Engine: llama.cpp mainline
draft-dflash(PR #22105 implementation), commit956973c, ROCm backend (AMD Strix Halo / gfx1151, Windows) - Target:
unsloth/Qwen3.5-122B-A10B-MTP-GGUFUD-Q4_K_XL (73 GB), ctx 65536,--parallel 1 -sm layer - Drafters tested (both converted with current-master
convert_hf_to_gguf.py --target-model-dir <stock Qwen3.5-122B-A10B metadata>):z-lab/Qwen3.5-122B-A10B-DFlash@2274357(the 2026-06-19 Modal retrain; 6L, 8 extraction layers, SWA 4096)z-lab/Qwen3.5-122B-A10B-DFlash@6c7242c(the original April weights; 4L, 6 extraction layers, SWA 2048)
- Flags:
--spec-type draft-dflash --spec-draft-n-max 6(block_size=16 read from metadata; init logs confirmn_extract=8/n_extract=6respectively)
Results
| drafter | drafter quant | mean draft acceptance |
|---|---|---|
retrain (2274357) |
Q8_0 | 1.4–2.6% |
retrain (2274357) |
F16 | 1.6% |
original (6c7242c) |
Q8_0 | 10–12% |
original (6c7242c) |
F16 | 9.6% |
For comparison, on the same machine, engine build, quant level (UD-Q4_K_XL), and flags:
| model | drafter | acceptance |
|---|---|---|
| Qwen3.6-35B-A3B (unsloth MTP repack, UD-Q4_K_XL) | z-lab/Qwen3.6-35B-A3B-DFlash retrain, third-party GGUF conversion from June |
50–56% |
| Qwen3.6-35B-A3B (same) | same weights converted by us with the identical pipeline used for the 122B | 48–59% |
| Qwen3.6-27B (unsloth MTP repack, Q8_0) | z-lab/Qwen3.6-27B-DFlash (original generation) |
~55% |
So the conversion pipeline, engine build, and target quant level are each validated by a working control; only the 122B pair fails.
What we ruled out
- Conversion pipeline — re-converting the 35B drafter with the exact pipeline used for the 122B reproduces healthy acceptance (48–59%).
- Drafter precision — F16 vs Q8_0 makes no difference for either 122B drafter generation (table above).
- Vocab mismatch — drafter and target tokenizers are identical (
N=248320, probe-verified token-for-token, both pairs). - Extraction-layer indexing — GGUF
dflash.target_layerscarries the same +1 convention in the working 35B GGUF ([2,7,12,17,23,28,33,38]from HF[1,6,...]) and ours ([2,8,15,21,27,33,40,46]from HF[1,7,...]). - MTP/nextn layer placement in the unsloth repacks — nextn is the last block in both targets (blk.48 of 49 for the 122B, blk.40 of 41 for the 35B); real-layer indices are unshifted.
- Target weight revisions —
Qwen/Qwen3.5-122B-A10Bweights are unchanged since February; the unsloth repack (May) and both drafter generations derive from the same checkpoint. - Prefill feature injection — the implementation's
pos_max < N-1("Drafts may degrade") diagnostic never fires; the injection path runs on every prefill ubatch. - Drafter GGUF structure is byte-convention identical to the working 35B conversion (69 tensors, same keys).
Hypothesis and questions
The pattern — the tightly-fitted retrain degrades more (2%) than the looser original (10%) against the same Q4 target — looks like sensitivity of the extraction-layer hidden states to target quantization on this fine-grained MoE, rather than a plumbing bug. Your published accept lengths (3.2–8.7) are measured on SGLang with high-precision targets; we cannot test a BF16 target locally (245 GB > our 110 GB).
- Was the 122B drafter ever validated against a quantized target (llama.cpp or otherwise)? Is quantized-target feature drift a known failure mode at this scale?
- Is there anything llama.cpp's implementation should be doing differently for this drafter family (e.g. feature normalization, the SWA pattern) that would not affect the 35B?
- Your README mentions the training recipe is planned for open-sourcing — is there an ETA? We would run a quant-aware adaptation (teacher = dequantized Q4 features) and report back.
We are currently running a target-precision ladder (UD-Q3_K_XL / UD-Q4_K_XL / UD-Q5_K_M) to test the hypothesis directly and will post the acceptance-vs-precision curve here when it completes.
The good news: on this same consumer hardware, your Qwen3.6-27B drafter gives +48% end-to-end decode over the model's own MTP heads, the 35B +26%, and gemma-4-31B-it 3.0× over no speculation — all in production use. Thank you.
Activity
olliehm commentedon Aug 2, 2026
Follow-up with the promised precision data — and it refutes our own quantization hypothesis.
Target-precision ladder (original drafter
6c7242c@ Q8_0, fixed ctx 16384, identical flags, 2 probes per rung, greedy-ish sampling):Flat across ~2 bits/weight of target precision. We also converted both drafter generations at F16 vs Q8_0 — no difference there either (retrain: 1.6% both; original: ~10% both).
So for this model, acceptance is pinned at ~8–9% (original) / ~2% (retrain) independently of quantization on either side. Given the 35B drafter holds 48–59% under the identical llama.cpp pipeline, this now looks like a semantic/numeric gap specific to this drafter–target pair under llama.cpp — e.g. some difference between the SGLang training-time feature extraction and mainline's
draft-dflashpath that only bites at this model's shape (48 layers / 3072 hidden / 8 extraction points), or something about how this drafter was produced.That makes question 2 from the original post the live one: is there anything llama.cpp's implementation should be doing differently for this drafter that wouldn't affect the 35B? And the training-recipe release would let us dig from the other end. Happy to run any diagnostic you'd find useful — we have the full rig standing (both drafter generations at two precisions, three target quants, b1297 llama.cpp, gfx1151).