What is a hybrid model?
A hybrid model mixes ordinary attention layers with recurrent layers, such as GatedDeltaNet or Mamba, that keep a running memory of the text instead of attending over every past token. Qwen3.5 and Qwen3.6 are hybrid; the Qwen3.8-27B we tested has 48 GatedDeltaNet layers and 16 attention layers. Not every Qwen model is hybrid: Qwen3-8B is a plain transformer, and with n-gram speculative decoding it showed no repeated tokens in our tests.
Is MTP speculative decoding in vLLM lossless?
It is meant to be, up to the small numerical differences that batching causes. The large accuracy loss we measured with MTP on vLLM 0.28 came from a bug in vLLM's V1 model runner. With the bug worked around or fixed, MTP-1 and MTP-3 matched the no-speculation baseline.
Which vLLM versions have the MTP bug?
The bug is in the V1 model runner. We measured it on vLLM 0.28.0, where the V1 runner is the default path for this model, and on 0.29.0 and 0.30.0 with the V1 runner. vLLM 0.31.0 and the main branch on 2026-10-06 contain the same code; we checked them by reading the code, not by running them. On those versions MTP reaches this code when it runs on the V1 runner: with VLLM_USE_V2_MODEL_RUNNER=0, when MTP is combined with a feature the V2 runner does not support yet, or on platforms without Triton. We did not test versions before 0.28. The V2 model runner, used by default for MTP on 0.30.0, did not show the bug.
What triggers the vLLM MTP repeated-token bug?
A hybrid model with recurrent layers (GatedDeltaNet or Mamba, for example the Qwen3.5 family), MTP speculative decoding, async scheduling and prefix caching (Mamba cache mode align), with several requests running so that batch rows move as requests finish and arrive. With one request at a time it does not show.
How do I work around it without patching vLLM?
On vLLM 0.28, add --no-async-scheduling or --no-enable-prefix-caching. Both removed the repeated tokens in our tests. Prefix caching off kept more of MTP's speed in our measurement but gives up prefix reuse. On 0.30.0, the version we measured, keep the default V2 model runner.
Is there a patch for the vLLM MTP bug?
Yes. Our tested patch is in our comment on vLLM's GitHub, with the reproduction. It changes one file, vllm/v1/worker/gpu_model_runner.py, and applies cleanly to vLLM 0.28.0, 0.30.0, 0.31.0 and main.
Is n-gram speculative decoding affected too?
n-gram has a separate bug with the same symptom on hybrid models. vLLM fixed it on its main branch on 2026-10-05, after 0.31.0 was released, and the fix passed our checks. Until a release includes it, leave n-gram off on these models.