KVTop
Serving · Speculative decoding · GLM-5.3 on RTX 5090

MTP made a single request faster. What happens when more requests arrive?

+33%c = 1MTP config vs baseline, client tok/s (+58% with n-gram drafts)
≈ 0c ≥ 8+2% at c = 8, −2% at c = 16 and 32
+42%TTFT p50, c = 32MTP config vs baseline
n = 1evidenceone 300 s window per point; deployment-level comparison
Core result · measured
+20.9%c = 1: turning drafting on52.7 tok/sdrafting off63.7 tok/sdrafting on+12.1%c = 8: turning drafting off328.4 tok/sdrafting on368.3 tok/sdrafting off
Can choosing when to draft recover throughput? The same MTP deployment, only the draft width differs. Drafting helps one request at a time (+20.9%) and costs throughput at c = 8, where switching it off gives +12.1%. One 300 s window per point (n = 1); no c = 16/32 point for this pair. These are two measured points, not a tested adaptive policy.
model
GLM-5.3, 2-bit GGUF (IQ2_XXS routed experts), MTP layer in Q2_K
layout
prefill and decode disaggregated: P on 8×RTX 5090 (PP8), D on a second host (PP4)
runtime
SGLang fork @ d84527b3
draft
MTP + n-gram extension; width controller
workload
thinking-agent trace replay, 40 s burn-in + 60 s warmup, 300 s window
metric
aggregate output tokens/s seen by the client over the window
repeats
n = 1 per point

Source: run dw1iso2 · results.jsonl (internal) · d84527b377

You enable multi-token prediction, run a request, and watch the tokens arrive faster. For someone waiting on that response, the improvement is straightforward.

Then you increase the load. More requests arrive, batches change, and memory fills up. Does the single-request speedup still translate into a better service?

In an earlier KVTop test series, the benefit at low concurrency did not persist as concurrency increased. That result applied to the model, implementation, workload, and memory budget we tested. It raised a practical question: where does MTP help, and what changes as the server gets busier?

What made the first request faster?

In the decoding approach considered here, MTP proposes multiple candidate tokens for verification. When enough candidates are accepted and verification is efficient, the request can advance several tokens with fewer sequential decoding steps.

The gain depends on how much useful progress each iteration makes relative to its cost. Drafting takes time, verification takes time, and rejected candidates represent work that does not become accepted output.

For a single request, we can measure that trade-off directly: how long does it take to produce the accepted output tokens?

What changes when those requests share a busy server?

The same work now competes for resources with other requests.

Drafting and verification consume compute. Depending on the implementation, additional state or memory reservations can also affect how many requests fit and how the runtime batches them.

This creates several possible outcomes. MTP might preserve its advantage as load rises. Its benefit might shrink as verification becomes more expensive. Or changes in memory availability and admission might leave more requests waiting.

The following curves compare deployment bundles in a historical closed-loop concurrency sweep; they do not isolate MTP or measure a controlled request-arrival rate.

Figure 1 · measured
0240480720960120012481632Baseline deploymentMTP deploymentMTP + n-gram deploymentclosed-loop concurrency c (clients)aggregate output (tok/s)
Does more output also mean less waiting? Aggregate throughput. Same run, build and machines; one 300 s window per point (n = 1). The three curves nearly coincide from c = 8: the MTP deployments' early gain does not carry into throughput under load. The MTP arms also change KV settings and the layer split, so this compares deployments, not one switch.
model
GLM-5.3, 2-bit GGUF (IQ2_XXS routed experts), MTP layer Q2_K
layout
prefill and decode disaggregated: P on 8×RTX 5090 (PP8), D on a second host (PP4)
runtime
SGLang fork @ 39ef63a1
arms
baseline (no MTP) · MTP (draft widths 1, 2) · MTP + n-gram drafts (widths 1, 2, 4)
workload
agent trace replay (table-131072), 300 s window per concurrency
metric
aggregate output tokens/s seen by the client; TTFT p50
repeats
n = 1 per point

Source: run mtpng-20261010T104041 · results.jsonl L3–8, L11–16, L19–24 (internal) · 39ef63a121

Figure 2 · measured
00.511.522.512481632Baseline deploymentMTP deploymentMTP + n-gram deploymentclosed-loop concurrency c (clients)TTFT p50 (s)
Does more output also mean less waiting? Time to first token. Same run as the throughput curve. Median time to first token rises faster with the MTP deployments as load grows (+42% at c = 32 for MTP). n = 1 per point; no inter-token latency percentiles were recorded for this run.
model
GLM-5.3, 2-bit GGUF (IQ2_XXS routed experts), MTP layer Q2_K
layout
prefill and decode disaggregated: P on 8×RTX 5090 (PP8), D on a second host (PP4)
runtime
SGLang fork @ 39ef63a1
arms
baseline (no MTP) · MTP (draft widths 1, 2) · MTP + n-gram drafts (widths 1, 2, 4)
workload
agent trace replay (table-131072), 300 s window per concurrency
metric
aggregate output tokens/s seen by the client; TTFT p50
repeats
n = 1 per point

Source: run mtpng-20261010T104041 · results.jsonl L3–8, L11–16, L19–24 (internal) · 39ef63a121

The crossover itself does not tell us which explanation is correct. We need to inspect the execution and resource behavior around it.

In particular, submitting the same number of requests to both configurations does not guarantee that the server is executing the same number at once. Some may be active while others are still waiting for admission.

If the acceptance rate is high, why might the service still gain little?

Acceptance rate tells us how much proposed work survives verification. It does not tell us the full cost of producing that work.

Two runs can have similar acceptance rates and different drafting times, verification costs, or batch shapes. They can also leave different amounts of capacity available for other requests.

A useful comparison therefore tracks accepted tokens per iteration alongside iteration time. At the service level, it also follows requests through admission, execution, and completion.

That connects the local decoding gain to what users experience: how soon their response starts, how steadily it arrives, and how long it takes to finish.

How do we find the load range where MTP helps?

Keep the model, weights, quality criteria, GPU topology, and request-length distribution fixed. Compare MTP on and off while gradually increasing the request arrival rate.

At each load level, record actual active concurrency as well as queued requests. Track drafting and verification time, memory use, time to first token, and inter-token latency.

Then measure how much work completes within the chosen latency targets. State whether that means completed requests or their output tokens, and report failures and cancellations separately so they cannot disappear behind a throughput average.

If the curves diverge, investigate what changed at that point. A rise in verification cost calls for a different experiment from a drop in admitted concurrency. Traces and controlled comparisons are what let us move from observing the crossover to explaining it.

Should MTP be enabled by default?

The answer should follow the workload we expect to serve.

Figure 3 · measured
0.87×1×1.34×1.68×+33%+58%c = 1base 63 tok/s+9%+28%c = 2base 128 tok/s+7%+9%c = 4base 239 tok/s+2%+1%c = 8base 408 tok/s−2%−1%c = 16base 655 tok/s−2%−1%c = 32base 971 tok/sMTPMTP + n-gram draftsMTP configuration ÷ baseline (client tok/s)
Does the deployment-level MTP advantage survive rising concurrency? Same run, build and machines; one 300 s window per point (n = 1). At c = 8 the observed advantage is about 1.9% for MTP and 1.5% with n-gram drafts; it is slightly negative at c = 16 and 32. These small differences have no independent-repeat uncertainty estimate. The arms also change KV settings and layer split, so this compares deployment bundles, not one switch.
model
GLM-5.3, 2-bit GGUF (IQ2_XXS routed experts), MTP layer Q2_K
layout
prefill and decode disaggregated: P on 8×RTX 5090 (PP8), D on a second host (PP4)
runtime
SGLang fork @ 39ef63a1
arms
baseline (no MTP) · MTP (draft widths 1, 2) · MTP + n-gram drafts (widths 1, 2, 4)
workload
agent trace replay (table-131072), 300 s window per concurrency
metric
aggregate output tokens/s seen by the client; TTFT p50
repeats
n = 1 per point

Source: run mtpng-20261010T104041 · results.jsonl L3–8, L11–16, L19–24 (internal) · 39ef63a121

A lightly loaded interactive deployment may benefit from a setting that becomes less attractive under sustained load. Both results are useful, provided we report the conditions and verify that output quality remains acceptable.

The single-request test gives us the first answer. The load sweep tells us how far that answer carries.

Before choosing a default, we want to know where MTP improves the service—and what happens when traffic moves beyond that range.

Method

ModelGLM-5.3, 2-bit GGUF (IQ2_XXS routed experts); MTP layer Q2_K
Hardware / layoutPrefill/decode disaggregated: P 8×RTX 5090 (PP8), D on a second host (TP2 × PP4)
RuntimeSGLang fork @ 39ef63a1 (sweep); @ d84527b3 (isolation pair)
ArmsBaseline without MTP · MTP config (widths 1, 2) · MTP + n-gram (widths 1, 2, 4); isolation pair differs only in draft width
WorkloadAgent trace replay; one 300 s window per point after burn-in and warmup
LoadClosed loop at concurrency c = 1, 2, 4, 8, 16, 32 (not an arrival rate)
MetricClient-side aggregate output tok/s; TTFT p50/p99; per-stream decode p50; per-token latency not recorded
Repeats1 per point

Evidence and references

Code and data for this note will be released as open source; more is coming.

What this does not show

The cause of the crossover (memory, admission, verification cost, queueing) needs ablations before it can be named. Numbers from different GLM models or P/D layouts cannot be placed on one chart. The engineering log's candidate explanation is the draft-KV reservation: the draft pool was sized at a multiple of the logical space, which held admission well below the client concurrency. No ablation has tested it.