home/tutorial/M6 frontier serving

Month 6 · 前沿 serving 系统

从 mini-vLLM 走向生产系统:prefill/decode 分离、KV cache 体系、prefix-aware routing、speculative decoding、FP8/KV 量化、MoE/MLA serving。

M5 结束时,你已经能写一个单机 toy engine。下一步不是把 toy engine 再堆 20 个 feature, 而是学会生产系统在什么约束下选择 feature:什么请求该走 prefix cache,什么请求该拆 prefill/decode, 什么请求投机解码反而变慢,什么时候 KV transfer 会成为新的瓶颈。

驱动问题
你有 8 张 H100、一个 70B 模型、请求分布长短混杂:有 1k token 聊天,也有 80k token RAG。 产品给了两个 SLO:TTFT p90 < 1.5s,ITL p99 < 80ms。你不能只说"上 vLLM"。 你要怎么拆 GPU 池、怎么路由、怎么缓存 KV、怎么判断优化真的赢了?
目标函数
从 raw throughput 转成 goodput:满足 TTFT/ITL SLO 的请求率。
核心资源
KV cache 不只是显存对象,也变成跨实例的存储和通信介质。
系统形态
prefill 池、decode 池、KV/cache 层、router、metrics 成为一套控制系统。
学习产出
做一个 v0.6 frontier fork:模拟、测量、解释取舍。

01先补知识断层:单机 engine 到生产 serving

这份教材前 5 个月已经把单机 vLLM 的核心闭环走通了:入口、KV 分页、scheduler、kernel、mini-vLLM。 明显的缺口只有一个:你还没把这些模块放进多实例、多 GPU 池、多 SLO、多租户的生产环境里看。

M5:单机 mini-vLLM HTTP / Engine Scheduler KV Block Pool 一个进程里做所有事 M6:生产 frontier serving Router Prefill pool compute-bound Decode pool memory-bound KV cache / connector GPU · CPU · SSD · remote 系统化
M5 解决"一个 engine 怎么工作";M6 解决"多个 engine 如何在 SLO、缓存、网络和成本下协同"。

所以后续学习不缺基础,缺的是判断力框架。真实生产里,优化不是越多越好,而是要问: 当前 workload 的瓶颈是 prefill 算力、decode 带宽、KV 容量、KV 传输、还是排队延迟?

02新目标函数:Goodput,而不是 Tokens/s

老 benchmark 喜欢报 tokens/s。生产 serving 更关心:在 TTFT 和 ITL 都满足 SLO 的前提下,每张 GPU 能承载多少请求。 这就是 DistServe 论文强调的 goodput 视角:同样吞吐,如果 p99 ITL 爆掉,它对产品没有价值。

指标看什么常见误判应该怎么用
TTFT用户多久看到第一个 token只看平均值,忽略长 prompt 的尾部按 prompt length bucket 看 p90/p99
ITL / TPOT流式输出是否顺滑把 prefill 和 decode 混在一个延迟里decode 阶段单独设 SLO,重点看尾延迟
Queue time容量是否已经耗尽GPU utilization 高就以为健康排队上升通常比 GPU 利用率更早报警
KV cache usage显存是否被上下文吃掉只看 weight 大小,不算 KV按模型结构和上下文长度估算 tokens in flight
Goodput满足 SLO 的请求率吞吐高但 SLO 违约所有优化都用 goodput 对账
读源码 / 文档锚点
vLLM Production Metrics DistServe OSDI 2024
先把 TTFT、time_per_output_token、queue_time、prefill_time、decode_time、KV cache usage 这些指标在 Prometheus/Grafana 里找出来,再谈优化。

03Prefill / Decode 分离:为什么它突然成了主线

prefill 和 decode 的资源画像完全不同。prefill 一次吃掉整个 prompt,矩阵乘大、算力密集;decode 每步只生成 1 个 token, 主要被 weight/KV 读取和 kernel launch 限制,常常是 memory-bound。把两者合在一个 batch 里,长 prompt 会打断正在流式输出的请求。

Request Prefill worker prompt tokens 生成 KV KV transfer NIXL / RDMA GPU to GPU Decode stream token 守住 ITL Prefill pool TP 小一点 Router 按 overlap + load Decode pool TP 大一点 拆分以后,每个池可以独立扩缩容、独立并行策略、独立 SLO。
DistServe / Splitwise / Mooncake / Dynamo / vLLM disaggregated prefill 都围绕这个基本形状展开。

但分离不是免费午餐。你省掉 prefill/decode 干扰的同时,引入了KV transfer: 如果 prompt 很短、模型很小、互联很慢,传 KV 的时间会吃掉收益。生产系统要做的是有条件地分离,而不是宗教式地分离。

04KV cache 变成系统边界

在 M2 里,KV cache 是 GPU 内的一组 block。到 M6,它变成三件事: 显存容量问题跨实例缓存问题跨 GPU 通信问题。 这就是 Mooncake 和 LMCache 这条线的关键。

Prefix cache:同前缀复用

vLLM 用 block hash 识别已经算过的 KV block。长文档、多轮 RAG、固定 system prompt 最容易赢。

读:vLLM Automatic Prefix Caching

Prefix-aware routing:把请求送回同一实例

如果 cache 只在本地 GPU,router 就要维护 locality。否则命中了逻辑前缀,却打到没有 KV 的 replica。

读:vLLM Production Stack prefix-aware routing

KV transfer:prefill 算完以后把 KV 交给 decode

需要 connector、传输元数据和高速互联。vLLM 当前把 disaggregated prefill 实现放在 KV transfer 相关模块下。

读:vLLM disaggregated prefill / Dynamo NIXL

KV cache layer:CPU / SSD / remote cache

LMCache 把可复用 KV 从 engine 里抽出来,cache hit 时注入 KV,miss 时正常 prefill,并异步写回。

读:LMCache integration
判断规则
KV 优化的收益取决于三个数:复用率KV 大小取回/传输成本。 复用率低时,远程 cache 是复杂度;长上下文高复用时,它才是杠杆。

05投机解码:decode 阶段的并行化

decode 难的地方是自回归:不生成第 t 个 token,就不知道第 t+1 个 token。Speculative decoding 的技巧是: 让便宜 proposer 先猜多个 token,再用 target model 一次性验证。接受率高、draft 成本低时,ITL 会明显下降。

方法适用场景工程注意读什么
Draft model有一个足够便宜的小模型,且分布接近 targetdraft 太贵或接受率低会倒亏vLLM speculative decoding docs
EAGLE / Medusa希望避免维护完整小模型,改用轻量 head / feature proposer需要模型适配或额外 headEAGLE、Medusa、vLLM EAGLE
MTP模型本身训练了 multi-token prediction 能力要确认 serving engine 支持对应模型路径DeepSeek-V3 technical report、vLLM MTP
N-gram / suffix代码、模板、重复文本,低峰期想便宜提速收益较温和,但部署复杂度低vLLM n-gram speculation

面试里不要只背"2-3x 加速"。更好的答案是:它把一次 target forward 产出的有效 token 数从 1 提高到 E[k], 但代价是 draft 计算、batch 扩张、KV 管理和拒绝 token 浪费。高 QPS 时,额外 workload 可能让系统更拥堵。

06量化和新模型结构:不是只省显存

FP8 W8A8、FP8 KV cache、INT4 weights、AWQ/GPTQ 这些常被讲成"模型变小"。 在 serving 系统里,它们的真实作用是改变容量、带宽、批大小和上下文长度的边界。

FP8 / KV cache quantization

KV cache 往往随上下文和并发线性增长。FP8 KV 能显著降低 KV footprint,让同样显存容纳更多 in-flight tokens 或更长 context。代价是硬件/attention backend 支持、scale 校准、准确率验证。

MoE / MLA / MTP

DeepSeek-V3 这类模型把 serving 问题改写了:MoE 带来 expert parallel 和 all-to-all,MLA 压缩 KV,MTP 给投机解码提供模型内能力。系统工程开始反过来被模型结构塑形。

读源码 / 文档锚点
vLLM Quantized KV Cache vLLM FP8 W8A8 DeepEP
把"省显存"翻译成系统语言:更大 batch、更长 context、更少 KV transfer bytes、更高 cache residency,还是更便宜的硬件?

07交互实验:给 workload 选优化栈

下面这个小模型不是严谨 benchmark,而是训练你的判断力。拖动参数,看瓶颈怎么从 prefill 转到 decode, 或从 GPU 计算转到 KV transfer / KV capacity。

Serving bottleneck sketch 粗略估算 · 训练直觉用
Prefill pressure
0.00
Decode pressure
0.00
KV transfer tax
0ms
KV memory need
0GB
瓶颈判断
拖动参数后会自动更新。

08决策表:看到现象后该动哪里

现象第一怀疑优先动作不要急着做
TTFT 长,ITL 正常prefill 重、排队或 prefix cache 没命中按 prompt length 分 bucket;开 APC;prefix-aware routing;长 prompt 试 disagg prefill盲目加 decode GPU
TTFT 正常,ITL p99 爆decode 被 prefill 插队或 decode pool 太满chunked prefill 或 P/D 分离;spec decode;看 time_per_output_token只看总 tokens/s
GPU cache usage 快满上下文长、并发高、KV footprint 大FP8 KV;降低 max model len;更强 admission control;CPU/SSD cache tier只量化 weights
分离后反而慢KV transfer tax 或 router 选错测 KV bytes/request;按 topology 放置;短 prompt 走本地 prefill把所有请求强制 disagg
RAG 多次问同一文档仍很慢cache locality 没利用固定文档 prefix;cache_salt 隔离租户;prefix-aware routing;LMCache只扩 GPU
MoE 模型吞吐差expert parallel 通信和负载均衡看 all-to-all、EP/DP 配置、expert 热点;读 DeepEP / vLLM MoE kernel套 dense model 的经验

09你的 mini-vLLM v0.6:四个可交付方向

M6 不要求你重写生产 vLLM。要求是选一个方向,把 toy 系统升级成能解释取舍的实验平台。 简历上最值钱的不是"我也实现了 feature",而是"我能说清在什么 workload 下它赢,什么 workload 下它输"。

A. P/D 分离 simulator

  • 把 mini scheduler 拆成 prefill queue 和 decode queue。
  • 加 KV transfer cost 参数。
  • 输出 TTFT/ITL/goodput 曲线。

B. Spec decode prototype

  • 用 n-gram 或小 draft proposer 先做 lossless 验证。
  • 记录 acceptance rate、expanded batch size、ITL。
  • 写一段"什么时候倒亏"分析。

C. Prefix-cache-aware router

  • 给 2-4 个 replica 做 prompt-prefix hash。
  • 比较 round-robin、least-load、prefix-aware。
  • 加 cache_salt 的租户隔离说明。

D. FP8/KV capacity benchmark

  • 估算每 token KV bytes。
  • 比较 fp16/bf16 KV 与 fp8 KV 的最大并发和上下文长度。
  • 补一张 accuracy sanity check 表。
推荐选择
如果你目标是 infra / serving 岗位,优先做 A + C:它们最能展示系统判断力。 如果你更偏 kernel / inference optimization,做 B + D:它们能自然接到 M4 的性能线。

10最近前沿怎么读:一张研究地图

这不是新手要一口气读完的清单,而是你遇到具体问题时的索引。读法仍然保持本教材的三问: 它解决什么瓶颈?它引入什么新代价?它在 vLLM/production stack 里对应哪一层?

方向代表材料你要抓的主线
P/D 分离与 goodputDistServe、Splitwise、NVIDIA Dynamo disaggprefill/decode 异构资源、双 SLO、KV transfer topology
KV-centric servingMooncakeLMCache、vLLM connectorsKV 从 engine 内部状态变成 cache/storage/communication layer
Prefix 与结构化调用SGLang、RadixAttention、vLLM prefix caching多轮、RAG、agent workflow 的共享前缀和路由 locality
Decode 加速vLLM speculative decoding、Medusa、EAGLE、MTP接受率、draft 成本、batch 扩张、lossless guarantee
低精度 servingvLLM FP8Quantized KV Cache、AWQ/GPTQ显存容量、HBM 带宽、accuracy regression、backend 支持
MoE / MLA / MTPDeepSeek-V3 reportDeepEP模型结构改变 KV、通信和并行策略

11本页自检

Month 6 结束时这些应该全部 ✓


本章参考了 vLLM disaggregated prefill / prefix caching / speculative decoding / quantization 文档, DistServe (OSDI 2024)、Mooncake、SGLang、LMCache、NVIDIA Dynamo、DeepSeek-V3 和 DeepEP。 论文导读页会继续作为 15 篇核心阅读的索引。