EAGLE-3 Speculative Decoding in Production
Speculative decoding pairs a fast draft with the target model. The draft proposes K tokens, the target verifies them in a single forward, and the accepted ones come almost free. EAGLE-3 is the production-grade variant in 2026: it trains a draft head on the target model's hidden states instead of on raw tokens, which pushes acceptance rate alpha into the 0.6-0.8 band on general chat. The question to ask is not how fast the draft is but what alpha is on your traffic. Below roughly 0.55, speculative decoding is net negative at high concurrency, because every rejected draft costs a second target forward pass. Measure alpha first, then flip the flag.
Learning Objectives
- Name the three generations of speculative decoding and explain what EAGLE-3 changes from EAGLE-2 and from a classic draft model.
- Define acceptance rate alpha, compute expected speedup from alpha and K (draft length), and identify the break-even alpha for your target concurrency.
- Explain why speculative decoding is opt-in (not default) in vLLM 2026 and why turning it on without measuring alpha is a production anti-pattern.
- Write a measurement plan: which benchmark, which prompt distribution, which concurrency point, which metric to gate on.
The Problem
Decode is memory-bound. On an H100 running Llama 3.3 70B FP8, each decoded token reads ~140 GB/s of weights and emits one token. The GPU compute sits mostly idle during decode, because the bottleneck is HBM bandwidth and not matmul throughput.
Speculative decoding exploits that gap. A cheap draft model generates K candidate tokens, then the target model verifies all K in a single forward pass. A verified token is nearly free, since it is amortized into a K-wide forward the target would have had to run anyway.
The classic approach uses a smaller model from the same family (Llama 3.2 1B drafting for Llama 3.3 70B). It works, but acceptance rate is mediocre because the small model's distribution diverges from the target's. EAGLE, then EAGLE-2, then EAGLE-3 train a light draft head directly on the target model's internal states, so the draft tracks the target much more closely. That is why alpha goes from 0.4 with a draft model to 0.6-0.8 with EAGLE-3.
The catch is that EAGLE-3 is opt-in in vLLM 2026. You have to set speculative_config explicitly, and without it you get no acceleration. Teams that flip it on without measuring alpha on their real traffic often see tail latency get worse, not better.
The Concept
What speculative decoding actually buys
Without spec decode, each token costs one target forward. With draft length K and acceptance rate alpha, the expected number of tokens per target forward is 1 + K * alpha. The speedup is (1 + K * alpha) / (1 + epsilon), where epsilon is the draft-plus-verify overhead. For K=5, alpha=0.7: (1 + 5*0.7) / (1 + 0.1) = 4.5 / 1.1 = 4.1x. Real-world numbers cluster around 2-3x, because alpha is rarely that high on production traffic and epsilon grows at high batch size.
Why alpha comes first
Rejected tokens do not disappear. They force a second target forward for the first rejected token. On a workload where alpha drops to 0.4, you pay draft overhead, then verification, then the re-roll. At high concurrency (say 256 concurrent) the decode batch is already large enough that the memory-bandwidth gap between "target alone" and "target with verify" shrinks. Below alpha 0.55 on most 2026 hardware, spec decode is net negative.
Alpha varies by workload. On ShareGPT-style general chat, EAGLE-3 trained on ShareGPT hits 0.6-0.8. On domain-specific traffic (code, medical, legal) a draft head trained on general data drops to 0.4-0.6. Training a domain-specific draft head recovers alpha, and it is a light, quick job compared to finetuning the target.
EAGLE generations at a glance
- Classic draft model: a small model of the same family. Alpha 0.3-0.5. The infrastructure is simple: two models loaded, and the draft runs K forwards per target forward.
- EAGLE-1 (2024): a single draft head trained on the target's last-layer hidden states. Alpha ~0.5-0.6, with a small parameter overhead on top of the target.
- EAGLE-2 (2025): adaptive draft length and tree-based drafts, so multiple branches get verified in one target pass. Alpha ~0.6-0.7, at the price of a more complex draft scheduler.
- EAGLE-3 (2025-2026): a draft head trained on multiple target layers instead of just the last, which gives better alignment. Alpha ~0.6-0.8 on general chat.
The 2026 production recipe
- Ship the target model plain. Measure baseline TTFT, ITL, and throughput at your target concurrency.
- Enable the EAGLE-3 draft via vLLM
speculative_configand re-run the benchmark. - Log acceptance rate alpha. vLLM V1 reports it as
spec_decode_metrics.accepted_tokens_per_request; divide by the requested draft length to get alpha. - If alpha < 0.55 on your production traffic distribution, disable spec decode or train a domain-specific EAGLE-3 draft.
- Re-run at production concurrency and confirm P99 ITL did not get worse.
The production pitfall: P99 tail
Mean ITL drops with spec decode, but P99 can get worse if you do not tune. A rejected draft triggers a two-pass sequence (draft, verify-fail, reroll), and under a full batch those two passes serialize. Watch P99 ITL, not P50.
Where EAGLE-3 is already deployed
Google deployed speculative decoding in AI Overviews in 2025 (same quality, faster response). vLLM V1 ships speculative_config as the documented interface, and N-gram GPU speculative decoding in V1 is the variant that works with chunked prefill. SGLang supports EAGLE-3 as the recommended draft path for prefix-heavy workloads.
Break-even math in one line
Expected speedup is S(alpha, K) = (1 + K*alpha) / (1 + verify_overhead). Set S = 1 and solve for alpha: alpha_breakeven = verify_overhead / K. With a typical verify_overhead of ~0.15 and K=5, that gives alpha_breakeven = 0.03. But that is the raw decode math. At high concurrency the verify overhead rises and the decode batch already amortizes memory reads across sequences, so the effective alpha_breakeven climbs to ~0.45-0.55 in practice.
When not to use speculative decoding
- Batch-1 offline generation where latency does not matter. Use the plain target.
- Very short outputs (under 50 tokens). Draft overhead and verify cost dominate.
- Specialized domains without a domain-trained draft head. Alpha is too low.
- vLLM v0.18.0 with draft-model spec decode and
--enable-chunked-prefill. This combination does not compile. The documented exception is N-gram GPU spec decode in V1.
Use It
code/main.py simulates a decode loop with and without speculative decoding across a range of alpha values and draft lengths K. It prints the break-even alpha, the speedup, and the tail behavior. Run it on a few (alpha, K) combinations and see where speculative decoding stops paying.
Ship It
This lesson produces outputs/skill-eagle3-rollout.md. Give it a target model, a traffic distribution description, and a concurrency target, and it returns a staged EAGLE-3 rollout plan: benchmark the baseline, enable the config, measure alpha, gate on alpha >= 0.55, and watch P99 ITL.
I'd run main.py and read it with some suspicion. Its break-even alpha comes out at 0.034, 0.045, and 0.060 for concurrency 32, 128, and 256, because it only scales verify overhead by 1 + concurrency / 256. That is nowhere near the 0.55 gate in the production recipe. The gate comes from how real servers behave under load, which the toy does not model. The closing "KEY FINDING" text in the output also quotes ~0.1 and ~0.4, and the table above it does not back those up. Trust the table.
The same goes for the TAIL tags. Every row gets one, even at alpha 0.80, because the simulator charges a reroll on any batch where fewer than K drafts are accepted, and at K=5 that is most batches. Treat it as a picture of why mean ITL and P99 ITL can move in opposite directions, and not as a P99 measurement.
My bet is that the habit worth keeping is gating per traffic slice. The code splits nothing by workload, but the body's own numbers (0.6-0.8 on chat, 0.4-0.6 on code) show how a blended alpha can look fine while one slice sits under the line. I'd log alpha separately for each slice before deciding to ship.
Exercises
- Run
code/main.py. At K=5, what alpha do you need for a 2x speedup? For a 3x speedup? How sensitive is that to verify_overhead? - Imagine production traffic splits 70% general chat, 30% code. General chat hits alpha 0.7 with EAGLE-3 trained on ShareGPT; code hits alpha 0.4. What is blended alpha and is spec decode net-positive?
- Read the vLLM
speculative_configdocumentation. Name the three modes (draft model, EAGLE, N-gram) and which one is compatible with chunked prefill. - You see mean ITL drop 25% after enabling EAGLE-3 but P99 ITL went up 15%. Diagnose and propose a mitigation.
- Compute the memory cost of the EAGLE-3 draft head for Llama 3.3 70B. How does it compare to running Llama 3.2 1B as a classic draft?
Key Terms
| Term | What people say | What it actually means |
|---|---|---|
| Speculative decoding | "draft plus verify" | Propose K tokens with a cheap model, verify all K in one target forward |
| Acceptance rate alpha | "spec accept rate" | Fraction of draft tokens accepted by the target; the only metric that matters |
| Draft length K | "spec k" | How many tokens the draft proposes per target forward; typical 4-8 |
| Verify overhead epsilon | "spec overhead" | Extra cost to verify-and-reroll vs a plain target forward; grows with batch |
| EAGLE-3 | "latest EAGLE" | 2025-2026 variant; trains draft head on multiple target layers; alpha 0.6-0.8 on general chat |
speculative_config | "vLLM spec config" | The explicit opt-in in vLLM V1; no default means no acceleration |
| N-gram spec decode | "N-gram draft" | GPU-side draft using N-gram lookups in the prompt; chunked-prefill-compatible |
| Break-even alpha | "no-op alpha" | Alpha at which spec decode gives zero speedup; watch this at production concurrency |
| Rejected-draft two-pass | "reroll cost" | Two target forwards when drafts reject; drives P99 tail |
Further Reading
- vLLM Speculative Decoding docs: authoritative source on
speculative_configand chunked-prefill compatibility in V1. - vLLM Speculative Config API: the exact field set.
- EAGLE paper (arXiv:2401.15077): the original EAGLE draft-head formulation.
- EAGLE-2 paper (arXiv:2406.16858): adaptive drafts and trees.
- UC Berkeley EECS-2025-224: efficient LLM system with speculative decoding.
- BentoML Speculative Decoding: production rollout checklist.
Code
- main.py (python, 134 lines)