Skip to content

perf(server): decode runs ~11% slower after a prompt-cache hit than after a cold prefill #730

Description

@inureyes

Context

While validating the #632 lookahead decode pipeline on GB10 (CUDA 13.0, branch perf/632-scheduler-async-eval-lookahead, 2026-07-10), repeated bench_serving_concurrency.py --concurrency 1 --prompt-tokens 512 --max-tokens 512 runs against one server instance (qwen2.5-0.5b-bf16) are bimodal on decode throughput depending only on whether the synthetic prompt hit the server prompt cache.

Evidence

Cache-miss runs (TTFT ~285-296 ms, full prefill): decode 182.4-185.0 tok/s. Cache-hit runs (TTFT 13-44 ms, prompt-cache: cached=448/461): decode 161.9-164.6 tok/s, i.e. ~11% slower decode for the identical request. The /metrics lookahead counter increments 509 per 512-token run in BOTH modes, so the #632 pipeline engages fully either way; the penalty is not pipeline disengagement. Reproduced 5 times (3+2 samples).

Suspects (unverified)

The restored/donated KV cache's internal layout after a prompt-cache hit (block rounding, fragmentation, or a dense-concat restore that grows differently during decode), per-step cache-append cost differing between a freshly prefilled cache and a restored one, or attention kernel behavior at slightly different internal cache capacities.

Suggested next step

Profile one hit run and one miss run with nsys (--cuda-graph-trace=node) and diff the per-step kernel composition and any reallocation/copy activity in the decode phase; check whether the restored cache path skips a capacity reservation the prefill path performs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:inferenceGeneration, sampling, decoding (incl. speculative, DRY)priority:lowLow prioritystatus:readyReady to be worked ontype:performancePerformance improvements

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions