The textbook view says speculative decoding saves GPU forward passes. On real serving hardware at small batch the dominant per-step cost is not GPU compute — it is a fixed host/scheduler cost the CPU pays once per step (47% of the 8B decode step, measured directly by nsys). We show the real speedup is the amortization of that one host cost over the tokens a draft-verify cycle accepts. Crucially, acceptance is now measured directly from the vLLM engine counter — a latency-free quantity, never derived from the latency it predicts. The de-tautologized closed-form predicts measured per-token latency to 6.3% mean error across 24 cells (the acceptance-blind textbook view errs by 43%), honestly under-predicting the high-acceptance regime by a per-cycle host residual we ground independently.
Speculative decoding proposes γ cheap draft tokens, then the big model verifies all γ+1 positions in a single forward pass and keeps the longest accepted prefix. The classic analysis says: you saved forward passes, so latency falls by the number of tokens accepted. That analysis quietly assumes the cost being saved is GPU compute. On a modern serving engine at the small batches that dominate latency-sensitive serving, the dominant cost is instead a host/scheduler term — the CPU dequeuing the batch, managing paged KV, building kernel arguments, and issuing launches — which is paid exactly once per step regardless of how many tokens that step emits. That is the cost speculation actually amortizes.
The per-output-token latency is the fixed verify-step time divided by the accepted-token count: pot(γ) = t_ver / (αγ+1). The engine counter pins acceptance directly: on the ‘repeat’ workload α=1.00 (every drafted token is accepted), so the host term spreads over many tokens — up to a 6.2× speedup. On ‘open’ α→0 (≤0.020), so the same host term is spread over ≈1 token — 0.98×, no speedup. The only thing that changed is acceptance, and it was read from a counter, not inferred from timing.
The acceptance-blind device-pass model predicts a (γ+1)× speedup whether or not the drafts are accepted. It is tolerable on the repeat workload (8.4% error, where acceptance happens to be near 1) but collapses on the open workload (77.5% error), because there the device-pass count it relies on never falls. Overall it errs by 43% mean — it counts forward passes when it should be counting host steps.
Verifying γ+1 positions instead of one costs only 2.2% more GPU time at γ=6, and that number comes from a frozen roofline predictor, not fit to these cells. In the memory-bound decode regime the projection GEMMs stream the whole weight set regardless of the tiny row count, so adding a few rows barely moves the step. The verify step is essentially the baseline step — which is precisely why the divisor (acceptance), not the proposal count, governs the speedup.
Acceptance is a property of the workload (the n-gram hit rate of the token stream), so it should not depend on the GPU. We calibrate one α per (workload, γ) on H100 only and use it unchanged to predict H200 (whose own baseline is measured) — a genuine held-out cross-SKU ratio-transfer test — reaching 1.8% mean MAPE over 12 cells. A simple acceptance-free transfer baseline reaches a comparable 2.4% on the same cells, so we position the contribution as the host-amortization decomposition (which fixed cost is saved, and why open is slightly slower), not accuracy supremacy. (A prior leaky column that pooled α over both SKUs was corrected.)
No background is assumed. Three ideas are enough: how a draft-verify cycle works, why the dominant per-step cost on real hardware is a host term and not GPU compute, and what the textbook speedup model assumes.
With γ proposed tokens, the target model runs one forward pass over the γ+1 candidate positions (the current token plus γ drafts). Verification keeps the longest prefix that matches the target distribution; under greedy decoding it keeps every draft that matches the target's argmax. If a fraction α of drafts is accepted on average, the cycle emits αγ+1 tokens. This study uses n-gram (prompt-lookup) drafting, which copies candidate tokens from the prompt/history and so has zero draft-device cost — making the cycle almost purely one target forward pass plus one host step, the cleanest possible instance of the host-amortization regime.
Engines such as vLLM and Orca run an iteration-level scheduler: every decode step the CPU dequeues the running batch, updates sequence state, manages paged KV blocks, builds per-layer kernel arguments, and issues launches. In eager execution this host/scheduler work sits on the critical path, and at the small batches that dominate latency-sensitive serving it exceeds the GPU compute of the step. Crucially, a draft-verify cycle pays this host term exactly once — one scheduler iteration, one batch update, one launch sequence — regardless of how many positions it verifies.
The canonical analysis predicts the wall-clock improvement from the expected accepted length. In its purest device-bound form it treats each target forward pass as the unit of cost and predicts pot_dev(γ) = t_ver / (γ+1) — i.e. it assumes every proposed token is accepted, so the device-pass count falls by γ+1. The structural assumption is that the cost being divided is the device forward pass, and the model is silent on a host term. That assumption is exactly what fails when acceptance is low.
The model writes the per-output-token decode latency under speculation as one line. Its three pieces are determined independently — none is fit to the speculative cells the model is then asked to predict.
The no-speculation (γ=0) per-output-token step. With one token per step, the per-token latency IS the step time — the host-dominated decode step the portfolio characterizes. Taken from the γ=0 cell of the same configuration: it is the quantity being amortized, measured directly.
The small extra GPU cost of verifying γ+1 positions versus one, computed from a frozen single-GPU roofline predictor whose efficiencies come from standalone microbenchmarks. It is ≤ 2.3% across all γ and both SKUs — a device-roofline property, not a fit. Its smallness IS the host-amortization premise.
Acceptance is measured directly from the vLLM engine's speculative counter, α = num_accepted_tokens / num_draft_tokens — a latency-free count never derived from the latency it predicts. This de-tautologizes the model: substituting the counter α is a genuine prediction, not a rearranged identity. The counter pins α=1.00 on repeat and α→0 (≤0.020) on open. (An earlier estimate inverted the equation for α from timing — circular by construction — now demoted to a cross-check only.)
Rearranging (1) gives the speedup over the γ=0 baseline directly, and it is governed almost entirely by acceptance:
Two limits follow. High acceptance (α→1): speedup → γ+1, the host term amortized over the full proposal. Zero acceptance (α→0): speedup → 1/(1+d) ≲ 1 — slightly slower than baseline, because the cycle still pays the host term once but emits one token and absorbs the d(γ) verify overhead. The textbook device-pass model cannot express the second limit: it predicts (γ+1)× regardless of acceptance.
All measurements are fresh runs on the PACE Phoenix cluster, NVIDIA H100-80GB and H200 nodes, vLLM with eager execution and prefix caching disabled, Llama-3.1-8B-Instruct with n-gram (prompt-lookup) speculation. Two workloads are constructed to bracket acceptance: repeat (the prompt asks the model to reproduce a passage verbatim, so n-gram lookup hits frequently — high acceptance) and open (non-repeating creative continuation, so lookup rarely matches — near-zero acceptance). Both use a 1024-token context. The sweep is γ ∈ {0,2,4,6}, batch N ∈ {1,4}, 12 warmup and 10 timed reps per cell, medians — giving 24 clean speculative cells (γ > 0) across two SKUs and two workloads, each anchored to its γ=0 baseline.
On the repeat workload the per-token latency falls steeply with γ, reaching 6.2× at γ=6. On the open workload, the same γ values yield 0.98× — no speedup at all. The only difference between the two is acceptance; the device verify cost is identical. This is the qualitative signature of host-term amortization: the benefit tracks the divisor αγ+1, not the proposal count. The two SKUs (H100 circles, H200 squares) lie almost on top of each other, because the speedup ratio is a workload property.

Figure 1. Measured per-token speedup over γ=0 versus γ, both SKUs. The high-acceptance ‘repeat’ workload scales nearly as γ+1 (up to 6.2×); the low-acceptance ‘open’ workload stays at 0.98× — proposing tokens that are not accepted saves nothing.
Plotting the measured per-output-token latency (points) against equation (1) (curves) on the same axes, the host term t_base is amortized over αγ+1 tokens. The repeat curve (α=1.00) collapses toward 1.5 ms; the open curve (α→0) stays flat near 9.6 ms. Both the baseline (γ=0, black point near 9.4 ms) and the speculative points are matched by the single equation, with the mechanism-predicted verify overhead d(γ) and the counter-measured acceptance.

Figure 2. One equation, both regimes. Measured per-output-token latency (points, H100 N=1) against equation (1) (curves), with the mechanism-predicted verify overhead d(γ) and acceptance. Repeat collapses (α=1.00); open stays flat (α→0).
We lead with the fully de-tautologized model: substitute the measured counter α into equation (1) with only the small device d(γ) — no timing-derived parameter, nothing taken from the latency it predicts. Its honest accuracy is 6.3% mean MAPE overall: 4.1% on open (the near-zero α correctly predicts ≈1×) but 8.4% on repeat, where it systematically under-predicts — every repeat cell — by 8.4% on average. We do not hide this behind a fitted α. The acceptance-blind device-pass view, by contrast, is tolerable on repeat (where acceptance happens to be near 1) but collapses on open, where it predicts a (γ+1)× speedup that does not occur — 43% mean error, 86% max.
| workload | counter α | acceptance-blind MAPE | de-tautologized model MAPE |
|---|---|---|---|
| open | →0 (≤0.020) | ~86% | 4.1% |
| repeat | 1.00 | ~8% | 8.4% (under-predicts) |
| all 24 cells | — | 43% | 6.3% |
Table 1. Per-output-token latency accuracy. Acceptance-blind is the textbook device-pass view (no acceptance input); the de-tautologized model uses the counter-measured α plus the small device d(γ), with no timing-derived parameter. The model honestly under-predicts repeat — that residual is the per-cycle host term, grounded independently below.
With acceptance pinned at α=1.00 by the counter, the ideal per-token speedup is αγ+1 = γ+1 = 7.0× at γ=6. The measured speedup is 6.15× (H200) — an 11% shortfall. The mechanism-predicted device verify cost d(γ) explains only 2.3% of it; the rest is the non-overlapped per-cycle host/scheduler term. We ground it independently: the per-verify-cycle residual is 0.77 ms, only 13.3% (range 5.7%–23.5%) of the independently nsys-measured 5.78 ms host floor. So a verify cycle pays a partial extra host/bookkeeping term, not a whole second baseline floor. Both inputs — α from the counter and the floor from nsys — are independent of the spec latency, so this residual is itself a de-tautologized result.

Figure 3. The host overhead, isolated. With acceptance measured at α=1.00 (counter), the ideal speedup is γ+1 (dashed). The measured speedup falls short; the shortfall splits into a small device verify cost d(γ) (grey) and a much larger host residual (hatched) — the per-cycle host term speculation amortizes, with acceptance pinned independently of latency.
The premise — that there is a fixed per-step host floor inside the decode step — is measured directly. vLLM V1 runs the model in an EngineCore subprocess, so we let nsys passively trace the whole process tree and run the identical 8B decode at 1 versus 512 generated tokens; differencing the GPU-kernel-time totals cancels load, warmup, and prefill, leaving exactly the per-step decode work. On H100 (ctx≈2048) the 8B decode step is 12.2 ms = 6.4 ms GPU-kernel time + 5.8 ms (47.4%) host-exposed. On Llama-3.2-1B the GPU term falls 4.4× to 1.4 ms but the host-exposed term is essentially unchanged at 5.6 ms (within 4.0%) — the signature of a host/scheduler cost, model-size-invariant. This is the fixed floor equation (1) amortizes over αγ+1 tokens.

Figure 4. Direct decode-step decomposition (H100, eager, N=1, ctx≈2048) by differencing two nsys runs. The host-exposed term is ≈5.8 ms and essentially model-size-invariant (4.0% apart at 1B vs 8B) even though 4.4× more GPU-kernel time scales with the model — an existence proof of the fixed host floor speculation amortizes.
The engine counter is unambiguous: on repeat α=1.00 at every γ (the n-gram drafter hits every token of the copy task), while on open α→0 (≤0.020). The earlier timing-derived estimate inverted equation (1) for α — circular, since α was inferred from the very latency it then predicts — and gave α≈0.89 on repeat, below the counter's 1.00. That gap is not lower acceptance (the counter proves every drafted token is accepted) but per-cycle overhead the timing-derived α silently absorbed. We retain the timing-derived estimate only as a cross-SKU stability diagnostic (below): the two SKUs' curves overlap closely, which licenses calibrating on H100 and predicting H200 held-out — what transfers is the latency ratio, with the counter supplying acceptance independently.

Figure 5. Timing-derived acceptance α per (workload, γ) on H100 and H200 — retained only as a cross-check (the counter pins the true α=1.00 repeat / →0 open). The two SKUs' curves nearly overlap, supporting α as a workload property that transfers across hardware, which licenses calibrating on H100 and predicting H200 held-out.
Calibrating acceptance on H100 cells only and applying it unchanged to H200 (whose own no-speculation baseline is measured), the model predicts the 12 held-out H200 speculative cells to 1.8% mean (4.1% max) MAPE. We deliberately do not overclaim: a fair, acceptance-free comparator — take H100's measured speedup ratio per (workload, γ) and apply it to H200's own baseline — reaches a comparable 2.4% on the same cells. We therefore frame the contribution as the host-amortization decomposition — the closed form tells an operator why the open workload is slightly slower and which fixed cost is saved, which a black-box ratio transfer does not — rather than beating the transfer on accuracy. (We corrected a prior leak: a released column had pooled α over both SKUs, letting H200 information enter its own held-out prediction; the honest H100-only number is 1.8%.) The parity plot below puts all 24 cells on a log-log diagonal: filled markers are H100 (calibration), hollow markers are H200 (held-out).

Figure 6. All 24 cells, model (equation 1) versus measurement, log-log. Filled markers are H100 (the pooled-α consistency cross-check); hollow markers are H200, predicted genuinely held-out with H100-only acceptance and H200's own measured baseline (1.8% mean MAPE). Both workloads span an order of magnitude in per-token latency and lie on the diagonal.
Given a target SKU and workload, the model predicts per-token latency at each γ in closed form, and therefore the marginal value of proposing more tokens: that value is ≈α per extra token and vanishes as acceptance drops. On a low-acceptance workload, speculation is at best break-even (and slightly harmful via d(γ)). The lever is raising acceptance, not γ — because the host term is fixed per cycle.
Serving-time speculation controllers empirically observe that speculative decoding can raise latency under load and tune the speculation length with goodput heuristics. This paper supplies the closed-form mechanistic reason — the host term per cycle is no longer amortized over enough accepted tokens — and predicts those regressions before deployment. The textbook device-pass model errs by 43% here precisely because it omits the host axis.
The claims are deliberately bounded. Each item names a specific way the result could be over-read and the precise scope that remains valid.
The conclusions hold for Llama-3.1-8B with n-gram drafting in eager vLLM on H100 and H200, at decode batch ≤ 4 with a 1024-token context. The central finding — that the speculative-decoding speedup is the amortization of a fixed per-step host term over the accepted tokens of a draft-verify cycle, with acceptance as the divisor — is the part expected to generalize beyond this grid; it is what makes both the up-to-6.2× high-acceptance speedup and the 0.98× low-acceptance non-speedup fall out of one equation.