Software engineer / Miami, FL

Writing

Field note · llama.cpp

The Qwen3.8-Flash-Next MTP head was missing from the August 26 GGUFs

On August 26, the converter disabled MTP export and the architecture lacked its inference path. This historical field note now links to the August 28 follow-up, which documents working speculative decoding using a third-party head, a draft PR, and a local GGUF graft.

Hardware
NVIDIA DGX Spark · GB10 (SM121) · aarch64 · 128 GB unified
Software
llama.cpp master @ 5e6a37cb1 + PR #27742 (branch qwen4exp-27742) · unsloth/Qwen3.8-Flash-Next-GGUF UD-IQ4_XS

Update — September 12, 2026

The limitation below describes my August 26 setup. By August 28, I had working speculative decoding using a third-party MTP head, the graph from draft PR #27836, and a local GGUF graft. The follow-up essay documents that experiment, including the tensor-name fix and remaining caveats. At the time of that experiment, neither upstream change was in master.

The original August 26 account is preserved below. References to "today" and outstanding work describe that investigation.

What the card promises versus what ships

The Qwen3.8-Flash-Next model card advertises "MTP: 1 layer, trained with multi-steps" — a 4B multi-token-prediction head. Every other Qwen model on this host runs speculative decoding off exactly this kind of head. This one can't, today.

The decisive evidence

The tell isn't a missing metadata key — it's the PR's own converter, conversion/qwen4exp.py:

# the MTP block is a separate draft head; vLLM drops it too
supports_mtp_export = False
no_mtp = True

That's a decision the converter makes on purpose, not an oversight. It lines up with everything else: the GGUF carries no nextn_predict_layers key, the repository publishes nothing but its seven quant directories plus .gitattributes and README.md — no separate mtp-*.gguf anywhere — and no DFlash or DFlash2 drafter exists for qwen4exp at all.

Two changes, not one

Even if Unsloth exported the head tomorrow, that alone wouldn't be enough. src/models/qwen4exp.cpp has zero references to nextn anywhere in it. The generic blk.%d.nextn.* plumbing already exists in llama-arch.cpp for other architectures, but nothing in this architecture's own code drives it. Exporting the weights and wiring the inference path are two separate pieces of upstream work, and both are outstanding.

Where I got this wrong the first time

My initial "no MTP" call rested on a missing metadata key plus a repository listing I'd truncated with head -40. Neither actually ruled it out. Read the converter, not the symptoms.

Status
workaround
First seen
August 26, 2026
Updated
September 12, 2026

Have a thought about this?

Questions, corrections, and your own experience are welcome. Reply by email

All writing
  • Field note

    GGML_ASSERT(layer.nextn.hc_head_norm) — two MTP pull requests disagree about one tensor name

    A published Qwen3.8-Flash-Next MTP head loads against PR #27739 and aborts against PR #27836 with "MTP block missing nextn.hc_head_norm". The head is not damaged and no tensor is missing: the same three hyper-connection tensors are exported as top-level output_hc_norm/down/up by one PR and expected as blk.N.nextn.hc_head_norm/down/up by the other, because a standalone head file has no trunk to collide with and a grafted head does. The published merge script filters to blk.* and silently drops all three. Rename them instead of dropping them.

  • Essay

    I grafted a speculative decoding head into a 90 GB model file

    The model card advertised a 4B multi-token-prediction head. No published GGUF contained it, and the architecture had no code path to run it. Both halves arrived within 36 hours from two different strangers, in incompatible forms — so I merged the head into the target file myself. It went from 27.75 to 43.30 tok/s, and three of my four mistakes along the way were about verification, not tensors.