多轮对话不再重复算历史:KV缓存反向回传,长上下文首字延迟最多降3.3倍
核心概要
多轮智能体对话每轮都要把历史重新送进预填充节点,KV缓存此前只能从预填充单向流向解码节点,解码节点生成的缓存无法被回用。vLLM 引入双向 KV 传输,让解码节点保留并回传已算好的 KV 块,预填充节点按可配置阈值决定复用还是重算。在 1P1D 的 Amazon EC2 P5en 加 EFA 部署上,最长提示下 Qwen3-32B 的首字延迟降低约 1.6 倍,GLM-5-FP8 降低约 3.3 倍,效果随提示长度增长,具体取决于负载与配置。
深度剖析
多轮对话中,预填充节点现在可以直接取用解码节点上一轮留下的 KV 缓存,而不必把整段历史重新算一遍。 此前的分离式服务只把 KV 缓存从预填充节点单向送到解码节点,解码节点手里的提示与已生成 token 缓存无法回流,下一轮预填充节点只能重算上一轮回复的 KV 投影。 在关闭预填充节点前缀缓存、模拟缓存已被驱逐的 1P1D 部署上,开启该功能后 Qwen3-32B 的首字延迟从 2k 的 158 ms 升到 24k 的 778 ms 变为 122 ms 升到 460 ms,GLM-5-FP8 从 2k 的 500 ms 升到 20k 的 2,334 ms 变为 358 ms 升到 702 ms。
实现方式是让 KV 块活过产生它的那一轮,并沿反方向流动,由感知 KV 缓存的路由器协调。 NVIDIA Inference Xfer Library 的 KV 连接器被扩展,使预填充节点也能像解码节点那样消费远端 KV 块,两个方向共用同一次 NIXL READ 传输机制。 路由器只在内存中保存 conversation_id 到解码节点 kv_transfer_params 的块位置映射,不保存 KV 张量,元数据从响应流中获取;解码节点按 decoder_kv_blocks_ttl 默认 480 秒保留块,预填充节点在可复用 token 数达到 kv_recompute_threshold 默认 64 时发起异步接收。
启示与展望
结果来自 1P1D 部署,一个预填充节点加一个解码节点,使用 Amazon EC2 P5en 实例并以 EFA 连接,模型为 Qwen3-32B 与 zai-org/GLM-5-FP8。基准关闭了预填充节点的前缀缓存,用来模拟本地缓存已被驱逐或路由器改选到没有该会话 KV 块的预填充节点。功能以加速器无关能力贡献给 vLLM,先在 EFA 连接的 AWS Trainium 集群上构建和验证,本文给出的结果来自 P5en GPU 集群,说明收益也能延续到 GPU。要自行实现需使用 vLLM v0.21.0 或更高版本配合 NixlConnector,在预填充与解码服务器上开启 bidirectional_kv_xfer,并使用感知 KV 缓存的路由器。
性能数据依赖负载与配置,官方说明结果会随硬件、模型、工作负载和网络配置变化。块保留时间 decoder_kv_blocks_ttl 固定为 480 秒且不续期,需要按预期轮次间隔调整,以在 KV 复用与加速器内存占用之间取舍;晚于该时间到达的轮次会退回普通预填充。KV 复用并不总是快于本地重算,可复用前缀较短时互连与协调开销可能超过重算耗时。把心跳续期租约扩展到解码侧被描述为自然的下一步改进。
