Qwen3.5 122B DFlash2 Drafter (block 12)
DFlash2 speculative-decoding drafter for Qwen/Qwen3.5-122B-A10B-FP8, trained for
long-context software-engineering and agentic traffic and tuned for sampling at T=1.
The target model is unchanged. The drafter only proposes tokens and the target verifies
every one, so correctness is unchanged.
- Architecture:
DFlash2DraftModel, block size 12, 6 layers, 8 target taps[1,7,14,20,26,32,39,45] - Draft window: 8192 (
sliding_windowinconfig.json) - Weights: BF16 (
model.safetensors, ~1.86 GB, ~930M parameters) - Warm start: z-lab's DFlash checkpoint for Qwen3.5-122B-A10B, with the DFlash2 path selector and depthwise convolution taps added
- Training data: 47,440 requests drawn from 31,214 open-source SWE-agent trajectories. For
each request the Qwen3.5-122B target wrote the final assistant turn itself at
T=1, and the drafter trained on the target's hidden states over that history and generation - Training: one pass, loss DPAL-CE-TV, LR 1e-4 with warmup and cosine decay, checkpoint at step 5100 of 5,616 planned
Results
MLCommons agentic SWE traces, all 15,777 turns, T=1, batch size 1, H200 TP2, stock SGLang
v0.5.21 with the target in FP8:
| Method | Mean tok/s | Mean accepted tokens per step |
|---|---|---|
| This drafter (DFlash2, block 12) | 561.9 | 5.19 |
| Qwen native MTP, 7 draft tokens | 474.0 | 4.71 |
| Qwen native MTP, 3 draft tokens (default) | 398.8 | 3.24 |
| z-lab DFlash (block 16, window 4096) | 257.2 | 3.45 |
The gain over MTP-7 holds in every prompt-length bin from under 32K to over 128K tokens. The training set contains no MLCommons data (0 repo hits, 0 text hits).
Background and the full set of tables: We trained a diffusion drafter for Qwen3.5 122B.
Serving
Download the target and this drafter, then start SGLang with two GPUs:
hf download Qwen/Qwen3.5-122B-A10B-FP8 --local-dir /data/models/Qwen3.5-122B-A10B-FP8
hf download coral-bricks-ai/qwen35-122b-dflash2-drafter --local-dir /data/models/qwen35-122b-dflash2-drafter
docker run -d --name qwen35-122b-drafter \
--gpus all --ipc=host --shm-size 32g --network host \
-v /data:/data \
lmsysorg/sglang:v0.5.21-cu130 \
python3 -m sglang.launch_server \
--model-path /data/models/Qwen3.5-122B-A10B-FP8 \
--served-model-name qwen3.5-122b-a10b \
--host 0.0.0.0 --port 30000 --tp-size 2 \
--mem-fraction-static 0.85 \
--context-length 262144 \
--reasoning-parser qwen3 \
--attention-backend fa3 \
--speculative-algorithm DFLASH \
--speculative-draft-model-path /data/models/qwen35-122b-dflash2-drafter \
--speculative-draft-attention-backend fa3 \
--speculative-draft-model-quantization unquant \
--speculative-dflash-block-size 12
The block size is set on the server (--speculative-dflash-block-size 12), and the sliding
window is read from the drafter's config.json.
Files
model.safetensors: BF16 weightsconfig.json: DFlash2 config (block 12, taps, mask token 248077, window 8192)