跳转至

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 的粗略量级可写为:

\[ M_{KV} \approx 2 \times L \times N_{kv\_heads} \times D_{head} \times S \times Bytes \]

其中 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 的服务会在突发流量下让队列无限增长,最终所有请求都超时。建议:

  1. 按模型/租户设并发与 token 预算,而不只按 request 数。
  2. 在网关和调度器暴露 queue time/depth、rejection、timeout。
  3. 设最大输入、最大输出和合理超时;流式连接也要有背压。
  4. 扩容考虑模型加载与 warmup 时间,不能等 GPU 已饱和才开始。
  5. 超载时快速拒绝或降级,保护已接纳请求的 SLO。

压测矩阵

至少覆盖:

  • 短输入/短输出、长输入/短输出、短输入/长输出;
  • 稳态、阶跃、突发和渐增流量;
  • 冷启动、扩容、模型发布和副本故障;
  • 不同 sampling、LoRA、量化或 prefix cache 场景;
  • 开环到达率与闭环固定并发两种压测模型。

输出 Pareto 曲线:在不同并发与 batch 配置下,同时展示 goodput、TTFT P99、TPOT P99、显存和成本。

延伸阅读