On the SPOT: Enhancing Speculative Decoding for Diffusion Language Models via Commit-Order Prediction
Organizations: Technion – Israel Institute of Technology · INSIGHT Lab, School of Electrical and Computer Engineering, Ben-Gurion University of the Negev
Abstract
Diffusion language models (DLMs) promise parallel text generation, but in practice face an unresolved speed-quality trade-off. Exact decoding fills in only one masked position per model pass, while faster multi-token decoding schemes are lossy. Speculative decoding is the standard lossless acceleration for autoregressive models. However, it does not transfer directly to DLMs, which must choose both what to generate and where. We show that this order is the missing piece: the model's own predictions from the previous pass already give the right token at 92-100% of positions, but not which position comes next. Based on this observation, we introduce Speculating Positions Order Trajectory (SPOT), which learns to predict this order. A 0.62M-parameter model reads only the target's output distributions and proposes a tree of candidate continuations, and the target verifies all of them in a single pass by checking whether each equals its own next state. On the verification side, our analysis shows that prior block-diffusion verification approaches either assume or a sequential proposal interface. To support tree-based speculation at any temperature, we propose using coupled-noise match verification for diffusion blocks, following shared-Gumbel-noise coupling approaches. Our comprehensive experiments show that SPOT cuts target passes by up to 6.8x and reaches up to 3.2x the throughput of standard decoding, beating the calibrated and training-free drafting baselines in every task and budget at and . In addition, we show that the learned drafter transfers across models, demonstrating successful transfer across six different DLMs. Project page: https://eliezer318.github.io/SPOT-dLLM/
Figures & tables
| draft-free ( ) | SPOT NFE (tok/s ratio) | greedy SPOT | Spiffy NFE | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| acc | argmax | mean | coupled | uncoupled | greedy † | acc | argmax | coupled | uncoupled | |
| 0.5 | 0.35 | 0.986 | 0.993 | 58.2 (2.56) | 58.2 (2.57) | 57.6 (2.57) | 0.36 | 0.978 | 84.3 | 84.0 |
| 1.0 | 0.34 | 0.976 | 0.965 | 60.1 (2.45) | 60.2 (2.43) | 56.8 (2.55) | 0.38 | 0.973 | 86.3 | 86.6 |
| 1.5 | 0.08 | 0.866 | 0.828 | 74.0 (1.97) | 82.6 (1.77) | 57.4 (2.55) | 0.28 | 0.958 | 94.2 | 108.9 |
| 2.0 | 0.00 | 0.057 | 0.052 | 187.4 (0.78) | 256.7 (0.54) | 94.7 (1.52) | 0.01 | 0.750 | 114.6 | 258.5 |
| 2.5 | 0.00 | 0.001 | 0.000 | 200.8 (0.71) | 269.1 (0.54) | 128.1 (1.13) | 0.00 | 0.582 | 110.5 | 269.2 |
| NFE ( tok/s ) | GSM8K | MBPP | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|---|---|
| method | ||||||||
| acc. 0.89–0.90 | acc. 0.41–0.43 | acc. 0.74–0.74 | acc. 0.11–0.11 | |||||
| no draft ( ) | 270.8 ( 1.00 ) | 269.2 ( 1.00 ) | 271.4 ( 1.00 ) | 271.8 ( 1.00 ) | ||||
| SPOT (ours) | 69.6 ( 2.50 ) | 52.6 ( 1.56 ) | 56.7 ( 2.61 ) | 39.6 ( 1.72 ) | 62.2 ( 2.74 ) | 44.6 ( 1.85 ) | 84.5 ( 2.03 ) | 66.0 ( 1.20 ) |
| SPOT- (ours) | 75.1 ( 2.76 ) | 67.8 ( 2.78 ) | 60.7 ( 2.98 ) | 47.8 ( 2.99 ) | 66.5 ( 3.09 ) | 56.4 ( 3.13 ) | 92.2 ( 2.27 ) | 89.5 ( 2.27 ) |
| Spiffy graph | 91.3 ( 1.96 ) | 71.9 ( 1.14 ) | 83.4 ( 1.86 ) | 61.3 ( 1.17 ) | 86.8 ( 2.11 ) | 65.9 ( 1.28 ) | 99.4 ( 1.80 ) | 82.7 ( 0.99 ) |
| NFE at | GSM8K | MBPP | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|---|---|
| target drafter | SDAR-8B | mini | SDAR-8B | mini | SDAR-8B | mini | SDAR-8B | mini |
| SDAR-8B | 69.6 | 72.8 | 56.7 | 58.6 | 62.2 | 66.8 | 84.5 | 87.9 |
| LLaDA2.0-mini | 85.9 | 83.0 | 105.2 | 94.9 | 97.8 | 88.2 | 87.1 | 84.8 |
| LLaDA-8B † | 79.8 | 83.1 | 54.5 | 56.7 | 83.3 | 87.6 | 83.6 | 86.3 |
| Dream-7B † | 66.0 | 67.8 | 51.2 | 52.0 | 57.3 | 58.3 | 77.2 | 79.1 |
Appendix figures & tables22 assets
Supplementary material from the paper’s appendix.
Appendix
| target | |||||
|---|---|---|---|---|---|
| SDAR-8B b32 | 2.58 | 3.01 | 3.21 | 3.53 | 3.38 |
| SDAR-4B b32 | 2.99 | 3.54 | 3.63 | 3.62 | 3.46 |
| LLaDA2.0-mini b32 | 2.10 | 2.09 | 2.04 | 1.94 | 1.94 |
| target | method | GSM8K | MATH500 | HumanEval | MBPP |
|---|---|---|---|---|---|
| SDAR-1.7B | MRP (reported) | ||||
| SPOT (ours) | (3.6) | (3.2) | (4.2) | (4.9) | |
| SDAR-4B | MRP (reported) | ||||
| SPOT (ours) | (4.0) | (3.3) | (4.4) | (4.9) | |
| SDAR-8B | MRP (reported) | ||||
| SPOT (ours) | (3.9) | (3.2) | (4.4) | (4.7) |
| method | drafter | size | learns order | multi-step | exact | single device |
|---|---|---|---|---|---|---|
| Spiffy ( 2026 ) | offline graph | — | ✗ | ✓ | ✗ | ✓ |
| SSD ( 2025 ) | self (confidence) | — | ✗ | ✓ | ✗ | ✓ |
| BlockSpec ( 2025 ) | self (conf. tree) | — | ✗ | ✓ | ✗ | ✓ |
| SimSD ( 2026 ) | sibling model | 1.7B | ✓ | ✓ | approx. | ✗ |
| MRP ( 2026 ) | residual head | 3 layers | ✗ | ✓ | ✗ | ✓ |
| SPOT (ours) | order model | 0.62M | ✓ | ✓ | ✓ | ✓ |
| position oracle | token oracle | joint oracle | |||||||||
| setting | metric | draft-free | |||||||||
| SDAR-8B b32 GSM8K | NFE | 271.1 | 50.1 (5.4 ) | 43.0 (6.3 ) | 38.2 (7.1 ) | 68.6 (3.9 ) | 64.8 (4.2 ) | 62.1 (4.4 ) | 46.8 (5.8 ) | 38.2 (7.1 ) | 31.3 (8.7 ) |
| tok/s ratio | 18.4 tok/s | 3.89 | 4.02 | 3.25 | 2.81 | 2.60 | 1.89 | 4.19 | 4.56 | 4.02 | |
| SDAR-8B b32 MBPP | NFE | 267.1 | 46.8 (5.7 ) | 39.7 (6.7 ) | 33.0 (8.1 ) | 53.7 (5.0 ) | 47.2 (5.7 ) | 40.9 (6.5 ) | 43.7 (6.1 ) | 35.4 (7.5 ) | 27.5 (9.7 ) |
| tok/s ratio | 18.7 tok/s | 3.25 | 3.36 | 3.05 | 2.82 | 2.77 | 2.35 | 3.50 | 3.77 | 3.53 | |
| SDAR-8B b32 HumanEval | NFE | 272.6 | 47.5 (5.7 ) | 40.0 (6.8 ) | 33.4 (8.2 ) | 62.3 (4.4 ) | 57.6 (4.7 ) | 53.6 (5.1 ) | 46.1 (5.9 ) | 37.9 (7.2 ) | 30.3 (9.0 ) |
| NFE ( tok/s ) | GSM8K | MBPP | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|---|---|
| acc. 0.86–0.87 | acc. 0.25–0.26 | acc. 0.59–0.60 | acc. 0.13–0.14 | |||||
| method | ||||||||
| no draft ( ) | 270.8 ( 1.00 ) | 269.2 ( 1.00 ) | 271.4 ( 1.00 ) | 271.8 ( 1.00 ) | ||||
| SPOT (ours) | 68.4 ( 3.17 ) | 51.2 ( 2.25 ) | 54.6 ( 3.48 ) | 37.9 ( 2.26 ) | 61.5 ( 3.48 ) | 44.9 ( 2.51 ) | 82.2 ( 2.63 ) | 64.7 ( 1.73 ) |
| SPOT- (ours) | 68.5 ( 3.12 ) | 53.1 ( 3.04 ) | 54.9 ( 3.69 ) | 39.9 ( 3.34 ) | 61.8 ( 3.34 ) | 46.1 ( 3.28 ) | 82.4 ( 2.72 ) | 68.3 ( 2.38 ) |
| Spiffy graph | 91.1 ( 2.71 ) | 71.3 ( 1.77 ) | 82.5 ( 2.52 ) | 59.8 ( 1.54 ) | 88.6 ( 2.69 ) | 66.6 ( 1.81 ) | 97.6 ( 2.50 ) | 80.5 ( 1.54 ) |
| NFE ( tok/s ) | GSM8K | MBPP | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|---|---|
| acc. 0.86–0.88 | acc. 0.19–0.23 | acc. 0.56–0.60 | acc. 0.14–0.16 | |||||
| method | ||||||||
| no draft ( ) | 270.8 ( 1.00 ) | 269.2 ( 1.00 ) | 271.4 ( 1.00 ) | 271.8 ( 1.00 ) | ||||
| SPOT (ours) | 71.0 ( 3.01 ) | 53.4 ( 2.26 ) | 57.0 ( 3.35 ) | 40.2 ( 2.17 ) | 63.0 ( 3.47 ) | 46.2 ( 2.45 ) | 86.0 ( 2.53 ) | 68.2 ( 1.71 ) |
| SPOT- (ours) | 71.5 ( 3.14 ) | 56.0 ( 3.06 ) | 57.9 ( 3.44 ) | 42.9 ( 3.24 ) | 63.1 ( 3.56 ) | 48.1 ( 3.31 ) | 86.7 ( 2.60 ) | 72.6 ( 2.27 ) |
| Spiffy graph | 94.0 ( 2.60 ) | 74.4 ( 1.81 ) | 85.0 ( 2.47 ) | 62.9 ( 1.50 ) | 90.3 ( 2.75 ) | 68.3 ( 1.85 ) | 102.5 ( 2.40 ) | 86.4 ( 1.48 ) |
| NFE ( tok/s ) | GSM8K | MBPP | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|---|---|
| acc. 0.70–0.72 | acc. 0.27–0.31 | acc. 0.45–0.47 | acc. 0.09–0.10 | |||||
| method | ||||||||
| no draft ( ) | 270.8 ( 1.00 ) | 269.2 ( 1.00 ) | 271.4 ( 1.00 ) | 271.8 ( 1.00 ) | ||||
| SPOT (ours) | 75.5 ( 2.79 ) | 58.8 ( 2.87 ) | 55.4 ( 3.61 ) | 38.9 ( 3.34 ) | 64.6 ( 3.15 ) | 46.4 ( 3.26 ) | 85.1 ( 2.49 ) | 67.7 ( 2.51 ) |
| SPOT- (ours) | 75.9 ( 2.95 ) | 62.2 ( 3.40 ) | 55.7 ( 3.74 ) | 40.5 ( 4.48 ) | 64.7 ( 3.24 ) | 48.2 ( 4.04 ) | 85.3 ( 2.50 ) | 71.7 ( 2.82 ) |
| Spiffy graph | 94.0 ( 2.63 ) | 76.8 ( 2.93 ) | 84.5 ( 2.87 ) | 64.4 ( 2.58 ) | 89.2 ( 2.69 ) | 69.4 ( 3.09 ) | 98.6 ( 2.51 ) | 82.8 ( 2.64 ) |
| NFE ( tok/s ) | GSM8K | MBPP | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|---|---|
| acc. 0.69–0.71 | acc. 0.23–0.28 | acc. 0.37–0.40 | acc. 0.10–0.11 | |||||
| method | ||||||||
| no draft ( ) | 270.8 ( 1.00 ) | 269.2 ( 1.00 ) | 271.4 ( 1.00 ) | 271.8 ( 1.00 ) | ||||
| SPOT (ours) | 79.1 ( 2.58 ) | 62.0 ( 2.57 ) | 57.5 ( 3.49 ) | 40.7 ( 3.26 ) | 67.1 ( 3.10 ) | 48.9 ( 3.16 ) | 88.9 ( 2.30 ) | 72.0 ( 2.29 ) |
| SPOT- (ours) | 79.8 ( 2.60 ) | 66.2 ( 2.93 ) | 58.4 ( 3.56 ) | 43.4 ( 4.23 ) | 67.5 ( 3.28 ) | 51.7 ( 3.95 ) | 90.1 ( 2.40 ) | 76.7 ( 2.67 ) |
| Spiffy graph | 98.7 ( 2.31 ) | 82.3 ( 2.57 ) | 86.5 ( 2.78 ) | 66.6 ( 2.62 ) | 91.7 ( 2.70 ) | 72.4 ( 3.07 ) | 104.5 ( 2.40 ) | 90.0 ( 2.52 ) |
| NFE ( tok/s ) | GSM8K | MBPP | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|---|---|
| acc. 0.59–0.65 | acc. 0.28–0.35 | acc. 0.66–0.68 | acc. 0.10–0.12 | |||||
| method | ||||||||
| no draft ( ) | 271.6 ( 1.00 ) | 270.4 ( 1.00 ) | 269.3 ( 1.00 ) | 270.2 ( 1.00 ) | ||||
| SPOT (ours) | 83.6 ( 2.32 ) | 64.0 ( 2.62 ) | 96.0 ( 2.04 ) | 75.6 ( 2.16 ) | 88.5 ( 2.86 ) | 65.8 ( 3.27 ) | 85.1 ( 2.33 ) | 66.5 ( 2.59 ) |
| Spiffy graph | 98.0 ( 1.59 ) | 80.8 ( 2.22 ) | 103.3 ( 2.01 ) | 86.6 ( 2.03 ) | 99.8 ( 2.69 ) | 78.7 ( 3.05 ) | 98.7 ( 2.11 ) | 80.6 ( 2.28 ) |
| SSD free chain | 95.9 ( 2.14 ) | 90.1 ( 2.08 ) | 103.0 ( 1.99 ) | 96.3 ( 1.91 ) | 100.5 ( 2.73 ) | 88.8 ( 2.77 ) | 97.7 ( 1.58 ) | 91.4 ( 1.59 ) |
| NFE ( tok/s ) | |||
|---|---|---|---|
| drafter | |||
| SPOT | 102.3 ( 2.00 ) | 94.1 ( 2.04 ) | 82.1 ( 2.00 ) |
| setting-specific drafter | 108.5 ( 1.80 ) | 99.0 ( 1.87 ) | 85.1 ( 1.93 ) |
| NFE ( tok/s ) at | |||||
|---|---|---|---|---|---|
| target | drafter | GSM8K | MBPP | HumanEval | MATH500 |
| SDAR-8B | SDAR-8B ∗ | 69.6 ( 2.50 ) | 56.7 ( 2.61 ) | 62.2 ( 2.74 ) | 84.5 ( 2.03 ) |
| SDAR-4B | 71.4 ( 2.37 ) | 57.6 ( 2.44 ) | 64.1 ( 2.75 ) | 85.9 ( 1.98 ) | |
| SDAR-1.7B | 72.0 ( 2.36 ) | 57.4 ( 2.46 ) | 65.3 ( 2.69 ) | 88.9 ( 1.86 ) | |
| mini | 72.8 ( 2.33 ) | 58.6 ( 2.34 ) | 66.8 ( 2.48 ) | 87.9 ( 1.91 ) | |
| SDAR-4B | SDAR-8B | 69.3 ( 3.11 ) | 54.6 ( 3.42 ) | 63.3 ( 3.29 ) | 83.7 ( 2.60 ) |
| NFE ( tok/s ) | |||
|---|---|---|---|
| setting | |||
| SDAR-8B b32 | 55.6 ( 2.64 ) | 47.1 ( 2.42 ) | 38.7 ( 1.75 ) |
| SDAR-8B b16 | 60.8 ( 3.46 ) | 58.7 ( 3.29 ) | 44.4 ( 3.23 ) |
| mini b32 | 96.0 ( 2.04 ) | 86.9 ( 2.12 ) | 75.6 ( 2.16 ) |
| mini b16 | 90.5 ( 1.98 ) | 82.1 ( 2.08 ) | 72.6 ( 2.19 ) |
| length 64 | length 256 | length 512 | ||||
| method | ||||||
| no draft ( ) | 77.2 ( 1.00 ) | 269.2 ( 1.00 ) | 525.2 ( 1.00 ) | |||
| SPOT (ours) | 27.5 ( 1.56 ) | 22.2 ( 0.89 ) | 60.1 ( 2.45 ) | 42.6 ( 1.59 ) | 100.2 ( 2.79 ) | 66.7 ( 1.98 ) |
| SPOT- (ours) | 31.8 ( 1.87 ) | 30.3 ( 1.87 ) | 64.9 ( 2.80 ) | 52.1 ( 2.86 ) | 105.1 ( 3.10 ) | 76.3 ( 3.23 ) |
| Spiffy graph | 30.9 ( 1.45 ) | 27.0 ( 0.76 ) | 86.3 ( 1.77 ) | 64.8 ( 1.07 ) | 158.4 ( 1.86 ) | 112.9 ( 1.21 ) |
| free chain, match | 31.0 ( 1.38 ) | 29.6 ( 0.65 ) | 87.4 ( 1.76 ) | 79.1 ( 0.88 ) | 159.5 ( 1.82 ) | 143.1 ( 0.92 ) |
| NFE ( tok/s ) | ||
|---|---|---|
| configuration | ||
| final recipe (tree, hedge , , , padded) | 56.7 ( 2.61 ) | 39.6 ( 1.72 ) |
| token hedge (gate off) | 57.0 ( 2.61 ) | 40.3 ( 1.68 ) |
| chain instead of tree | 64.0 ( 2.32 ) | 51.5 ( 1.34 ) |
| scaled training corpus | 57.3 ( 2.60 ) | 40.4 ( 1.72 ) |
| no padding, | 56.7 ( 2.59 ) | 39.6 ( 1.76 ) |
| NFE ( tok/s ) | GSM8K | MBPP | ||||
|---|---|---|---|---|---|---|
| acc. 0.89–0.90 | acc. 0.41–0.43 | |||||
| method | ||||||
| no draft ( ) | 270.8 ( 1.00 ) | 269.2 ( 1.00 ) | ||||
| SPOT (ours) | 69.6 ( 2.50 ) | 60.9 ( 2.31 ) | 52.6 ( 1.56 ) | 56.7 ( 2.61 ) | 48.2 ( 2.38 ) | 39.6 ( 1.72 ) |
| SPOT- (ours) | 75.1 ( 2.76 ) | 70.9 ( 2.83 ) | 67.8 ( 2.78 ) | 60.7 ( 2.98 ) | 54.1 ( 3.06 ) | 47.8 ( 2.99 ) |
| Spiffy graph | 91.3 ( 1.96 ) | 82.8 ( 1.71 ) | 71.9 ( 1.14 ) | 83.4 ( 1.86 ) | 74.9 ( 1.59 ) | 61.3 ( 1.17 ) |
| NFE ( tok/s ) | HumanEval | MATH500 | ||||
|---|---|---|---|---|---|---|
| acc. 0.74–0.74 | acc. 0.10–0.11 | |||||
| method | ||||||
| no draft ( ) | 271.4 ( 1.00 ) | 271.8 ( 1.00 ) | ||||
| SPOT (ours) | 62.2 ( 2.74 ) | 53.3 ( 2.67 ) | 44.6 ( 1.85 ) | 84.5 ( 2.03 ) | 75.1 ( 1.80 ) | 66.0 ( 1.20 ) |
| SPOT- (ours) | 66.5 ( 3.09 ) | 61.0 ( 3.19 ) | 56.4 ( 3.13 ) | 92.2 ( 2.27 ) | 89.9 ( 2.27 ) | 89.5 ( 2.27 ) |
| Spiffy graph | 86.8 ( 2.11 ) | 78.2 ( 1.87 ) | 65.9 ( 1.28 ) | 99.4 ( 1.80 ) | 90.5 ( 1.58 ) | 82.7 ( 0.99 ) |
| SPOT, GSM8K | NFE | 271.1 | 102.4 | 84.2 | 78.0 | 69.5 | 60.8 | 54.7 | 52.6 |
|---|---|---|---|---|---|---|---|---|---|
| tok/s | 1.00 | 2.38 | 2.69 | 2.80 | 2.60 | 2.43 | 1.85 | 1.63 | |
| SPOT, MBPP | NFE | 267.1 | 87.7 | 70.9 | 63.9 | 55.6 | 47.1 | 39.7 | 38.7 |
| tok/s | 1.00 | 2.25 | 2.80 | 3.04 | 2.70 | 2.47 | 2.15 | 1.79 | |
| SPOT, HumanEval | NFE | 272.6 | 96.5 | 78.0 | 71.1 | 62.2 | 53.4 | 46.7 | 44.4 |
| tok/s | 1.00 | 2.51 | 2.88 | 3.13 | 2.82 | 2.68 | 2.27 | 1.87 |
| coupled-noise match | uncoupled match | greedy match † | |||||
|---|---|---|---|---|---|---|---|
| drafter | |||||||
| 0.5 | no draft ( ) | 267.1 NFE, accuracy 0.35, argmax fraction 0.988, mean committed 0.993 | |||||
| SPOT | 56.8 (2.56) | 39.2 (1.74) | 56.7 (2.53) | 39.1 (1.68) | 55.9 (2.62) | 38.9 (1.76) | |
| Spiffy graph | 83.0 (1.83) | 60.4 (1.16) | 82.7 (1.87) | 60.3 (1.19) | 82.3 (1.83) | 59.9 (1.16) | |
| BlockSpec-style tree | 135.6 (1.12) | 112.0 (0.60) | 135.1 (1.10) | 111.4 (0.59) | 134.8 (1.12) | 111.3 (0.60) | |
| 1.0 | no draft ( ) | 267.1 NFE, accuracy 0.38, argmax fraction 0.978, mean committed 0.967 | |||||
| NFE ( tok/s ) | ||||
|---|---|---|---|---|
| drafter | verifier | |||
| SPOT | tree + match | 60.1 ( 2.45 ) | 51.5 ( 2.18 ) | 42.6 ( 1.59 ) |
| SPOT | chain + match | 71.6 ( 2.01 ) | 65.6 ( 1.70 ) | 59.3 ( 1.12 ) |
| SPOT | chain + RS | 68.7 ( 1.91 ) | 62.7 ( 1.64 ) | 56.3 ( 1.12 ) |
Speculative Decoding for Diffusion Language Models
Speculative decoding for diffusion language models speeds generation by drafting tokens in parallel and verifying them efficiently.
See all 30 papers