DFlash 2: Keep Drafting Parallel

Aug 20, 2026 03:28 AM - 2 hours ago 1

August 18, 2026

Inference is the bottleneck of the supplier era. Agents read, plan, and call tools, often for hours aliases days. They devour tokens astatine a complaint chat never approached. Every 1 of those tokens takes a afloat guardant walk complete the model. At Inco AI, we are building the conclusion stack scaled to the token economics of tomorrow. This station is simply a sneak peek.

Our squad released DFlash successful January; it now runs successful SGLang, vLLM, TensorRT-LLM, and llama.cpp. NVIDIA measured up to 15× throughput with it connected Blackwell GPUs; Google reported 3× much tokens per second on TPUs; CoreWeave's accumulation Kimi K2.7 Code endpoint, the fastest for that exemplary connected Artificial Analysis, runs DFlash by default. The ecosystem now builds connected it: NVIDIA, Red Hat, and Modal person each published DFlash drafters; Meta (Muse Glimmer), Poolside (Laguna), Xiaomi (MiMo-V2.5-Pro), and NVIDIA (Nemotron 3.5 Lightning) ship charismatic drafters pinch their ain models. On Hugging Face, DFlash models have been downloaded more than 3.5 cardinal times (as of August 2026).

Speculative decoding is simply a halfway portion of the modern inference stack.1 A mini draught exemplary guesses a artifact of tokens, and the target exemplary verifies the full artifact successful 1 guardant pass. Good guesses turn 1 walk into respective tokens; bad ones conscionable get thrown away. For years, though, the draught itself stayed autoregressive: one token astatine a time. DFlash made it one-pass too: the full block, every position, predicted in parallel.

DFlash 2 drafting for Qwen3.8-27B connected an Apple M5 Max pinch oMLX, broadside by broadside pinch autoregressive decoding.

DFlash 2 pushes parallel drafting 1 measurement further: over 20% much output from every verification pass, for astir 1% added rhythm latency, pinch the output provably unchanged. Across benchmarks the summation runs 16–25%. With the Qwen3.8-27B drafter released today, SGLang serves astatine 2.7–3.4× the throughput of autoregressive decoding astatine batch size 1. Predicting every position independently leaves headroom successful 2 places: choosing the right tokens and holding accuracy to the extremity of the block. DFlash 2 recovers both without giving up the one-pass design.

Run It Now

DFlash 2 already runs successful the mainstream conclusion engines:

pip install "sglang[all] @ git+https://github.com/sgl-project/sglang.git#subdirectory=python" python -m sglang.launch_server \ --model-path Qwen/Qwen3.8-27B \ --speculative-algorithm DFLASH \ --speculative-draft-model-path incoai/Qwen3.8-27B-DFlash2 \ --speculative-num-draft-tokens 8
pip install -U "vllm @ git+https://github.com/vllm-project/vllm.git@refs/pull/52816/head" vllm serve Qwen/Qwen3.8-27B \ --speculative-config '{ "method": "dflash", "model": "incoai/Qwen3.8-27B-DFlash2", "num_speculative_tokens": 7 }'
git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp git fetch origin pull/27342/head:pr-27342 git switch pr-27342 # NVIDIA CUDA cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON cmake --build build -j # Apple Silicon cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_METAL=ON cmake --build build -j ./build/bin/llama-server \ -hf ggml-org/Qwen3.8-27B-GGUF:Q4_K_M \ -hfd incoai/Qwen3.8-27B-DFlash2-GGUF:Q4_K_M \ --spec-type draft-dflash \ --spec-draft-n-max 7

The Right Tokens Are Already There

DFlash predicts each position independently, successful parallel. Each prime is plausible connected its own. Yet thing makes them fresh together, and an incoherent artifact is trim short astatine verification. Recent methods specified arsenic Domino and DSpark bargain coherence pinch sequential heads that rewrite each position's full-vocabulary distribution. But is that costly autoregressive correction really necessary?

No. The grounds is already successful DFlash's ain campaigner lists. Take the first position: DFlash's apical prime is correct 85.4% of the time, but the right token is successful its apical 16 candidates 99.5% of the time. Even erstwhile the apical pick is wrong, the correct token is usually connected the list.

Metric0123456Acceptance length
Recall@185.4%80.3%79.4%78.3%77.5%75.9%72.9%4.27
Recall@1699.5%97.3%94.8%92.6%90.8%89.4%87.8%6.79
Table 1. Recall@1 (how often the apical prime is right) and Recall@16 (how often the correct token is successful the apical 16) astatine each draught position, conditioned connected each earlier position being right. Five-layer Qwen3-4B DFlash connected GSM8K. Acceptance magnitude includes the verifier's adjacent token.

An oracle that ever picks the correct campaigner from the apical 16 would lift the acceptance magnitude from 4.27 to 6.79. That spread is axenic selection headroom. We conscionable request to prime the correct way done the candidates.

Diffusionisgood⟨mask⟩⟨mask⟩⟨mask⟩Independent Top-1 Picksfor✗same word, twiceposition 1decodingspeculativeslow⋮position 2decodingthinkingmodels⋮position 3⟨eos⟩again…⋮all adjacent pairs scored astatine erstwhile → 1 way keptaccepted outputfor

target-decoded tokenmask tokenaccepted draftselected path

Figure 1. The selector successful 1 cycle. With DFlash alone, each position keeps its apical pick; present 2 neighbors some prime the aforesaid word, and the stutter dies astatine verification. DFlash 2 keeps each position's apical candidates, and the selector traces 1 coherent way done them; here, the full artifact survives.

A Lightweight Path Selector

Coherence is mostly local: a candidate's fresh depends chiefly connected the token just earlier it, truthful scoring neighboring pairs should beryllium enough. DFlash 2 keeps the apical 16 candidates astatine each position and scores each adjacent pair: for predecessor aa and existent campaigner bb,

St(a,b)=Ut(b)+⟨A(a)⊙H(ht),B(b)⟩.S_t(a,b)=U_t(b)+\langle A(a)\odot H(h_t),B(b)\rangle.

The people has 2 parts. The first, Ut(b)U_t(b), is DFlash's ain logit: how much the drafter already liked bb connected its own. The 2nd asks really well bb follows aa: AA and BB springiness each token a compact 256-dimensional embedding, and the 2 embeddings are matched nether a context gross H(ht)H(h_t) that decides which parts of the lucifer count. In essence, this is simply a low-rank bilinear attraction complete adjacent candidates.

Scoring stays afloat parallel. Every adjacent brace astatine each position is scored successful 1 shot, pinch nary other backbone aliases LM-head pass. The only sequential activity is the last locomotion complete precomputed scores: starting from the past verified token, greedy follows the champion successor astatine each step, sampling draws from the aforesaid scores, and rejection sampling restores the exact target distribution.

MethodParamsLatencyT = 0T = 1
DFlash4.273.78
+ DSpark correction+77.8M+9.6%4.494.08
+ way action (ours)+2.0M+0.6%4.614.25
Table 2. Acceptance magnitude pinch way action unsocial (no convolution), for five-layer Qwen3-4B connected GSM8K. Overheads are comparative to plain DFlash: parameters added to the drafter, and added draft–verify rhythm latency.

The selector improves DFlash by 0.34 tokens astatine T=0T=0 and 0.47 at T=1T=1. It thumps the DSpark correction successful some settings pinch astir 40× fewer parameters and 16× little latency overhead. Choosing is cheaper than predicting. And location is still room: the oracle reaches 6.79. Pairwise scoring is the simplest selector we could deliberation of, and we judge there is plentifulness to explore.

Suffix Decay Is a Local Problem

We besides noticed both callback rows above diminution toward the extremity of the block. Even the oracle decays: pinch cleanable selection, accuracy still falls from 99.5% astatine the first position to 87.8% by the last. No selector tin fix that, because the candidates themselves are moving out. We telephone this suffix decay, and it is simply a backbone problem.

One fishy is capacity: a five-layer backbone whitethorn beryllium excessively mini to preserve limitations crossed the block. If that is right, extent should help astir astatine later positions. And it does! 3-, 5-, and 15-layer DFlash models are almost identical astatine the first position, and instrumentality isolated down the block. But extent is indiscriminate: ten extra attraction blocks adhd capacity everywhere, moreover astatine the early positions that had small near to gain, and erase overmuch of the efficiency that makes DFlash attractive.

Figure 2. Qwen3-4B Recall@1 connected GSM8K astatine T=0, conditioned connected each earlier position being right. All drafters are trained nether the aforesaid setup; the convolutional exemplary is evaluated without the selector. Its convolutions adhd 3% parameters and 0.7% rhythm latency; the 10 other layers of 15L adhd 15.2%.Draft position0123456DFlash 3LDFlash 5LDFlash 15L (3× much params)DFlash 5L + conv (+3% params)
85.21%79.26%77.18%75.75%73.96%70.4%64.97%
85.39%80.31%79.39%78.27%77.39%76.03%72.86%
86.42%81.61%80.68%80.34%80.59%79.66%78.73%
85.83%80.94%79.98%79.68%79.73%79.43%77.61%
Figure 2. Qwen3-4B Recall@1 connected GSM8K astatine T=0, conditioned connected each earlier position being right. All drafters are trained nether the aforesaid setup; the convolutional exemplary is evaluated without the selector. Its convolutions adhd 3% parameters and 0.7% rhythm latency; the 10 other layers of 15L adhd 15.2%.

We want a targeted fix, and DFlash's attraction shows where. It has two jobs: publication the discourse earlier the block, and exemplary the dependencies inside. But it spends little and little connected the second: the block's share of attraction falls from 30% successful Layer 1 to 8% successful Layer 5, and what remains concentrates successful a shrinking fistful of heads. So we divided the jobs: a dedicated module takes the within-block work, and attraction keeps reading the context.

1

4

8

12

16

20

24

28

32

Layer 1

Layer 2

Layer 3

Layer 4

Layer 5

Attention head

0%90% within-block mass

Heatmap dataAttention head1234567891011121314151617181920212223242526272829303132Layer 1Layer 2Layer 3Layer 4Layer 5
17.6%2.9%41.4%50.8%29.2%50.5%44.6%5.9%44.5%11.3%17.9%36.7%0.0%14.2%0.1%0.0%13.3%1.5%18.7%7.6%45.0%33.5%53.1%42.2%64.3%60.1%32.8%47.7%49.6%57.0%26.0%52.9%
20.8%26.4%39.6%18.9%8.9%22.6%13.1%32.1%22.9%25.1%24.2%28.6%36.6%26.1%41.0%36.1%17.8%25.5%25.7%25.6%4.3%21.8%23.3%22.1%15.6%70.9%58.0%2.7%28.3%38.5%20.3%33.5%
1.8%11.0%9.5%5.2%34.8%8.4%12.1%14.4%11.8%22.0%8.8%3.7%4.9%10.6%17.7%52.0%4.4%19.0%13.1%9.9%61.3%76.1%47.0%60.3%1.4%8.9%6.0%64.1%9.4%3.3%8.3%8.3%
0.4%37.7%28.3%85.5%0.3%1.5%0.4%0.5%1.2%12.5%36.6%1.2%1.7%0.6%2.5%1.3%7.2%3.1%48.9%3.8%3.2%1.0%23.8%1.0%0.1%0.1%0.2%0.3%2.8%6.7%12.9%12.3%
1.5%0.2%0.6%0.1%60.2%76.0%0.9%0.0%0.2%12.3%32.3%0.1%15.8%0.5%0.5%0.5%0.2%0.1%0.6%0.2%0.3%28.1%0.2%1.3%0.1%0.1%0.2%29.9%0.1%0.1%0.1%1.2%
Figure 3. Within-block attraction by caput successful five-layer Qwen3-4B DFlash. Brighter cells people heads that walk much attraction connected the draught block; successful later layers the within-block wide shrinks and concentrates successful a fewer heads.

A Lightweight Local Convolution

The within-block activity is short-range to statesman with: a artifact spans only 4 to 16 tokens, and the tightest limitations beryllium betwixt neighbors. The natural usability is simply a short convolution: 2 taps, 1 connected the current position and 1 reaching 1 position back, pinch weights that accommodate to the content. Following Canon Layers, Dynamic Short Convolutions, and Convolution for Large Language Models, we insert this two-tap move depthwise convolution earlier and aft each attention and feed-forward sublayer:

Conv⁡k(x)t=kt,0⊙xt+kt,1⊙xt−1.\operatorname{Conv}_{k}(x)_t =k_{t,0}\odot x_t+k_{t,1}\odot x_{t-1}.

Each coefficient combines a learned guidelines kernel pinch a mini correction computed from the existent hidden state; each 16 channels stock one correction. The first position sounds the past verified token's representation, and each later position sounds its predecessor's. Information crosses the artifact while each positions still compute in parallel.

×5 layersAttentionMLP…Inside 1 conv — each position takes 2 tapsxConv(x)verifiedpos 1pos 2pos 3pos 1pos 2pos 3k₁ · the predecessork₀ · itself

two-tap convlast verified tokendraft positions

Figure 4. The two-tap move convolution. One sits earlier and aft each attraction and MLP sublayer of each drafter layer. Inside it, each position mixes its ain practice pinch its predecessor's, and the first position sounds the past verified token.

The convolution is block-local and stateless, truthful it drops into DFlash without changing attention, the LM head, aliases verification.

With only 16.5M added parameters (3%), five-layer DFlash with convolution comes adjacent to 15-layer DFlash, substantially reducing suffix decay. The convolutions adhd 0.7% to draft–verify cycle latency; 10 much Transformer layers adhd 15.2%. Average within-block attention crossed Layers 4 and 5 besides falls from 9.4% to 0.5%, consistent pinch the convolution absorbing the section activity while attention goes backmost to reference the context. A kernel reaching 1 position back recovers astir of what 10 other layers buy: suffix decay is mostly a local problem.

Putting It Together

So far, the selector and the convolution person been measured separately; the afloat comparison below puts them together. We trained the DFlash and DSpark drafters ourselves nether matched setups, while MTP ships with the model.

Qwen3.5-4B

DatasetMTPDFlashDSparkDFlash 2
GSM8K4.784.995.696.20
MATH-5005.045.426.206.76
HumanEval4.845.435.806.28
MBPP4.164.494.965.41
MT-Bench3.904.264.775.20
Mean4.544.925.495.97
Table 3. Qwen3.5-4B per-request mean acceptance length. Sampling: reasoning enabled, somesthesia 1.0, top-p 0.95, top-k 20, beingness punishment 1.5, pinch lossless rejection sampling.

DFlash 2 leads connected each benchmark. Averaged crossed them, it gains 1.05 tokens complete DFlash (21%) and 0.48 complete DSpark. The upgrade stays cheap: the selector and the convolution together adhd only 1.3% to the five-layer DFlash draft–verify rhythm latency.

On MATH-500, the summation is visible position by position: DFlash 2 holds dependable adjacent 86% to the past position, and each baseline ends the artifact 6 to 9 points beneath it.

Figure 5. Qwen3.5-4B conditional acceptance complaint connected MATH-500, aforesaid sampling arsenic above.Draft position01234567891011121314MTPDFlashDSparkDFlash 2
84.57%80.23%79%78.42%78.63%78.17%77.36%77.74%77.91%76.96%78.06%77.4%77.49%77.48%77.85%
88.35%77.7%77.8%79.45%80.3%81.12%81.22%81.07%81.29%80.28%80.64%80.29%79.56%78.77%77.48%
87.24%84.59%83.79%83.63%83.6%83.27%82.97%82.54%82.21%82.39%81.58%80.7%81.35%80.57%79.86%
88.3%85.3%84.98%84.88%85.41%85.3%85.36%85.13%85.95%85.99%86.41%86.46%86.43%86.02%86.48%
Figure 5. Qwen3.5-4B conditional acceptance complaint connected MATH-500, aforesaid sampling arsenic above.

Two Drafters, Out Today

We are releasing 2 DFlash 2 drafters today: one for Qwen3.8-27B and one for Meta's Muse Glimmer. For Qwen3.8-27B, we comparison against the model's autochthonal MTP way and a community DSpark drafter.

Qwen3.8-27B

DatasetMTPDSparkDFlash 2
GSM8K5.024.365.46
MATH-5004.723.925.28
HumanEval3.913.304.39
MBPP3.993.514.79
MT-Bench3.743.014.10
Mean4.283.624.80
Table 4. Qwen3.8-27B per-request mean acceptance magnitude pinch the model's default sampling and a artifact size of 8, against its autochthonal MTP way and a organization DSpark drafter.

For Meta's Muse Glimmer, we comparison against the charismatic DFlash drafter shipped pinch the exemplary and a community DSpark drafter.

Muse Glimmer

DatasetDFlashDSparkDFlash 2
GSM8K5.435.456.57
MATH-5005.395.016.56
HumanEval4.114.335.66
MBPP3.744.025.30
MT-Bench3.523.594.42
Mean4.444.485.70
Table 5. Muse Glimmer per-request mean acceptance magnitude pinch the model's default sampling and a artifact size of 16. DFlash is the charismatic drafter Meta ships pinch the model; DSpark is simply a organization drafter.

The margins are wide: connected some models, DFlash 2 averages much than a afloat token up of DSpark. It besides thumps each model's official drafter, MTP connected Qwen3.8-27B and DFlash connected Muse Glimmer. That translates into 2.7–3.4× the throughput of autoregressive decoding on Qwen3.8-27B, and 3.1–4.6× connected Muse Glimmer. The model cards break the speedups down by task and concurrency.

The Bottom Line

An supplier writes successful an day what a chatbot writes successful a month, and decoding sits nether each 1 of those tokens. DFlash 2 decodes at close to 3× the velocity of autoregressive decoding, astir a 3rd of the compute per token, pinch the aforesaid output.

In 7 months, DFlash went from our insubstantial to an manufacture standard, with much than 3.5 cardinal downloads. Inside the aforesaid design, DFlash 2 decodes 1 much afloat token per pass, for free. That is only 1 constituent of the serving stack. Inference is obscurity adjacent its floor.

At Inco AI, we are building an end-to-end serving stack to support pushing that floor lower. DFlash 2 is the first piece. Two drafters are retired today on Hugging Face.

If you service agents astatine standard and want to measure DFlash 2 successful your stack, or want a drafter for a exemplary you run, including your ain fine-tunes, write to us: [email protected].

We are besides hiring. If you want to thief build this stack, scope retired to us.

Connect the candidates. Keep drafting parallel.

Get updates

One email erstwhile we vessel thing new.

We will ne'er stock your email address.

Citation

Please mention this station as:

@misc{inco2026dflash2, title = {{DFlash 2: Keep Drafting Parallel}}, author = {{Inco AI}}, year = {2026}, month = {August}, url = {https://inco.ai/blog/dflash2/} }
More