vLLM 分层 KV Cache:把显存之外的缓存变成可共享资源
长上下文和多轮对话会持续制造大规模 KV Cache。当 GPU 显存不足时,传统做法通常是淘汰旧数据;如果后续请求再次需要这些内容,系统只能重新计算。vLLM 的 Tiered KV Cache Offloading 提供了另一条路径:把被淘汰的 KV 数据保留下来,在需要时从更低层级重新加载。
核心设计:CPU 内存作为中枢
这套机制并不是让 GPU 直接面对多种外部存储,而是规定所有 KV 数据都先经过主机内存。卸载时,数据先从加速器复制到 CPU DRAM,GPU 空间在这一步完成后即可释放;之后,CPU 中的副本可以异步写入文件系统、对象存储,或发送给远端节点。重新加载时则反向进行:先把数据提升到主机内存,再送入 GPU。这样,显存只在数据实际准备好并被使用时占用,形成较为明确的“按需分配”模式。
主机内存不是临时中转站,而是具备 LRU/ARC 能力的一级缓存。调度器首先检查这一层,未命中后再按配置查询二级层,并由第一个找到数据的层级提供服务。不同 KV 分块甚至可以来自不同层级。
为跨节点共享统一数据格式
在张量并行环境中,各加速器通常只持有 KV 的一部分。vLLM 会把这些分片汇聚到一块共享的主机内存区域,并采用固定的规范化布局:每个页面对应某一层的一个块,来自不同 TP rank 的 KV 头被整理到连续区域。由此,二级存储看到的是更少、更大的 I/O,而不是大量 GPU 分片操作。
这种布局还降低了硬件和软件配置差异带来的兼容成本。不同加速器、注意力后端或并行度的节点,都可以使用同一种主机侧表示交换数据,无需额外重排。
三类二级层与应用场景
- 文件系统:以内容寻址方式保存 KV 分块,多个实例挂载同一目录后即可共享缓存。
- 对象存储:通过 S3 兼容服务保存数据,适合成本更敏感、需要跨实例访问的场景。
- P2P 传输:使用 ZMQ 协调、RDMA 搬运主机到主机的数据,支持节点之间主动拉取 KV。
P2P 的价值尤其体现在 Prefill/Decode 解耦和负载均衡。Prefill 实例生成的分块可以在主机内存中提供给 Decode 实例;结合分块式预填充,已完成的部分能够更早开始传输。对于过载实例,KV 分块也可以转移或由其他实例拉取。由于传输在主机侧完成,多个 GPU 分片能够先合并成更大的网络操作,减少细碎 I/O。
意义与限制
这项设计的重点并非简单增加一个缓存目录,而是把 KV Cache 变成可分层、可持久化、可共享的服务资源。它有望降低重复计算,扩大单集群的有效服务容量,并让异构节点更容易协作。同时,实际收益仍取决于 CPU 内存容量、存储延迟、网络带宽以及缓存命中率;远端层级也不能消除数据传输本身的成本。总体看,vLLM 正在把 KV Cache 从单个加速器上的临时状态,推进为推理系统中的基础设施层。
评论
正在确认登录状态……
正在加载评论……