14.1 LLM 推理服务:Prefill、Decode、KV Cache 与容量
单个短请求很快,不代表混合负载下队列仍短。长 prompt 消耗 prefill 容量,长回答持续占用 KV blocks;有用的容量测试要同时覆盖两者,以及取消和突发请求。
自回归 LLM 服务既有计算密集的 prefill,也有逐 token 的 decode。容量设计要同时考虑队列、显存、输入输出长度和延迟目标,不能只报告每秒生成多少 token。
本课目标
- 区分 prefill 与 decode 的计算和延迟指标;
- 解释 batching、KV cache 和内存碎片如何影响并发;
- 比较复制、张量/流水线并行与 prefill–decode 分离;
- 设计 admission control、backpressure、取消与降级;
- 用代表性 workload 测量 goodput 和单位成功任务成本。
1. 先定义请求合同
一个推理请求不只是 prompt:
model revision + tokenizer/chat template
input tokens / multimodal assets
max output tokens + stop conditions
sampling / structured-output constraints
priority / tenant / deadline
streaming / cancellation
adapter / tool schema / safety policy versions如果服务端静默替换模型、template 或生成参数,相同 API body 也可能产生不同语义。请求和 trace 都要关联 resolved versions。
2. Prefill 与 Decode 是两种工作负载
Prefill
服务处理全部输入 token,计算各层 hidden states,并为 attention 建立 key/value cache。长 prompt 会增加 prefill 计算和显存占用。用户感受到的 Time to First Token(TTFT)包含排队、预处理、prefill 和首 token 生成。
Decode
之后每轮追加一个或少量 token,复用历史 KV cache,但仍需按序执行。Time Per Output Token(TPOT)或 Inter-Token Latency(ITL)决定流式输出是否平滑。
端到端延迟近似由:
同一个“P95 延迟”会把长输出和排队混在一起。至少分别报告 TTFT、TPOT/ITL、E2E、queue time 和 output length。
这里 TTFT 截止到观察到首个输出 token;通常 prefill 已计算出选择它所用的 logits。ITL 计量后续 token 间隔,
3. 静态 Batch 为什么不适合所有生成请求
静态 batching 等齐一批请求并一起运行;短请求可能被最长请求拖住,新请求也要等当前 batch 完成。Iteration-level/continuous batching 在 decode 迭代边界加入新请求、移除已完成请求,提高设备利用率。
Batch 越大不一定延迟越低:它可能提高 throughput,却增加 queueing、单步时间和尾延迟。Scheduler 要在吞吐、TTFT、TPOT、priority 和公平性之间权衡,并防止长 prompt 或长输出长期占用 slots。
测试 mixed workload:短问答、长上下文、长生成、多租户 priority 和 burst,而不是只跑固定长度 synthetic prompts。
4. KV Cache 常是并发瓶颈
每个活跃 sequence 保存各层 K/V tensors,大小随层数、KV heads、head dimension、context length、dtype 和 batch/concurrency 增长。模型 weights 放得下不代表能承载目标并发。
普通 full-attention K/V 存储的每序列字节数约为
请求长度不同会造成 cache allocation 和碎片。PagedAttention 一类设计把 KV cache 分页管理,减少连续大块预留和碎片;它改善内存利用,不会消除 KV 随 token 增长的事实。
监控:
- weight 与 KV/activation/workspace memory;
- cache block utilization、eviction 和 allocation failure;
- active/queued sequences 与长度分布;
- prefix-cache hit 和实际节省的 prefill tokens;
- out-of-memory、preemption 和 recomputation。
5. Prefix Cache 复用计算,不复用答案
多个请求共享完全相同的 system prompt、few-shot examples 或文档前缀时,可以复用对应 KV blocks。命中要求 token IDs 和相关模型状态兼容;文本看起来相同但 tokenizer、template、adapter 或 model revision 不同,cache 不可混用。
Prefix/KV cache 降低 prefill 成本,仍会为每个请求独立 decode。它不是长期 memory,也不是 response cache。缓存内容可能含租户数据,必须隔离、限制生命周期并在版本变化时失效。
6. 并行与复制解决不同瓶颈
- Replica / data parallel serving:每个副本持有完整模型,便于横向扩展请求;需要足够单机/单节点内存。
- Tensor parallelism:一层矩阵切到多设备;降低单设备 weight 占用,但每层产生通信。
- Pipeline parallelism:不同 layers 放在不同 stages;需要处理流水线气泡和 microbatch 调度。
- Expert parallelism:MoE experts 分布到设备;routing imbalance 和 all-to-all 成为关键。
- Prefill–decode disaggregation:两阶段分配不同资源并传输 KV;可分别优化 TTFT/TPOT,但引入 KV 传输、路由和容量耦合。
最优拓扑取决于模型、硬件互联、输入输出长度和 SLO。不能把某论文或某 GPU 上的倍数直接用于自己的容量预算。
7. Quantization 的收益必须端到端验证
低 bit weight quantization 可减少 weight memory 和带宽,有时提高吞吐;质量损失、kernel support、scale/zero-point overhead、KV cache dtype 和 dequantization 都会影响结果。
“4-bit 模型”通常只描述部分权重表示,不表示 activations、KV cache 和所有计算都是 4-bit。验证:
- 目标硬件和 batch/length 下的 latency/throughput;
- 关键任务、语言、长上下文和 safety regression;
- structured output、logprob 和 sampling 行为;
- quantized artifact 的 exact config 与 serving kernels;
- fallback 到未量化版本时的容量影响。
8. Speculative Decoding 不是免费并行
Speculative decoding 让较小 draft model 提议多个 token,再由 target model 并行验证;在满足算法条件时可保持 target distribution,同时减少 target serial steps。
收益取决于 acceptance rate、draft cost、batch、序列长度和硬件。Draft 与 target 不匹配时,额外计算可能抵消收益。报告 accepted tokens/step、draft overhead、TTFT/TPOT 和质量/分布验证,不只报告峰值加速。
精确 speculative sampling 需要接受与纠正规则:target 概率为
9. Admission Control 与 Backpressure
队列无限增长会把过载变成超时风暴。入口根据 estimated input/output tokens、deadline、priority、tenant quota 和当前 KV/compute capacity 决定接受、排队、降级或拒绝。
必要机制:
- request size/max output 上限;
- per-tenant concurrency/token budget;
- bounded queues 与 queue timeout;
- priority 防饥饿;
- client disconnect/cancel 及时释放 decode 和 KV;
- load shedding 与 Retry-After;
- circuit breaker 防止上游重试放大;
- streaming backpressure,避免慢客户端占住资源。
估计 max_tokens 不能等同实际输出,但必须进入最坏情况预算。
10. Capacity 看 Goodput,不只看 Throughput
Throughput 统计完成的 requests/tokens;goodput 只统计满足质量和 SLO 的有效工作。设备满载但大部分请求超过 TTFT,吞吐数字没有产品意义。
压测报告包含:
- arrival pattern:steady/burst/diurnal;
- input/output length joint distribution;
- model/adapter/structured-output mix;
- concurrency 与 tenant/priority mix;
- TTFT、TPOT、E2E 的 P50/P95/P99;
- success/cancel/reject/timeout/OOM;
- goodput、GPU utilization、KV utilization;
- energy/compute/token 和 cost/successful task;
- warm/cold start 与 failure scenarios。
用 replay 或经隐私处理的真实分布校准 synthetic load,并保留峰值余量与故障副本余量。
常见误区
- 模型能装进显存就能服务:活跃请求的 KV cache 可能先耗尽内存。
- Tokens/s 越高体验越好:TTFT、TPOT 和尾延迟可能恶化。
- Continuous batching 总会提高所有指标:调度权衡依赖 workload。
- Prefix cache 命中就能直接返回答案:它只复用前缀计算。
- 量化只影响精度:也会改变 kernel、显存、吞吐和兼容性。
练习
- 为短问答和长文总结分别写 TTFT/TPOT/E2E SLO。
- 列出估算单请求 KV cache 所需的参数。
- 设计包含 burst、长上下文和取消的压测 workload。
- 比较 replica、tensor parallel 与 prefill–decode separation 的瓶颈。
- 定义一个排除超时和质量失败的 goodput 指标。
小结
LLM serving 的核心约束来自 prefill/decode 两阶段、逐 token 依赖、KV cache 与队列。Batching、分页 cache、并行、量化和 speculative decoding 都是有条件的优化;最终要用目标 workload 下的 TTFT、TPOT、goodput 和单位成功成本证明价值。
下一课把多个模型和供应商放到同一入口后面,讨论路由、fallback 和版本合同。
参考资料
- Yu et al., Orca: A Distributed Serving System for Transformer-Based Generative Models
- Kwon et al., Efficient Memory Management for Large Language Model Serving with PagedAttention
- Leviathan et al., Fast Inference from Transformers via Speculative Decoding
- Zhong et al., DistServe: Disaggregating Prefill and Decoding