---
title: "One drafter, two engines"
date: 2026-09-03
series: 21
summary: "The same speculative decoder landed in vLLM and llama.cpp in the same week. When two engines that agree on almost nothing both merge it, I read the PRs."
voice: builder
tags: [dflash2-drafting, block-diffusion-drafter, candidate-selector, draft-head-per-model, spec-decode-acceptance]
image: "/notes/dflash2-cross-engine/image.png"
imageAlt: "Comparison card: vLLM Qwen3.8-27B on one H200, autoregressive 64 versus DSpark 179 versus DFlash2 225 output tokens per second single stream"
linkedin: "urn:li:share:7501142535424270336"
sources:
  - title: "DFlash 2: Keep Drafting Parallel, Inco AI blog"
    url: https://inco.ai/blog/dflash2/
    date: 2026-08-18
  - title: "vLLM engine implementation, local convolution + candidate selector"
    url: https://github.com/vllm-project/vllm/pull/52816
    date: 2026-08-21
  - title: "llama.cpp implementation and benchmarks"
    url: https://github.com/ggml-org/llama.cpp/pull/27342
    date: 2026-08-27
  - title: "Speculators training support (experimental)"
    url: https://github.com/vllm-project/speculators/pull/1006
    date: 2026-08-27
dateApprox: false
---

The same speculative decoder landed in vLLM and llama.cpp in the same week. When two engines that agree on almost nothing both merge it, I read the PRs.

DFlash2 (Inco AI and Z Lab, August 18) drafts a whole block of tokens in parallel with a small block-diffusion model, then fixes the part that made parallel drafting weak: a grouped depthwise convolution lets late positions in the block see earlier ones, and a candidate selector walks the best path through each slot's top-K instead of taking independent argmaxes. Cost, per the PRs: about 18M extra parameters and under 1% of each serving step.

PR-stated numbers, benchmark your own. vLLM, Qwen3.8-27B on one H200: 64 to 225 output tok/s single stream, still 2.2x at concurrency 32, acceptance 5.3 tokens per step against 4.3 for DSpark. llama.cpp, same model at Q4_K_M on an Apple M5 Pro: 10.4 to 18.9 tok/s.

Before you upgrade llama.cpp, read the merged PR: vision requests still break with the drafter attached, tensor-parallel crashes went to a follow-up PR, the maintainer marked every Vulkan benchmark in the thread invalid, and GGUFs converted before August 27 need reconverting.

The trap: the draft head is trained per target model, and the training recipe is unpublished. Official heads exist for two models today, and the open reimplementation labels itself experimental.

Check z-lab and RedHatAI on Hugging Face for a head for your model before you plan capacity around these numbers.
