生产服务栈:KV 卸载与缓存感知路由 本节摘要:一个生产服务栈把路由器、引擎、可观测性接成一个 Kubernetes 部署——并把 KV 缓存当作可以离开 GPU 的资源。KV 卸载把 KV 缓存从 GPU 内存里抽出来,在查询与引擎间复用(CPU DRAM,再到磁盘/Ceph)。vLLM 的 production-stack 是参考部署;LMCache 是卸载层。vLLM 0.11.0 KV 卸载连接器(2026 年 1 月)经连接器 API(v0.9.0+)把它做成异步、可插拔。卸载路径通常对请求路径隐藏,但缓存未命中与提升会加端到端延迟。LMCache 即便没有共享前缀也有价值——当 GPU KV 槽用尽时,被抢占的请求可从 CPU 恢复,而非重算 prefill。
本节摘要:一个生产服务栈把路由器、引擎、可观测性接成一个 Kubernetes 部署——并把 KV 缓存当作可以离开 GPU 的资源。KV 卸载把 KV 缓存从 GPU 内存里抽出来,在查询与引擎间复用(CPU DRAM,再到磁盘/Ceph)。vLLM 的 production-stack 是参考部署;LMCache 是卸载层。vLLM 0.11.0 KV 卸载连接器(2026 年 1 月)经连接器 API(v0.9.0+)把它做成异步、可插拔。卸载路径通常对请求路径隐藏,但缓存未命中与提升会加端到端延迟。LMCache 即便没有共享前缀也有价值——当 GPU KV 槽用尽时,被抢占的请求可从 CPU 恢复,而非重算 prefill。已发表基准在 16× H100(80GB HBM)、跨 4 个 a3-highgpu-4g 上:当 KV 缓存超过 HBM 时,原生 CPU 卸载与 LMCache 都大幅提升吞吐;低 KV 占用时,所有配置接近基线、仅小开销。
对应原课程:Phase 17 · Lesson 18 ·
18-vllm-production-stack-lmcache(原英文phases/17-infrastructure-and-production/18-vllm-production-stack-lmcache/docs/en.md)。
阅读完本节,你应当能够:
你的 vLLM 服务显示 GPU 100% HBM 占用,并发一升就出抢占事件。请求被驱逐、重排队,你一分钟内把同一个 2K token 提示重 prefill 四次。GPU 算力花在冗余 prefill 上;goodput 远低于裸吞吐。
加 GPU 是线性成本。加 HBM 不可能。但 CPU DRAM 便宜——一个插槽 512 GB+,延迟比 HBM 差几个数量级,但放「临时暖」的 KV 缓存没问题。
LMCache 把 KV 缓存抽到 CPU DRAM,让被抢占的请求快速恢复,并让跨引擎的重复前缀共享缓存而不必各引擎重 prefill。
github.com/vllm-project/production-stack 是参考 Kubernetes 部署:
以 Helm chart + operator 发布。
vLLM 0.9.0 引入连接器 API,做可插拔 KV 缓存后端。你的引擎把 block 卸到连接器;连接器存它们(RAM、磁盘、对象存储、LMCache)。请求要某 block 时,连接器加载回来。
vLLM 0.11.0(2026 年 1 月)加异步卸载路径——卸载可在后台发生,使引擎在常见情况下不阻塞。端到端延迟与吞吐仍取决于工作负载形状、KV 缓存命中率与系统压力;vLLM 自家说明指出,自定义内核卸载在低命中率下会损吞吐,异步调度与投机解码有已知交互问题。
原生 vLLM CPU 卸载:引擎本地。把 KV block 存进主机 RAM。实现快、零网络跳。不跨引擎。
LMCache 连接器:集群规模。把 block 存进共享 LMCache 服务器(CPU DRAM + Ceph/S3 层)。任何引擎都能访问。已发 16× H100 基准。
单引擎有 HBM 压力选原生。多引擎共享前缀(RAG 共享系统提示、多租户共享模板)选 LMCache。
16× H100(80 GB HBM)、跨 4 个 a3-highgpu-4g 测试:
第 17 节分离式服务 + LMCache 复合:从 prefill 池到 decode 池的 KV 传输,若未用就落进 LMCache;后续查询从 LMCache 拉。第 11 节缓存感知路由器可路由到本地或 LMCache 共享缓存匹配的引擎。
原课程 code/main.py 模拟带/不带 LMCache 的抢占重的工作负载,报告避免的重 prefill、吞吐增益、盈亏 HBM 利用率。下面给最小可读骨架。
def offload_benefit(hbm_capacity_gb, kv_per_request_gb, concurrency, reuse_rate, re_prefill_cost_ms, cpu_restore_ms): """估算 KV 卸载的收益。 参数: hbm_capacity_gb: HBM 总容量 GB kv_per_request_gb: 单请求 KV GB concurrency: 并发请求数 reuse_rate: 跨请求/引擎前缀复用率(0~1) re_prefill_cost_ms: 重 prefill 的 ms 成本 cpu_restore_ms: 从 CPU 恢复的 ms 成本 返回: (是否溢出 HBM, 每次抢占节省 ms, 每小时节省示例) """ total_kv = kv_per_request_gb * concurrency spills = total_kv > hbm_capacity_gb save_per_preempt = re_prefill_cost_ms - cpu_restore_ms if spills else 0 # 复用也省:复用请求跳过 prefill reuse_save = reuse_rate * re_prefill_cost_ms return spills, round(save_per_preempt, 1), round(reuse_save, 1) # 案例:80GB HBM,每请求 0.4GB KV,200 并发,30% 复用 spills, save_pre, save_reuse = offload_benefit(80, 0.4, 200, 0.30, 600, 50) print(f"溢出 HBM: {spills}, 每次抢占省 {save_pre}ms, 复用省 {save_reuse}ms")
💡 LMCache 不是「装上就快」。它的价值在两个场景:HBM 满了要抢占比恢复便宜,以及跨引擎/跨请求有共享前缀。两者都没有时,它只是 3~5% 开销。
| 维度 | 原生 vLLM CPU 卸载 | LMCache 连接器 |
|---|---|---|
| 范围 | 引擎本地 | 集群跨引擎 |
| 存储 | 主机 RAM | CPU DRAM + Ceph/S3 层 |
| 网络跳 | 零 | 有(到 LMCache 服务器) |
| 适合 | 单引擎 HBM 压力 | 多引擎共享前缀(RAG/多租户) |
| HA | 随引擎 | LMCache 服务器需复制 |
| 何时不用 | 无 | HBM 压力小、短上下文、单租户 |
心法:单引擎抢占比重 → 原生;跨引擎复用 → LMCache。两者可叠加,但 LMCache 引入网络跳与单点,需 HA 设计。
本节产出 outputs/skill-vllm-stack-decider.md(原课程目录)。给定工作负载形状与 vLLM 部署,它在原生 / LMCache / 都不用间决定:
跑通模拟器:运行 code/main.py。在多高 HBM 利用率下 LMCache 开始划算?
租户节省:某租户在 200 查询/小时上共享 6K token 系统提示。算每租户的 LMCache 预期节省。
HA 设计:LMCache 服务器是单点故障。设计 HA 策略(复制、回落到原生)。
磁盘读时间:LMCache 存到转盘 Ceph。70B FP8 上 4K token KV(500 MB),读时间 vs 重 prefill 各多少?
异步免费吗:论证 vLLM 0.11.0 异步路径是否「免费」——开销藏在哪?
下一节,我们上一层抽象——AI 网关:看 LiteLLM、Portkey、Kong AI Gateway、Bifrost 如何把路由、限流、故障转移、计费归因、语义缓存统一在一个入口。