FlowKV 通过 KV cache tensor 形状变换 + segment-based 连续分配 + 双向段对齐,将 PD 分离推理中 NCCL KV 传输延迟降低 96%(23,469 次 kernel 调用 → 1 次),配合 Load-Aware Scheduler 实现异构 GPU 部署下 15–49% 端到端加速。
PD-disaggregated 推理将 prefill 和 decode 分离到不同节点以消除阶段间干扰,但引入了一个被广泛忽视的瓶颈:KV cache 跨节点传输延迟。原因有二:

Paper's Figure 1, verbatim (caption: "Time distribution of Prefill + Decode and KV Cache Transfer in a single request with NCCL-based transfer based original PagedAttention").
图 1 展示了一个 13K 输入、100 输出的 LongBench 请求中 KV cache 传输占总推理时间约四分之一,直观说明了传输瓶颈的严重性。
FlowKV 提出两组正交优化:
A. 低延迟 KV Cache 传输(核心创新):三重优化将 NCCL 调用次数从 $O(n)$ 降到 $O(1)$:
B. Load-Aware Scheduler:全局控制器实时采集各节点负载指标(8 维),计算加权负载分数 $C_i^p$, $C_i^d$,按 normal/imbalanced/extreme 三档切换调度策略——normal 下最小化 TTFT,imbalanced 下让空闲节点切换角色,extreme 下弹性伸缩。
核心技术壁垒:KV cache 形状变换 $(L,2,B,H) \to (B,L,2,H)$ 看似简单的 tensor transpose,实际需要修改整个 KV cache 生命周期——从 attention kernel 写入布局、block 分配器接口、到 NCCL 传输 API 调用——形成一个跨栈的 layout 变更。这不是单点优化,而是需要同时改动 PagedAttention 的内存管理层、调度器和通信层,任何环节不一致都会导致结果错误。

Paper's Figure 2, verbatim (caption: "FlowKV framework. FlowKV enables high-speed transmission of KV Cache between P and D nodes through KV Cache transfer module...").
图 2 展示了 FlowKV 的完整架构:顶部 Global Controller 接收请求并根据负载状态(normal/decode overload/prefill overload)将请求路由到 Prefill-dominant 或 Decode-dominant 实例。每个实例内部运行 Hybrid Scheduler 管理 P/D 双调度器。底部 KV Cache Transfer Module 自动检测部署拓扑并选择最佳传输管线(IPC/RDMA/NCCL)。

Paper's Figure 5, verbatim (caption: "Comparison of the KV Cache transfer process in FlowKV with the pre-optimization approach...").
图 5 对比了优化前后的传输过程:上半部分显示 PagedAttention 下 block 分散导致每个 block 需要独立传输($O(n)$ 次调用);下半部分显示 FlowKV 的 segment-based 分配使 block 在发送和接收端均连续,双向对齐后一次调用即完成传输($O(1)$)。
| 符号 | 含义 |
|---|---|
| $\mathcal{P} = \{P_i\}_{i=1}^N$ | Prefill 节点集合,$N$ 个 |
| $\mathcal{D} = \{D_j\}_{j=1}^M$ | Decode 节点集合,$M$ 个 |
| $R$ | 请求,含输入 token 序列 $x$ |
| $\mathbf{K}, \mathbf{V}$ | 所有 token 的 KV cache 张量集合 |
| $L$ | 模型层数 |
| $B$ | KV cache block 数 |
| $H$ | 单 block KV 向量维度 |
| $C_i^p, C_i^d$ | 节点 $i$ 的 prefill/decode 综合负载分数 |
| $w_{\cdot,p/d}$ | 各负载指标的权重系数 |
| $\epsilon_p, \epsilon_d$ | 负载场景判定阈值 |
Eq. 1: $y_{t+1}, \mathbf{K}, \mathbf{V} = P_p(R)$ — Prefill 阶段:一次前向处理完整输入序列,输出首 token 及完整 KV cache。物理意义:compute-bound 操作,吞吐量取决于 GPU 算力。
Eq. 2: $y_{t+i}, \mathbf{k}_{t+i}, \mathbf{v}_{t+i} = D_d(\cdot)$ — Decode 阶段:逐 token 自回归生成,每步仅处理 1 个新 token 加已有 KV cache。物理意义:memory-bound 操作,吞吐量取决于 HBM 带宽。
Eq. 5 (KV shape transform): $(L, 2, B, H) \to (B, L, 2, H)$ — 将 block 维度提升为最外层,使同一 block 内所有层的 K/V 数据连续。物理意义:将 $L \times 2$ 次不连续小块传输合并为 1 次大块传输,传输次数从 $O(B \times L \times 2)$ 降为 $O(B)$,再配合 segment 对齐进一步降到 $O(1)$。
Load score equations: $C_i^p = \sum_k w_{k,p} \cdot \text{metric}_k^i$ — 对每个节点的 8 维归一化指标(running/waiting/swapped/sending 队列长度 + token budget + KV 利用率 + GPU 利用率 + 内存带宽利用率)做加权求和。物理意义:线性组合将异质指标压缩为单一标量,便于全局比较和阈值判定。加权而非等权因为不同指标对负载的贡献不同(如 running queue 比 GPU 利用率更直接反映排队压力)。

Paper's Table 1, verbatim (caption: "Throughput comparison based on Llama-3.1-8B-Instruct").
Table 1 显示 FlowKV 在 8B 模型上全面领先:1K 输入时最高吞吐 507.36 tok/s(vs vLLM PD-colocated 397.70),5K 输入时 470.68 vs 378.97,10K 输入时 FlowKV 的吞吐优势仍存但在 RPS=2.0 时 285.14 vs vLLM 286.97 出现唯一交叉点——这是 decode 端成为瓶颈、单 D 节点被 long-context KV cache 填满 memory 的信号。DistServe 在 5K/10K 输入时吞吐坍塌到 ~22 tok/s,暴露其 KV 传输方案对长序列的根本性缺陷。

Paper's Figure 4, verbatim (caption: "E2E performance in heterogeneous deployment scenario").
图 4 的三个子图对比了 PD-colocated、4P4D(P-L20/D-H20)、4P4D(P-H20/D-L20) 三种配置。关键发现:(a) gov_report 数据集上 P-L20/D-H20 配置以约 10s 的 E2E(RPS=0.25)vs PD-colocated 约 18s,差距随 RPS 增大而扩大到 48.9%;(b) 将 decode 放在大显存 H20 而非小显存 L20,因为 decode 是 memory-bound、受益于 H20 的 96GB HBM;(c) qmsum 数据集输入最短,差距最小(15.2%),符合 KV 传输占比随输入长度下降的预期。

Paper's Table 3, verbatim (caption: "Comparison of KV Cache transfer latency based on the Llama-3.1-8B-Instruct model with a deployment configuration of 1P1D").
Table 3 是本文最具说服力的实验:单机 12K 输入时 FlowKV 仅 0.0681s vs vLLM-Disagg 2.1894s(31× 加速)。跨机 12K 时 FlowKV 0.1759s vs vLLM-Disagg 2.1974s(12.5× 加速)。Mooncake 在 10K+ 输入时直接 Failure,说明其 RDMA 方案在大 KV cache 场景下有未公开的限制。FlowKV Layerwise(无段对齐)也比 vLLM-Disagg 慢——证明单靠形状变换不够,segment 对齐才是 $O(n) \to O(1)$ 的关键。
| 步骤 | 论点 | 证据 | 依赖 |
|---|---|---|---|
| 1 | PagedAttention 的离散 block 布局导致 NCCL 传输碎片化,单请求产生 >23K 次 kernel 调用 | Fig.1 + Table 3 (FlowKV Layerwise 列) | — |
| 2 | KV cache 形状变换 $(L,2,B,H) \to (B,L,2,H)$ 使同一 block 内存连续,减少调用次数 $L \times 2$ 倍 | Eq.5 + Table 3 ablation (FlowKV Layerwise vs Mooncake/vLLM) | 步骤 1 |
| 3 | Segment-based 分配器保持 block 物理连续,双向段对齐进一步将调用降至 $O(1)$ | Fig.5 + Table 3 (FlowKV 列: 23,469 → 1) | 步骤 2 |
| 4 | 传输延迟接近消除后,PD 分离不再有额外延迟代价,吞吐量超越 PD-colocated | Table 1, Table 2 | 步骤 3 |
| 5 | Load-Aware Scheduler 通过负载分数 $C_i^{p/d}$ 动态切换节点角色和弹性伸缩,避免 P/D 不平衡 | Appendix B Algorithm 1 + Fig.4 异构实验 | — |
| 6 | 两组优化协同:传输快 + 调度优 → 异构部署 15–49% E2E 加速 | Fig.4 (gov_report 48.9%, qmsum 15.2%) | 步骤 4 + 5 |
[实现未公开] — 论文未开源代码,未提供 GitHub 链接或实现细节。
KV cache tensor 形状变换 $(L,2,B,H) \to (B,L,2,H)$ 的工程难度在于它不是一个孤立的 transpose 操作:
(layer, kv, block, head) 索引,现在按 (block, layer, kv, head) 索引。这意味着修改 PagedAttention kernel 的内存寻址逻辑。三层联动,任何一层的布局假设不一致都会导致 KV cache 读取错误。
| 维度 | FlowKV |
|---|---|
| 调度粒度 | Request 级(全局)+ scheduling cycle 级(本地 Hybrid Scheduler) |
| 抢占策略 | 支持 swap(swapped queue 存在),但抢占触发条件未详述 |
| 准入控制 | Extreme load 下弹性伸缩 + 角色切换;无明确 drop/reject 策略 |
| 公平性 | 无 per-tenant/priority 保证,仅按负载分数路由 |
| 维度 | FlowKV |
|---|---|
| KV cache 分配单元 | Block(与 PagedAttention 相同),但用 segment-based min-heap 保证连续性 |
| 碎片行为 | Deallocation 时合并相邻空闲段,碎片率低于原始 PagedAttention |
| 驱逐/复用 | 论文提到 Global KV Cache Sensor 支持 prefix 匹配,但未详述 LRU/radix tree |
| Swap to CPU | 存在 swapped queue,说明支持 CPU offload,触发条件未详述 |
| Workload regime | FlowKV | Baseline (vLLM PD-coloc) | Why |
|---|---|---|---|
| Short prompts (1K), low RPS | 27.88 tok/s (+33%) | 20.93 tok/s | KV 传输占比小但 PD 分离消除阶段干扰 |
| Short prompts (1K), high RPS | 507.36 tok/s (+28%) | 397.70 tok/s | 调度优化 + 无干扰 batching |
| Long prompts (10K), low RPS | 27.85 tok/s (+36%) | 20.51 tok/s | KV 传输大幅加速(96%↓)释放 GPU 算力 |
| Long prompts (10K), high RPS | 285.14 tok/s (−0.6%) | 286.97 tok/s | 唯一劣势场景:decode 端 KV cache 填满单 D 节点 HBM,1P1D 比例成为瓶颈 |
| Heterogeneous (L20+H20, long ctx) | 48.9% E2E↓ | baseline | Decode 放大显存 GPU + KV 传输快速完成 |
| 70B model, long prompts (10K) | 123 tok/s | DistServe: Failure | DistServe 无法处理 70B+10K |