LLM 推理服务¶
LLM 在线推理是一个带状态、强动态、同时受显存与调度约束的系统。优化目标通常不是单纯 tokens/s,而是在目标延迟 SLO 内最大化 goodput。
请求生命周期¶
sequenceDiagram
participant C as Client
participant G as Gateway
participant S as Scheduler
participant W as GPU Worker
C->>G: prompt + sampling params
G->>S: admission / queue
S->>W: dynamic batch
W->>W: Prefill(处理输入)
W-->>C: 首 token(TTFT)
loop Decode
W->>W: 读取 KV Cache + 生成下一 token
W-->>C: streaming token
end Prefill 与 Decode¶
- Prefill:一次处理输入序列,矩阵计算规模大,通常更容易利用 GPU 计算吞吐;它主导 TTFT。
- Decode:每步为活跃序列生成后续 token,需要反复读取权重和 KV Cache,单步较小、迭代次数多;它主导 TPOT/ITL。
两阶段资源特征不同。长 prompt 的 prefill 可能阻塞其他请求首 token;大量并发 decode 又可能占满 KV Cache。调度器需要在吞吐和交互延迟之间平衡。
核心指标¶
| 指标 | 含义 | 用户视角 |
|---|---|---|
| E2E latency | 请求到完整响应 | 总等待时间 |
| TTFT | 请求到第一个 token | 是否“很快开始回答” |
| TPOT / ITL | 首 token 后每 token 时间/相邻 token 间隔 | 流式输出是否顺滑 |
| input/output tokens/s | 输入处理与生成吞吐 | 系统产能 |
| goodput | 满足 SLO 的有效请求或 token 吞吐 | 性能与质量的结合 |
| queue time/depth | 排队时间与队列长度 | 是否进入过载 |
所有分位数都要按模型、输入/输出长度、优先级或租户切片;混在一起的 P99 很难解释。
KV Cache 容量¶
以常见 Transformer 为例,单请求 KV Cache 的粗略量级可写为:
其中 2 表示 Key 与 Value,\(L\) 是层数,\(S\) 是已缓存 token 数。实际实现还受 block/page 粒度、对齐、张量并行切分、数据类型与碎片影响。
因此容量不是“显存 / 单请求平均值”这么简单:请求长度分布、最大上下文、并发、prefix cache 命中与调度策略都决定真实上限。
为什么需要分页式管理¶
请求长度事先不确定,连续预留最大 KV 区域会浪费显存并造成碎片。vLLM 的 Paged Attention 设计把 KV Cache 组织为固定大小的 block/page,由调度和映射管理非连续内存,思路类似虚拟内存分页。它提高利用率,但仍需要监控 block 使用、抢占/重算与缓存命中。
动态批处理¶
Continuous batching 在每个调度步加入新请求、移除完成请求,比等待整个静态 batch 完成更适合输出长度不一的场景。
主要旋钮:
- 最大并发序列与最大 batched tokens;
- prefill chunk 大小与长 prompt 优先级;
- 等待窗口、优先级与 admission control;
- KV Cache 使用上限、抢占与重算策略。
增大 batch 往往提升吞吐,但可能增加排队和单 token 延迟;必须通过目标流量分布与 SLO 压测。
扩展方式¶
| 方式 | 何时用 | 关注点 |
|---|---|---|
| Data Parallel / 多副本 | 模型单副本可容纳,需要扩总流量 | 路由、队列均衡、缓存局部性 |
| Tensor Parallel | 模型或目标 batch 单卡放不下 | 高频跨卡通信,优先节点内快互连 |
| Pipeline Parallel | 模型需要跨 stage | bubble、stage 均衡、跨 stage 激活 |
| Prefill/Decode 分离 | 两阶段资源或扩缩需求差异显著 | KV 传输、路由、调度与系统复杂度 |
过载保护¶
没有 admission control 的服务会在突发流量下让队列无限增长,最终所有请求都超时。建议:
- 按模型/租户设并发与 token 预算,而不只按 request 数。
- 在网关和调度器暴露 queue time/depth、rejection、timeout。
- 设最大输入、最大输出和合理超时;流式连接也要有背压。
- 扩容考虑模型加载与 warmup 时间,不能等 GPU 已饱和才开始。
- 超载时快速拒绝或降级,保护已接纳请求的 SLO。
压测矩阵¶
至少覆盖:
- 短输入/短输出、长输入/短输出、短输入/长输出;
- 稳态、阶跃、突发和渐增流量;
- 冷启动、扩容、模型发布和副本故障;
- 不同 sampling、LoRA、量化或 prefix cache 场景;
- 开环到达率与闭环固定并发两种压测模型。
输出 Pareto 曲线:在不同并发与 batch 配置下,同时展示 goodput、TTFT P99、TPOT P99、显存和成本。