💯vLLM大揭秘:KV Cache传递机制的三大突破点

B站影视 韩国电影 2025-09-25 04:11 4

摘要:KV Cache 传递是 vLLM 实现 PD(Prefill-Decode)分离的核心技术之一,其性能与稳定性直接关系到整个推理系统的效率。本文将系统探讨 KV Cache 传递过程中的关键问题。

本文较长,建议点赞收藏,以免遗失。

KV Cache 传递是 vLLM 实现 PD(Prefill-Decode)分离的核心技术之一,其性能与稳定性直接关系到整个推理系统的效率。本文将系统探讨 KV Cache 传递过程中的关键问题。

ps:建议在进入正文前,大家对KV Cache的工作原理有一个基本的理解,如果不清楚的粉丝朋友,可以看看我之前整理的技术文档: 《小白也能看懂的LLMs中的KV Cache,视觉解析》

KV Cache 的传递主要有两种典型方案:​中心存储​​和​​分布式(P2P)​​ 模式。

​​中心存储​​ :通过统一的KV Store管理所有设备的KV值,提供增、删、查及传递功能。优势在于可扩展性强、支持异构存储介质、易于实现 #技术分享计算重用,但性能可能受中心节点设计影响,系统维护复杂度较高。​​分布式传递​​ :各个实例独立管理存储,通过点对点通信完成数据传输。优势是延迟低、架构清晰,但扩展性和稳定性较差。

两种方式也可混合使用。当前主流推理框架(如 Mooncake、Dynamo)更倾向于中心存储方案,将传输复杂性封装在系统内部。

常见的存储与传输介质包括:

| 存储介质 | 传输通道 | 特点 | | ---

| 显存(HBM) | NVLink/HCCS | 速度最快,容量小 | | 显存 | RDMA(RoCE/IB) | 经 PCIe 传输,速度次之 | | 内存 | RDMA(NIC) | 容量中等,速度中等 | | 内存 | PCIe/TCP | 需经 CPU 处理,速度较低 | | 本地磁盘 | PCIe/TCP | 容量大,速度慢 | | 远端云存储 | TCP | 容量最大,速度最低(跨地域) |

当模型采用 TP、PP 等并行策略时,KV Cache 可能分散在不同设备上。若 Prefill 实例和 Decode 实例的并行策略不一致,则无法直接进行 Rank 间一对一传输。

例如,Prefill 使用 TP4+EP1,而 Decode 使用 TP1+PP2+EP4,此时需采用“聚合-传输-分发”策略,如借助 TP 组内 Rank0汇聚数据再发送。这种方式难以充分利用高速互联链路(如 NVLink)。若传输 Block 尺寸过小,虽可避免聚合,但可能引发多 Rank 争抢同一数据源,导致阻塞和效率下降。

在支持 Prefix Cache 的系统中,Decode 实例已计算的 KV Block 也可能被 Prefill 实例复用。因此,KV Cache 传输并非单向的从 P 到 D,同样存在 D 到 P 的反向传输需求。

vLLM 的 V1版本设计中,Decode 实例可先本地查找匹配的 KV Block,未命中时再向 Prefill 实例请求,避免重复计算和传输。

根据传输时机,可分为两种场景:

​​整体计算传输​​ :Prefill阶段完全结束后统一传输KV Cache。通常不会与计算争抢带宽,但若传输速度慢于计算速度,下一个计算请求可能被迫等待。​​分层/分Block传输​​ :每计算完一个单位立即异步传输,可减少串行延迟,但若模型计算本身已占满带宽,则两者会产生竞争。

vLLM 目前提供两套 KV Transfer 实现:V0(稳定版)和 V1(开发版,变动较大)。以下基于0.8.5版本分析其架构与接口。

V0采用典型的 Connector 模式,由 Lookup Buffer、Pipe 和 Connector 协调器组成。

​​Connector​​ :负责对外接口,初始化时通过工厂类(KVConnectorFactory)根据配置选择具体实现,如PyNcclConnector、MooncakeStoreConnector等。​​Lookup Buffer​​ :构建FIFO队列缓冲数据,提供insert(生产者调用)和drop_select(消费者调用)接口。​​Pipe​ ​:实际数据传输通道,支持发送和接收Tensor,提供如PyNcclPipe等具体实现。

传输基本流程为:Prefill 实例计算完成后,将 KV 数据插入 Buffer;消费者发送 input_tokens 和 ROI(Region of Interest)标志,生产者返回对应 Key、Value 及 Hidden 状态。

V1版本中,Prefill 和 Decode 角色可互换,传输方向为双向。核心特点是引入 Scheduler Connector 和 Worker Connector,通过元数据(KVConnectorMetadata)协调传输任务。

​​Scheduler Connector​​:运行于Scheduler线程,负责判断是否需加载远端KV、更新Block状态、生成传输元数据。​​Worker Connector​​:运行于Worker线程,根据元数据执行实际的数据加载和存储。

关键接口包括:

start_load_kv/ wait_for_layer_load:消费者异步加载KV数据。save_kv_layer/ wait_for_save:生产者存储KV数据。build_connector_meta:Scheduler生成传输计划。

传输过程可实现计算与通信的重叠,提升整体效率。

PD 实例间需协调执行状态,如 KV 准备完成、释放本地缓存等。控制信号传输有两种方式:

​​直连​​ :P与D间直接建立控制信道,延迟低但需自行处理可靠性。​​经中心调度器​​ :所有控制信令经调度器转发,实现简单但可能成为瓶颈。

需重点考虑信号丢失的处理,如重传机制或超时释放策略。

V1版本中 Scheduler 需处理 KV 传输状态,如等待远端 KV、更新块映射等,逻辑日益复杂。未来应考虑将部分功能下放至 Worker,保持 Scheduler 轻量高效。

当前 vLLM 尚未全面考虑传输故障容错。未来需设计重传、重计算及一致性机制,确保部分传输失败时系统仍能正常完成推理。

KV Cache 传递是 PD 分离架构的关键组件,其设计需综合考虑传输方式、并行策略、双向复用与带宽竞争等问题。vLLM 通过 V0/V1两套方案提供了基础实现,但在调度器轻量化、控制信号可靠性与传输容错等方面仍有优化空间。未来可结合中心存储与分布式优势,构建高效、稳定且可扩展的 KV Cache 传输系统。好了,今天的分享就到这里,点个小红心,我们下期见。

​​

来源:墨码行者

相关推荐