两个场景会发生 KVCache 传输:
- Prefix KVCache 全局池化,Prefix KVCache 跨机复用
- PD 分离,KVCache 从 P 传输到 D
虽然 KVCache 经过了几轮的压缩,已经小了几个数量级,对应的传输开销也小了很多
但是,上下文在变长,KVCache 的传输开销还是不容小觑的
今天来算算这两个场景的 KVCache 传输,对推理系统的影响
假设场景
GLM 5.3,H20 PD 分离部署
P 节点:单机 TP8 + CP8
D 节点:双机 DP16 + EP16
平均输入长度:100k
平均输出长度:1000
平均 KVCache 命中率:90%-95%
投机采样:投机 3 个,verify 4 个,平均接受长度 3 个
QPS 计算
P 节点,100k input/90k cached 的请求,计算耗时按照 1.5s 计算,单机 QPS = 0.66qps
D 节点,按照 TPOT 20ms 计算,单请求耗时 1000/(1000/20) = 20s
单 rank batch-size = 8 计算,单 rank QPS = 8/20 =0.4qps,双机 QPS = 0.4 * 16 = 6.4qps
P 节点
100k 的 input,KVCache 按照 fp8 存储,对应的大小的约 5GB
假设没有上层网关的 KVCache 亲和路由,也没有 D 节点侧的 KVCache 复用
对于一个请求,会在 P 节点上产生 5GB * 3 =15 GB 的传输
- Prefix KVCache 的接收/发送,产生各 5GB 的入和出的流量
- P => D 的发送,产生 5 GB 的出流量
按照 H20 上 400Gbit(50GB)* 4 的网卡配置,理论上 75ms 可以传输完成
按照 0.66 的 QPS,折算成带宽诉求只有 ~10GB/s,传输确实不是瓶颈
如果 5GB 流量放在单网卡上(TP8 上 KVCache 是重复的),理论传输耗时 100ms,这个时延也是可以接受的小头开销
那么,KVCache 亲和路由的理论收益,只是 100ms 的传输耗时么?我们继续算
D 节点
P 节点因为是 TP8,机内流量走了 NVLink,与跨机的 RDMA 流量天然是隔离的
但是,D 节点因为有双机 EP16,所以,还有跨机的 EP 通信流量
EP 通信
EP 通信分为 Dispatch 和 Combine
Dispatch 按照 fp8 的精度,每个 token 每层的传输量是:50KB
(6144 + 6144/128*4 + 16) * 8 = 50,816
Combine 按照 fp8 的精度,每个 token 每层的传输量是:98KB
(6144 * 2) * 8 = 98,304
每 rank 按照 batch-size = 8 计算,再算上投机采样
每 rank 上 Dispatch 流量 = 50KB * 8 * 4 = 1.6MB
每 rank 上 Combine 流量 = 98KB * 8 * 4 = 3.1MB
按照 50% 机内(走 NVLink)、50% 跨机(走 RDMA)
每 rank、每层的 Dispatch、Combine 流量是:0.8MB、1.6MB
按照 TPOT 20ms、平均接受长度 3 计算,一次 forward 耗时 60ms,每层耗时 800us
也就意味着,每 800us,每个 rank 流量为:(0.8 + 1.6) * 2 = 4.8 MB
对应的传输带宽诉求为:4.8MB / 0.8ms = 6GB/s
相对每 rank 的传输带宽为 25GB,这个量还没到瓶颈
流量冲突
P -> D 传输带宽: ~2GB/s(5GB * 0.4qps)
EP 通信带宽:6GB/s
加起来也明显小于单 rank 的 25GB 带宽,带宽视角是足够的了
但是,KVCache 传输 和 EP 通信 是两种完全不同的流量特征
KVCache 传输是典型的 Burst 流量,随机产生的大流量(GB 级别),对时延不敏感
EP 通信是高频的小流量(MB 级别),对时延很敏感
极端 case
假设这个极端的 case:
4.8MB 的 EP 通信,完全排在了 5GB 的 PD KVCache 传输任务之后,形成了网络排队
那么,原来 100us 的传输耗时,就会变成 100ms 级别了,相当于,这次 forward 就卡了 100ms 了
同时,由于 EP16 的每个 rank 是同步的,单个 rank 卡 100ms,也等于 16 rank 都卡了 100ms。
按照双机 6.4qps 计算,意味着每秒要卡 100ms * 6.4,有 64% 的时间,EP 通信都是被 KVCache 传输堵塞了
实际估算
当然,这是极端的 case,实际上,5GB 的 KVCache 传输,并不是完全的 Burst 流量
真实场景下,KVCache 传输的瓶颈并不在网卡传输上,而是引擎 + Transfer-Engine 构成的控制面板开销上
比如,KVCache 在 HBM 的碎片化,光提交 RDMA 任务的开销就不小,Burst 与否取决于这一层的优化
因此实际上,按照带宽竞争的影响估算是更合理的
理论上每秒在 EP 通信耗时:6GB/25GB = 240ms
理论上 EP 通信撞上 KVCache 传输的概率:6.4qps * 100ms / 1000ms = 64%
假设两个流量撞上之后,公平竞争带宽(传输速率减半),EP 通信耗时需要额外增加:240ms * 64% = 153 ms
(这个假设是比较保守的,假设 KVCache 传输的 burst 流量实际上平滑的,不会打满带宽,造成网络排队)
如果这部分增加的 EP 通信耗时,也不能被 overlap 掉,那么每秒增加的 EP 通信等待就是 153ms
(这个假设是有点粗暴,EP 通信肯定是要做 overlap 的,但是也不会完全 overlap 掉,这个展开又是单独一篇了,所以,这里粗暴点)
简单折算下来,KVCache 传输,对于 EP 通信造成的影响就是时延增加 15.3%
优化方案
为了减少 KVCache 传输,对于 EP 通信的影响,P 和 D 都需要优化:
- Decode 开启 KVCache 缓存,加上 D 侧的 KVCache 亲和,P->D 的传输也使用增量传输,减少传输量
- Prefix 也开启 KVCache 亲和路由,不仅仅可以减少 100ms 的传输耗时,也可以减少 P 侧的带宽竞争
这里的 KVCache 亲和性路由,不再是为了 Prefix KVCache 命中率,因为有了全局池化,KVCache 命中率主要是跟缓存池容量相关了
而是为了本地 KVCache 命中率,减少传输带宽,包括跨机网络、PCIE 等等。
在 KVCache 命中 90+% 已经常态化的 Agentic 场景中,稍微考虑一下 KVCache 亲和性,减少个八九成的传输量还是比较实际的
KVCache 亲和性路由
在网关上 KVCache 亲和性路由的实现,有近似、精确 KVCache-aware 两种方案
当我们对于 KVCache 亲和性路由的期望,降低为减少传输量之后,精确方案的收益比又需要重新评估了
但是,近似方案也不是一点问题也没有,主要矛盾是池化后的 KVCache 存储节点,不一定是处理推理请求的节点
这里其实是有 co-design 的地方:KVCache 亲和性路由 + KVCache 缓存 配合,用来提升 KVCache 本地命中率 + 减少 KVCache 冗余存储
多说几句
100ms + 15.3% 时延增加,只是 GLM 5.3 + H20 简单估算出来的
实际上 AI 的发展就是这么迅猛,存在很多的变量
- 模型:DeepSeek-V4.1-Flash 已经把每个 token 压缩到了 890 字节,又是数量级的下降 …
- 硬件:H20 是阉割算力,如果用海外主流的 B 卡,算力有数量级的提升,网络带宽却只有翻倍的增幅;但是,在 NVL72 架构下,EP 通信基本都可以收敛在 NVLink 域内,也不会 PD KVCache 传输与 EP 通信争用了
- 业务:上下文会变长,命中率还会提升,如果命中率从 90% 提升到 95%,虽然只提升 5%,对于传输量而言,却是翻倍的增长
不管怎么变,在系统工程里,缓存本地化是比较常用的优化,KVCache 亲和性路由的成本也不高




