Contextual Correction of Parallel Drafts for Speculative Decoding

We introduce DCOCO (DFlash Contextual Corrector), a lightweight mechanism that restores the dependencies between drafted tokens that parallel drafters give up, while keeping drafting parallel.

Authors

Roy Eisenstadt1,2
Harel Lidar1
Tal Gonen1
Omer Luxembourg3
Itamar Zimerman1
Lior Wolf2
Eli David1
Ilan Naiman1

Affiliations

1Stealth Startup, Tel Aviv
2Tel Aviv University
3Ben-Gurion University

Published

Oct. 8, 2026

The full paper is on arXiv: arxiv.org/abs/2610.12570.

Code, a ready-to-serve vLLM image and the evaluation suite: github.com/two-delta/DCOCO. Drafters for Qwen3-4B and Qwen3-8B: huggingface.co/TD-Labs.

The bottom line

Figure 1. The same completion, typed at each method's measured speed. Pacing is the per-stream throughput the paper reports on LiveCodeBench for Llama-3.1-8B (thinking off, greedy, concurrency 1, one B200; Table 10), where DCOCO reaches 1,448.8 tok/s against 1,050.5 for the runner-up. The code is an illustrative HumanEval/32 solution, not a timed HumanEval run. Speculative decoding preserves the target model's output distribution, so every column produces the same text; only the wait differs.

Across four verifier backbones and ten benchmarks, DCOCO achieves the highest average throughput in every evaluated configuration: greedy and stochastic decoding, with and without extended reasoning. It reaches speedups of up to 6.6× over vanilla decoding, and its best average speedup is 8–19% above the strongest competing method in each configuration.

Its advantage persists under concurrent serving. DCOCO outperforms the strongest competing method by 6–23% across 4–32 concurrent requests, while the sequential correctors fall below uncorrected DFlash at these loads.

VerifierThinkingDFlashDominoDSparkDCOCO
Qwen3-4Boff2.98× / 2.52×3.27× / 2.71×2.66× / 2.28×3.62× / 2.95×
Qwen3-4Bon2.08× / 1.87×2.17× / 1.93×1.85× / 1.69×2.38× / 2.12×
Qwen3-8Boff2.95× / 2.45×3.16× / 2.53×2.88× / 2.37×3.62× / 2.87×
Qwen3-8Bon1.95× / 1.78×1.97× / 1.79×1.83× / 1.68×2.26× / 2.03×
Qwen3-Coder-30B-A3Boff1.89× / 1.67×1.94× / 1.67×1.84× / 1.62×2.31× / 1.98×
Llama-3.1-8Boff3.03× / 1.75×3.24× / 1.79×3.01× / 1.65×3.75× / 1.93×
Table 1. Average speedup over vanilla decoding across the ten evaluation suites, T=0 / T=1. Concurrency 1, one B200 per system; every drafter is trained on the same corpus with the same five-layer backbone and served on the same vLLM stack. Per-suite throughput and accepted lengths are in the paper's appendix.

DCOCO costs a few percent of the drafting cycle, ships as drafters for Qwen3-4B and Qwen3-8B, and runs in vLLM: vllm serve is all it takes.

How was this made possible?

Speculative decoding accelerates inference by having a lightweight drafter propose several future tokens, which the target model then verifies together. Verification preserves the target model's output distribution, so the benefit of a drafter is entirely in the speedup it delivers, and that depends on two things: how many drafted tokens are accepted, and how long drafting takes.

Parallel diffusion drafters such as DFlash cut drafting latency by proposing a whole block in a single forward pass. That parallelism has a price. Tokens within a draft block are predicted without access to the realized identities of the tokens before them, so individually plausible predictions can combine into an incoherent continuation. A drafter that assigns probability to both “New York” and “San Diego” may emit “New Diego”.

Two recent methods, DSpark and Domino, recover these dependencies by adding a small sequential module that runs position by position. They recover acceptance, but the recurrence sits on the critical path of every drafting cycle. Our question was whether intra-block dependencies can be restored without reintroducing a sequential module. Two observations say they can.

The drafter has usually already suspected the right token

We recorded DFlash's candidates during speculative decoding and measured top-k coverage: how often a slot's k highest-scoring candidates contain the token the verifier eventually commits. On Qwen3-8B, the top-16 candidates contain the verifier's token at 59% of the slots where the top-1 is wrong. The gap widens deeper into the block: at the last slot, top-16 coverage stays above 0.60 while top-1 falls below 0.16.

Two line charts. Left: top-k coverage for Qwen3-8B falls with slot depth, much faster for top-1 than top-16. Right: the top-16 minus top-1 gap grows from about 0.12 to 0.45 across slots for all four verifiers.
Figure 2. Candidate coverage gains grow deeper in the block. Fraction of slots where DFlash's top-k candidates contain the verifier's committed token. (a) Qwen3-8B; shading marks the top-16 vs. top-1 gap. (b) The same gap across verifiers.

The drafter does not lack the right tokens; it fails to select them. Correction can therefore be cast as re-selection among the drafter's existing candidates, not generation of new tokens. And re-selection over K candidates per slot reduces to scoring K² transitions between adjacent slots, all of which can be computed at once.

Verification only rewards the prefix

The verifier judges the draft left to right and stops at the first rejection. A corrected token at slot 5 standing behind a rejection at slot 1 is never even examined. An improvement deep in the block is only worth something if everything before it is accepted, so correction should prioritize the early prefix rather than optimize a score over the whole block.

DCOCO: re-select, don't regenerate

DCOCO operates on a single DFlash pass. Rather than committing to the top prediction at each slot, it keeps the top-K candidates, scores how well each candidate fits each candidate in the next slot, and then picks the draft with a prefix-first walk. It plays below; click a step to jump to it.

DCOCO re-selects tokens within a grid of draft candidates

Figure 3. Interactive walkthrough of one drafting cycle. Tokens and scores follow the paper's illustrative example (Figure 2 of the paper); rows keep draft rank until re-selection.

Scoring every transition in parallel. For each pair of adjacent slots, DCOCO assigns every transition from candidate a at slot p to candidate b at slot p+1 a score: the successor's own draft logit plus a learned correction.

Sp(a, b) = ℓp+1(b) + Δθ( sp, zpa, zp+1,b, ℓp(a), ℓp+1(b) )

Here z is a candidate representation that fuses the candidate's token embedding with its slot's hidden state, sp is a pair state computed once from the two slots' hidden states and reused across all K² transitions, and Δθ is a shared two-layer MLP. The corrector reads only what the single DFlash pass already produced (hidden states, candidate ids and logits), and all (B−1)K² scores are computed in one batched operation. Its output layer is zero-initialized, so before training every score reduces to the drafter's own logit and DCOCO reproduces the original draft exactly.

Prefix-first selection. Maximizing the sum of transition scores over the whole block would let a strong late transition compensate for a weak early one, even though late tokens only count if the prefix survives. DCOCO instead keeps the drafter's top candidate at the first slot and walks left to right, taking the highest-scoring successor of the token it just chose:

k1 = argmaxk ℓ1(k),    kp+1 = argmaxb Sp(kp, b)

This mirrors the way verification consumes a draft: front to back, stopping at the first miss. The walk costs O(BK) on top of the O(BK²) batched scoring pass. Only this lightweight selection is sequential; neural scoring stays parallel. Unlike DSpark and Domino, no learned module runs position by position.

Architecture diagram. (a) One DFlash pass feeds candidate representations and pair states into a shared MLP that scores all candidate pairs in parallel. (b) Prefix-first selection walks the scored grid, turning 'These key is missing' into 'These keys are missing'.
Figure 4. DCOCO: parallel scoring, prefix-first selection. (a) One DFlash pass supplies slot states, candidate ids and logits; candidate and pair representations feed a shared MLP that computes all residual scores in parallel. (b) Starting from the first slot's draft argmax, selection follows the best transition from each chosen predecessor. Tokens and scores are illustrative.

Training. The drafter and corrector are trained jointly, starting from a six-epoch DFlash checkpoint and training six more epochs with the corrector. Labels are the verifier's own argmax tokens at adjacent slots, and the correction loss is exponentially down-weighted with slot depth, matching the prefix structure of verification.

Where the speed comes from

Throughput is the number of tokens committed per verification cycle divided by the time a cycle takes, so a method can gain on either axis. DCOCO gains on both. Against the strongest baseline on Qwen3-8B, it accepts 7–8% longer prefixes and runs 6% shorter cycles, which multiply to a 13–15% throughput gain. Relative to the uncorrected drafter, it pays 3–4% per cycle for 18–27% longer accepted prefixes.

We report end-to-end tokens per second as the primary metric, not accepted length alone. A corrector can raise accepted length while losing wall-clock time to its own scoring cost, and only throughput exposes that trade. Every design constraint above (the small corrector width, the single batched scoring pass, the O(BK) walk) exists in service of it.

It holds up under load

Serving systems batch concurrent requests, so we measured aggregate throughput from 4 to 32 concurrent streams. DCOCO is fastest at every concurrency, with margins over the strongest alternative reaching 23% under greedy decoding and 18% under sampling, and still 19% and 12% at 32 streams. Domino and DSpark keep their accepted lengths but progressively lose their throughput advantage, and both become slower than uncorrected DFlash at the highest concurrency as their per-position overhead outweighs the benefit. DCOCO stays ahead of DFlash throughout.

Bar charts of throughput at 4 to 32 concurrent streams for greedy and sampled decoding; DCOCO is highest at every point. A line chart shows DCOCO's margin over the second-best method between 12% and 23%.
Figure 5. At high concurrency, DCOCO achieves the highest throughput, while Domino and DSpark fall below DFlash. Qwen3-8B, thinking off, averaged over all ten suites: throughput at (a) T=0 and (b) T=1; (c) DCOCO's relative gain over the strongest baseline at each concurrency.

What matters inside the corrector

Absolute speedups follow the drafter's base acceptance. With thinking off, math and code reach 3.7–6.1× while open-ended chat stays at 1.8–1.9×.

Try it

DCOCO runs in vLLM through the speculative-decoding dflash method; the corrector is selected from the checkpoint's architecture. Build the image, which adds DCOCO to the official vllm/vllm-openai:v0.31.0 release:

git clone https://github.com/two-delta/DCOCO.git && cd DCOCO
docker build -t dcoco:vllm-v0.31.0 docker/

Serve a drafter with its target model; vLLM downloads both from Hugging Face:

docker run --gpus '"device=0"' --ipc=host -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface -e HF_TOKEN \
  dcoco:vllm-v0.31.0 Qwen/Qwen3-8B \
  --speculative-config '{"method": "dflash", "model": "TD-Labs/Qwen3-8B-DCOCO", "num_speculative_tokens": 15}'

Then query it like any OpenAI-compatible server. Released drafters: TD-Labs/Qwen3-8B-DCOCO and TD-Labs/Qwen3-4B-DCOCO, both with block size 15. To reproduce the paper's ten-suite evaluation against a running server, use scripts/benchmark.py in the repository.

Limitations

The takeaway

Parallel block drafters leave two things on the table: their top-K lists hold the right token far more often than their top-1 choice, and the identity of each drafted token is information no other slot ever gets to use. DCOCO is built on exactly these two facts. It reads only what the drafter already produced, scores every transition between adjacent candidates in parallel, and then greedily takes the best transition at each step, the way verification consumes a draft. Correction, made cheap enough, is pure profit for speculative decoding.

Acknowledgements

DCOCO builds on DFlash, and we compare against Domino and DSpark. Our evaluation prompts come from DeepSpec and NVIDIA's SPEED-Bench, and serving is built on vLLM. We thank their authors and maintainers.

Citation

You can cite this post or the paper with the following:

BIBTEX
@misc{eisenstadt2026contextualcorrectionparalleldrafts,
  title         = {Contextual Correction of Parallel Drafts for Speculative Decoding},
  author        = {Roy Eisenstadt and Harel Lidar and Tal Gonen and Omer Luxembourg and Itamar Zimerman and Lior Wolf and Eli David and Ilan Naiman},
  year          = {2026},
  eprint        = {2610.12570},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CL},
  url           = {https://arxiv.org/abs/2610.12570}
}