As a coding agent reads files and calls tools, its conversation and execution history grows. Adding a small model to draft answers faster can create another burden if that model must separately process and retain the same long history.
DLite lets the target model handle the history, while the small drafter uses the target’s internal representations to propose upcoming tokens. It removes the drafter’s separate historical KV cache. It does not remove the target’s cache or discard historical information.
Why can adding a small model help?
A language model usually generates one token at a time. A token is a unit of text processing, such as a word or part of a word. Instead of running the large model once for every token, a small model can propose several candidates for the large model to check together. This is the basic idea of speculative decoding (§2.1).
The two roles are distinct. The drafter proposes candidates quickly; the target model verifies them and determines the actual output. The approach benefits from accepting many candidates while keeping drafting costs small. A slow or frequently rejected drafter reduces that benefit.
Agents accumulate tool results and prior conversation. Conventional drafters process this history themselves and store internal data in a KV cache for later generation. A KV cache retains information about processed tokens so the model need not recompute everything from scratch. When the target and drafter maintain separate caches, newly confirmed tokens also require updates on the draft side (§3.1).

The left of Figure 1 illustrates agent execution with repeated long inputs and short outputs. The right shows fewer tokens being produced per verification round on such workloads. The question is not merely whether a small model is available, but whether it can keep proposing useful candidates while handling a growing history.
Overall pipeline: what stays and what disappears?
After processing the history, the target supplies hidden states to DLite. These are intermediate neural-network values, not a human-readable summary. The drafter uses them together with the latest confirmed token to propose new candidates (§4.1).
The following is an illustrative example of candidate verification. It uses visible English words for clarity, rather than an actual tokenizer’s segmentation or measured results from the paper.
In the first panel, the full history and target cache remain. The drafter receives target representations and information about the current position. Thus, “history-free” means that the drafter keeps no separate historical KV cache, not that it forgets the history.
In the second panel, the drafter proposes jumps over a dog. The third assumes a verification outcome that accepts jumps and over, then rejects a. In that case, dog is not confirmed either, and generation continues with the from the verification procedure. This does not describe a simple comparison against a reference string; it illustrates which candidates survive an acceptance or rejection decision.
One round performs the following operations.
| Stage | Operation | Result used next |
|---|---|---|
| Target computation | Process the input so far | Target cache and hidden states |
| Candidate preparation | Compute representations for several positions together | Position-wise representations |
| Candidate generation | Select each candidate using earlier draft selections | Candidate token block |
| Target verification | Check candidates and confirm the accepted prefix | Confirmed output and next-round information |
The drafter does not store the long history again, but target computation and verification remain. These must be distinguished from the work DLite removes (§4.1, Figure 3).
Prepare positions together, then use earlier selections
Computing several upcoming positions together is efficient. But choosing their words independently can make the sequence less coherent. When selecting the word after jumps, for example, the model needs to account for having actually selected jumps.
DLite separates these operations. Its parallel backbone computes representations for several positions together. A small sequential head then uses earlier draft selections when choosing subsequent candidates. The larger computation runs in parallel; only the small computation that accounts for earlier candidates runs sequentially (§4.1.1–4.1.2).
The sequential head handles information inside the current candidate block. It does not reread the entire conversation or file contents. It also incorporates sequential information in the hidden representations before projecting them into vocabulary scores, rather than projecting first and refining afterward. This avoids repeating an expensive intermediate vocabulary projection.

Figure 3 connects the explanation to the model’s components. Follow the path from target representations to the drafter, and the placement of the sequential head after parallel computation. The illustrative figure shows how candidates change; this source figure shows how implementation components connect.
The architecture also needs training preparation. The authors first use an intermediate teacher with a similar structure that can access historical cache, then train DLite to align directly with the target. Removing draft-side cache during inference comes with an additional training procedure (§4.2).
Results: acceptance length and speed are different
The experiments use Qwen3-4B and Qwen3-8B as targets on NVIDIA H800 serving hardware, with a speculative block size of 7. Two metrics need separating. Acceptance length measures output per verification round; speedup measures improvement over ordinary token-by-token generation (§5.1).
The following results are from SWE-Bench. DSpark is another drafting approach used for comparison (Table 3).
| Target | Method | Average acceptance length | Speed versus ordinary generation |
|---|---|---|---|
| Qwen3-4B | DSpark | 1.89 | 1.64× |
| Qwen3-4B | DLite | 3.15 | 2.68× |
| Qwen3-8B | DSpark | 1.94 | 1.60× |
| Qwen3-8B | DLite | 3.19 | 2.74× |
For 4B, the change from 1.89 to 3.15 is about a 66.7% increase in acceptance length. The 2.68× speedup, however, is relative to ordinary generation, not DSpark. A direct speed comparison divides 2.68 by 1.64, giving approximately 1.63×. Accepting more candidates and speeding up a service are related, but they are different measurements.
On shorter general-purpose tasks, differences are smaller. For example, 4B GSM8K acceptance length is 6.27 for DSpark and 6.38 for DLite (Table 1). Rather than expecting large gains everywhere, examine how useful this design is when histories grow long.
Speedup also changes with concurrency. For 4B Alpaca, DLite’s throughput relative to ordinary generation is 2.58× with 1 concurrent request and 1.32× with 64. Evaluation should match the service’s actual concurrency and input lengths (Table 4).
Limitations to check before adoption
The serving engine must expose target hidden states and pass them to the drafter. Assessing compatibility therefore requires examining that implementation path, beyond the model’s name. The target KV cache remains necessary, so the memory cost of the whole long input does not disappear.
Training costs remain too. The intermediate teacher and two-stage training are part of the authors’ procedure. The results do not imply that attaching an arbitrary pretrained small model will reproduce these gains (§4.2).
From a reviewer’s perspective, applicability remains a question. The targets evaluated are 4B and 8B Qwen3 models on H800 serving hardware. Larger targets, different architectures, or placing the drafter and target on separate devices require further validation. Acceptance length and speed measurements also do not directly measure task success rates.
DLite is worth examining for agent services that repeatedly reuse long histories. The central question is who processes the history and who reuses the result, rather than whether all cache usage reaches zero. The design retains target-side history processing while reducing redundant historical storage and updates in the drafter.
Expand the original tables
Tables converted mechanically from the arXiv e-print LaTeX source. The numbers are the paper’s own and did not pass through a model.
Table 1. Acceptance length $\tau$ evaluation on general-purpose workloads.
| Model | Method | Math GSM8K | Math MATH-500 | Code HumanEval | Code \ MBPP | Code *\ \ \ LCB \ * | Chat MT-Bench | Chat Alpaca |
|---|---|---|---|---|---|---|---|---|
| Qwen3-4B | EAGLE3 | 2.63 | 2.39 | 2.47 | 2.34 | 2.17 | 3.07 | 2.28 |
| DFlow | 5.13 | 4.92 | 4.33 | 4.12 | - | 3.80 | 2.90 | |
| DFlash | 5.97 | 5.82 | 5.25 | 4.97 | 4.82 | 3.39 | 3.56 | |
| DFlash2 | 6.14 | 5.80 | 5.38 | 5.14 | 4.79 | 4.14 | 2.50 | |
| DSpark | 6.27 | 6.25 | 5.62 | 5.48 | 5.20 | 3.81 | 3.54 | |
| DLite | 6.38 | 6.30 | 5.68 | 5.64 | 5.31 | 3.94 | 3.64 | |
| Qwen3-8B | EAGLE3 | 2.60 | 2.28 | 2.51 | 2.17 | 2.08 | 3.07 | 2.56 |
| DFlow | 5.10 | 4.94 | 4.28 | 4.08 | - | 3.58 | 2.93 | |
| DFlash | 6.04 | 5.91 | 5.27 | 4.88 | 4.89 | 3.39 | 3.56 | |
| DSpark | 6.36 | 6.34 | 5.86 | 5.36 | 5.43 | 3.88 | 3.64 | |
| DLite | 6.48 | 6.35 | 5.96 | 5.65 | 5.66 | 3.96 | 3.78 |
Table 2. Speedup and acceptance length ($\tau$) evaluation on long-context workloads.
| Model | Method | LongBench_v2 | |||||||
|---|---|---|---|---|---|---|---|---|---|
| Multi-Doc QA | Long In-ctx Lrn. | Code Repo Ud. | Long-dialog Hist. | ||||||
| Speedup | $\tau$ | Speedup | $\tau$ | Speedup | $\tau$ | Speedup | $\tau$ | ||
| Qwen3-4B | Eagle3 | 1.70$\times$ | 2.10 | 1.76$\times$ | 2.28 | 1.68$\times$ | 2.12 | 2.23$\times$ | 2.88 |
| DFlash | 1.60$\times$ | 1.90 | 1.71$\times$ | 2.00 | 1.45$\times$ | 1.83 | 2.62$\times$ | 3.04 | |
| DSpark | 1.81$\times$ | 2.20 | 2.01$\times$ | 2.41 | 2.02$\times$ | 2.44 | 3.16$\times$ | 3.93 | |
| DLite | 2.18$\times$ | 2.74 | 2.58$\times$ | 3.11 | 2.66$\times$ | 3.14 | 3.88$\times$ | 4.62 | |
| Qwen3-8B | Eagle3 | 1.64$\times$ | 2.05 | 1.87$\times$ | 2.33 | 1.42$\times$ | 1.80 | 2.01$\times$ | 2.56 |
| DFlash | 1.81$\times$ | 2.10 | 1.86$\times$ | 2.28 | 1.65$\times$ | 2.16 | 2.58$\times$ | 3.07 | |
| DSpark | 1.98$\times$ | 2.52 | 2.28$\times$ | 2.67 | 2.02$\times$ | 2.59 | 3.02$\times$ | 4.01 | |
| DLite | 2.32$\times$ | 2.86 | 2.74$\times$ | 3.22 | 2.53$\times$ | 3.04 | 3.96$\times$ | 4.77 |
Table 3. Speedup and acceptance length ($\tau$) evaluation on agentic workloads.
| Metric | Method | AgentMemBench \ \ Speedup | AgentMemBench $\tau$ | AgentLongBench Speedup | AgentLongBench $\tau$ | *\ \ \ \ \ \ \ \ \ BFCL-v3 \ \ \ \ \ \ \ \ * Speedup | *\ \ \ \ \ \ \ \ \ BFCL-v3 \ \ \ \ \ \ \ \ * $\tau$ | *\ \ \ \ SWE-bench\ \ \ * Speedup | *\ \ \ \ SWE-bench\ \ \ * $\tau$ |
|---|---|---|---|---|---|---|---|---|---|
| Qwen3-4B | Eagle3 | 1.66$\times$ | 2.09 | 1.70$\times$ | 2.12 | 1.58$\times$ | 2.00 | 1.48$\times$ | 1.88 |
| DFlash | 1.22$\times$ | 1.65 | 0.95$\times$ | 1.14 | 1.44$\times$ | 1.80 | 1.47$\times$ | 1.72 | |
| DSpark | 1.72$\times$ | 2.10 | 1.45$\times$ | 1.84 | 2.11$\times$ | 2.54 | 1.64$\times$ | 1.89 | |
| DLite | 2.39$\times$ | 2.80 | 2.07$\times$ | 2.51 | 2.37$\times$ | 2.78 | 2.68$\times$ | 3.15 | |
| Qwen3-8B | Eagle3 | 1.77$\times$ | 2.19 | 1.60$\times$ | 2.00 | 1.49$\times$ | 1.88 | 1.33$\times$ | 1.71 |
| DFlash | 1.80$\times$ | 2.20 | 1.28$\times$ | 1.65 | 1.78$\times$ | 2.07 | 1.53$\times$ | 1.83 | |
| DSpark | 1.83$\times$ | 2.26 | 1.68$\times$ | 2.09 | 1.82$\times$ | 2.23 | 1.60$\times$ | 1.94 | |
| DLite | 2.20$\times$ | 2.69 | 2.31$\times$ | 2.79 | 2.30$\times$ | 2.76 | 2.74$\times$ | 3.19 |
Table 4. High-concurrency throughput evaluation on Qwen3 models.
| Task | Method | Concurrency (TPS / Speedup) 1 | Concurrency (TPS / Speedup) 8 | Concurrency (TPS / Speedup) 16 | Concurrency (TPS / Speedup) 32 | Concurrency (TPS / Speedup) 64 | Avg. $\tau$ |
|---|---|---|---|---|---|---|---|
| Qwen3-4B | |||||||
| Alpaca | Baseline | 246 / 1.00$\times$ | 1798 / 1.00$\times$ | 3377 / 1.00$\times$ | 5849 / 1.00$\times$ | 10808 /1.00$\times$ | – |
| DSpark | 609 / 2.47$\times$ | 4131 / 2.30$\times$ | 7018 / 2.08$\times$ | 11118 / 1.90$\times$ | 13548 / 1.25$\times$ | 3.49 | |
| DLite | 635 / 2.58$\times$ | 4222 / 2.35$\times$ | 7293 / 2.16$\times$ | 11792 / 2.02$\times$ | 14300 / 1.32$\times$ | 3.63 | |
| MT-Bench | Baseline | 245 / 1.00$\times$ | 1792 / 1.00$\times$ | 3377 / 1.00$\times$ | 5883 / 1.00$\times$ | 10113 / 1.00$\times$ | – |
| DSpark | 620 / 2.53$\times$ | 4589 / 2.56$\times$ | 8177 / 2.42$\times$ | 12565 / 2.14$\times$ | 15830 / 1.57$\times$ | 3.79 | |
| DLite | 633 / 2.58$\times$ | 4699 / 2.62$\times$ | 8162 / 2.42$\times$ | 12994 / 2.21$\times$ | 16820 / 1.66$\times$ | 3.88 | |
| LCB | Baseline | 242 / 1.00$\times$ | 1665 / 1.00$\times$ | 2918 / 1.00$\times$ | 4498 / 1.00$\times$ | 6586 / 1.00$\times$ | – |
| DSpark | 905 / 3.74$\times$ | 5457 / 3.28$\times$ | 8248 / 2.83$\times$ | 10243 / 2.28$\times$ | 11309 / 1.72$\times$ | 5.28 | |
| DLite | 960 / 3.97$\times$ | 5592 / 3.36$\times$ | 8418 / 2.88$\times$ | 10873 / 2.42$\times$ | 12075 / 1.83$\times$ | 5.98 | |
| Qwen3-8B | |||||||
| Alpaca | Baseline | 142 / 1.00$\times$ | 993 / 1.00$\times$ | 1705 / 1.00$\times$ | 2920 / 1.00$\times$ | 4330 / 1.00$\times$ | – |
| DSpark | 364 / 2.56$\times$ | 2260 / 2.28$\times$ | 3758 / 2.20$\times$ | 5238 / 1.79$\times$ | 6827 / 1.58$\times$ | 3.69 | |
| DLite | 379 / 2.67$\times$ | 2409 / 2.43$\times$ | 3965 / 2.33$\times$ | 5325 / 1.82$\times$ | 7042 / 1.63$\times$ | 3.86 | |
| MT-Bench | Baseline | 143 / 1.00$\times$ | 977 / 1.00$\times$ | 1749 / 1.00$\times$ | 2950 / 1.00$\times$ | 4450 / 1.00$\times$ | – |
| DSpark | 398 / 2.78$\times$ | 2454 / 2.51$\times$ | 3956 / 2.26$\times$ | 5455 / 1.85$\times$ | 7236 / 1.63$\times$ | 3.89 | |
| DLite | 407 / 2.85$\times$ | 2531 / 2.59$\times$ | 4131 / 2.36$\times$ | 5558 / 1.88$\times$ | 7305 / 1.64$\times$ | 4.10 | |
| LCB | Baseline | 142 / 1.00$\times$ | 902 / 1.00$\times$ | 1401 / 1.00$\times$ | 2196 / 1.00$\times$ | 2708 / 1.00$\times$ | – |
| DSpark | 511 / 3.60$\times$ | 2562 / 2.84$\times$ | 3803 / 2.71$\times$ | 4815 / 2.19$\times$ | 5621 / 2.08$\times$ | 5.47 | |
| DLite | 561 / 3.95$\times$ | 2761 / 3.06$\times$ | 4016 / 2.87$\times$ | 5059 / 2.30$\times$ | 5758 / 2.13$\times$ | 6.04 |
Table 5. Design space exploration of DLite\xspace on Qwen3-8B. All variants are trained on the same 80K-sample subset, and we report average acceptance length ($\tau$). For the target hidden-state exploration, the first and last target layers are always included in addition to the sampled intermediate layers. Unless otherwise specified, we use 14 target hidden states, sequence-wise hidden-state composition, and a sequential-head rank of 512. Bold indicates the configuration adopted in the final model.
| Dimension | Configuration | Alpaca | GSM8K | MBPP | Multi-Doc QA | Avg. $\tau$ |
|---|---|---|---|---|---|---|
| Target Hidden States | 7 | 2.34 | 4.36 | 3.63 | 2.22 | 3.14 |
| 9 | 2.42 | 4.40 | 3.75 | 2.24 | 3.20 | |
| 14 | 2.63 | 4.53 | 3.76 | 2.28 | 3.30 | |
| 20 | 2.62 | 4.55 | 3.74 | 2.26 | 3.29 | |
| 36 | 2.58 | 4.51 | 3.71 | 2.26 | 3.27 | |
| Hidden Composition | Feature-wise | 2.20 | 4.28 | 3.50 | 2.16 | 3.04 |
| Sequence-wise | 2.63 | 4.53 | 3.76 | 2.28 | 3.30 | |
| Sequential-Head Rank | 256 ($1/16D$) | 2.48 | 4.40 | 3.61 | 2.16 | 3.16 |
| 512 ($1/8D$) | 2.63 | 4.53 | 3.76 | 2.28 | 3.30 | |
| 1024 ($1/4D$) | 2.64 | 4.55 | 3.80 | 2.28 | 3.32 | |
| 2048 ($1/2D$) | 2.64 | 4.53 | 3.82 | 2.28 | 3.32 | |
| 4096 ($D$) | 2.64 | 4.56 | 3.82 | 2.30 | 3.33 |
Figures identified by their source Figure numbers are from arXiv:2610.23787 (CC BY 4.0), with size and format changes. The candidate-verification illustration was drawn separately for this article.
Comments