FlowKV: A Disaggregated Inference Framework with Low-Latency KV Cache Transfer and Load-Aware Scheduling

framework 2504.03775
disaggregated-inferencekv-cache-transferload-balancingheterogeneous-gpunccl-optimization

FlowKV: A Disaggregated Inference Framework with Low-Latency KV Cache Transfer and Load-Aware Scheduling — L2 #

§1 TL;DR #

FlowKV 通过 KV cache tensor 形状变换 + segment-based 连续分配 + 双向段对齐,将 PD 分离推理中 NCCL KV 传输延迟降低 96%(23,469 次 kernel 调用 → 1 次),配合 Load-Aware Scheduler 实现异构 GPU 部署下 15–49% 端到端加速。


§2 Q1 / Q2 / Q3 #

Q1 痛点 #

PD-disaggregated 推理将 prefill 和 decode 分离到不同节点以消除阶段间干扰,但引入了一个被广泛忽视的瓶颈:KV cache 跨节点传输延迟。原因有二:

  1. PagedAttention 内存碎片:逻辑-物理 block 映射导致 KV cache 物理地址不连续,NCCL 仅支持连续地址传输,因此每个 block 需要独立的 send/recv 调用。对于 32 层模型 + 数百个 block,单个请求可产生 >23K 次 NCCL kernel 调用。
  2. 固定 P/D 比例:现有框架(DistServe, Mooncake)固定 prefill 节点与 decode 节点角色,无法适应突发负载变化,导致一侧空闲另一侧过载。
  3. Figure 1: KV cache transfer accounts for ~25% of total request latency

    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 传输占总推理时间约四分之一,直观说明了传输瓶颈的严重性。

    Q2 方法 #

    FlowKV 提出两组正交优化:

    A. 低延迟 KV Cache 传输(核心创新):三重优化将 NCCL 调用次数从 $O(n)$ 降到 $O(1)$:

    1. KV Cache 形状变换:将 $(L, 2, B, H)$ 重排为 $(B, L, 2, H)$,使同一 block 的所有层 KV 数据在内存中连续,将每 block 的 NCCL 调用减少 $L \times 2$ 倍。
    2. Segment-based 连续分配器:借鉴 OS 段式管理,用最小堆维护空闲段,分配时选择 best-fit 段以保持 block 物理连续;释放时合并相邻空闲段。
    3. 双向段对齐:传输前对比发送/接收端的 block ID 列表,找出双方均连续的最大 block 范围,一次 NCCL 调用完成传输。
    4. 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 的内存管理层、调度器和通信层,任何环节不一致都会导致结果错误。

      Q3 结果 #

      • KV 传输延迟:单机降 96.8%(31.5× 加速 vs vLLM-Disagg),跨机降 92%(12.6× 加速)
      • 吞吐量:8B 模型上比 vLLM PD-colocated 平均高 25%;比 DistServe/Mooncake/vLLM-Disagg 分别高 95%/40%/35%
      • 端到端延迟:异构部署(L20 prefill + H20 decode)比 vLLM PD-colocated 快 15.2–48.9%
      • NCCL kernel 调用:23,469 → 1

      §3 架构 / 方法图 #

      Figure 2: FlowKV system architecture

      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)。

      Figure 5: Bidirectional segment alignment reduces NCCL calls from O(n) to O(1)

      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)$)。

      sequenceDiagram participant Client participant GC as Global Controller participant P as Prefill Node participant D as Decode Node participant KVT as KV Transfer Module Client->>GC: Request R GC->>GC: Compute C_p, C_d load scores GC->>P: Route R to P_t (min TTFT) P->>P: Prefill → y_{t+1}, K, V P->>KVT: Trigger KV transfer KVT->>KVT: Bidirectional segment alignment KVT->>D: Single NCCL send/recv (O(1)) D->>D: Decode loop → y_{t+2}...y_{t+k} D->>Client: Stream tokens

      System scope #

      • Stage coverage: prefill 和 decode 分离部署,FlowKV 管理二者之间的 KV cache 迁移与调度
      • Serving or training: 推理 serving,continuous batching(通过 Hybrid Scheduler 的 running/waiting/swapped/pending 队列)
      • Parallelism: 节点内 TP(70B 用 TP=4),节点间 PD disaggregation;不涉及 PP/EP/DP/SP
      • Deployment mode: 单节点 + 多节点,支持异构 GPU(L20+H20),支持 disaggregated prefill-decode

      §4 作者证明 #

      符号表 #

      符号含义
      $\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 利用率更直接反映排队压力)。

      6 项检查 #

      1. 维度一致性:Eq. 5 的变换保持总元素数 $L \times 2 \times B \times H$ 不变 ✓
      2. 边界条件:$B=1$(单 block)时 segment 对齐退化为恒等操作,仍然正确 ✓
      3. 单调性:负载分数 $C_i^p$ 是各指标的非负加权和,指标↑ ⇒ 分数↑,单调递增 ✓
      4. Eq. 1→Eq. 2 衔接:prefill 输出 $\mathbf{K}, \mathbf{V}$ 恰好是 decode 输入的初始 KV cache ✓
      5. NCCL 调用次数验证:原始 per-layer per-KV 调用 = $L \times 2 \times \lceil \text{seq\_len}/\text{block\_size} \rceil$。以 Llama-3.1-8B($L=32$)、block\_size=16、seq\_len=5870 为例:$32 \times 2 \times \lceil 5870/16 \rceil = 32 \times 2 \times 367 = 23,\!488 \approx 23,\!469$(与论文报告吻合) ✓
      6. Load score 场景阈值:$|C^p| \le \epsilon_p^{low}$ and $|C^d| \le \epsilon_d^{low}$ 为 normal;否则检查 high 阈值区分 imbalanced/extreme。具体阈值未公开,权重系数 $w$ 通过实验确定而非推导 — 这是该模型的主要弱点 ✓

      7. §5 实验与数据 #

        5.1 吞吐量(同构部署) #

        Table 1: Throughput comparison on Llama-3.1-8B-Instruct

        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 传输方案对长序列的根本性缺陷。

        5.2 端到端延迟(异构部署) #

        Figure 4: E2E latency in heterogeneous deployment

        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 传输占比随输入长度下降的预期。

        5.3 KV Cache 传输延迟 #

        Table 3: KV cache transfer latency comparison

        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)$ 的关键。

        基线公平性评估 #

        • 基线版本:vLLM(PD-colocated 和 PD-disaggregated),Mooncake,DistServe。具体 commit hash 未提供。
        • 基线调优:论文未说明基线是否使用默认配置或经过调优。
        • 指标定义:throughput = output tok/s;E2E = 端到端请求延迟(含 TTFT + 所有 TPOT);Table 3 延迟 = 纯 KV 传输时间(秒)。

        §6 论证链 #

        步骤论点证据依赖
        1PagedAttention 的离散 block 布局导致 NCCL 传输碎片化,单请求产生 >23K 次 kernel 调用Fig.1 + Table 3 (FlowKV Layerwise 列)
        2KV 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
        3Segment-based 分配器保持 block 物理连续,双向段对齐进一步将调用降至 $O(1)$Fig.5 + Table 3 (FlowKV 列: 23,469 → 1)步骤 2
        4传输延迟接近消除后,PD 分离不再有额外延迟代价,吞吐量超越 PD-colocatedTable 1, Table 2步骤 3
        5Load-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

        §7 实现 cross-reference #

        [实现未公开] — 论文未开源代码,未提供 GitHub 链接或实现细节。

        核心技术壁垒(展开) #

        KV cache tensor 形状变换 $(L,2,B,H) \to (B,L,2,H)$ 的工程难度在于它不是一个孤立的 transpose 操作:

        • Attention kernel 侧:每层 attention 计算完成后写入 KV cache 的目标地址必须按新布局计算偏移 — 原本按 (layer, kv, block, head) 索引,现在按 (block, layer, kv, head) 索引。这意味着修改 PagedAttention kernel 的内存寻址逻辑。
        • Block allocator 侧:分配器必须能提供 segment-contiguous 的 block,而非原始 PagedAttention 的 any-free-block 策略。需要维护 min-heap + 合并逻辑。
        • NCCL 侧:传输调用从 per-layer-per-block 变为 per-aligned-segment,调用接口和 buffer 管理完全不同。

        三层联动,任何一层的布局假设不一致都会导致 KV cache 读取错误。

        关键实现细节 #

        1. Segment 合并时机:FlowKV 在 block deallocation 时立即合并相邻空闲段(类似 OS 的 coalescing free),避免长期运行后碎片累积。这一点论文仅一句带过但对长时运行稳定性至关重要。
        2. 滑动窗口平滑:负载指标采集使用滑动窗口而非瞬时采样,避免 GPU 任务突发性导致调度振荡。窗口大小未公开。

        3. §8 API & usability #

          • User-facing API: 论文未提及是否兼容 OpenAI API 或自定义 API。从架构图看,客户端直接向 Global Controller 发送请求,但接口协议未公开。
          • Config surface: 至少需要配置 P/D 节点数量、负载权重系数 $w$、场景阈值 $\epsilon$。权重通过实验确定,无自动调优机制。
          • Migration cost: 需要替换 KV cache 分配器和传输模块,不是 vLLM 的插件式集成。

          §9 Adoption & ecosystem #

          • 未合并上游:未开源,未 merge 到 vLLM/SGLang/TRT-LLM。
          • 生产部署:论文未提及任何生产部署。
          • 下游要求:要求全栈替换 KV cache 布局(attention kernel + allocator + transfer),无法作为独立模块嵌入现有框架。

          §10 Deployment context(实践上下文) #

          • Serving stage: 管理 prefill → KV transfer → decode 全流程
          • Concurrency regime: 论文评估 RPS 0.1–2.0,属于 low-to-mid concurrency 范围
          • Hardware affinity: 异构实验表明 decode 放在大显存 GPU(H20 96GB)优于小显存(L20 48GB),因 decode 是 memory-bound。单机场景下 NVLink 互联的 A100 效果最佳(IPC 传输自动启用)。跨机场景下依赖 NCCL over ENI,未测试 InfiniBand。
          • Ecosystem integration: 独立框架,非 vLLM/SGLang 的 patch。需要自建全部组件(Global Controller + Hybrid Scheduler + 改造后的 PagedAttention)。
          • Migration path: 从 vLLM 迁移需要完全替换 serving stack,而非修改配置。高迁移成本。

          §5-ext 调度与资源管理 #

          调度决策 #

          维度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,触发条件未详述

          §6-ext Workload characterization #

          Workload regimeFlowKVBaseline (vLLM PD-coloc)Why
          Short prompts (1K), low RPS27.88 tok/s (+33%)20.93 tok/sKV 传输占比小但 PD 分离消除阶段干扰
          Short prompts (1K), high RPS507.36 tok/s (+28%)397.70 tok/s调度优化 + 无干扰 batching
          Long prompts (10K), low RPS27.85 tok/s (+36%)20.51 tok/sKV 传输大幅加速(96%↓)释放 GPU 算力
          Long prompts (10K), high RPS285.14 tok/s (−0.6%)286.97 tok/s唯一劣势场景:decode 端 KV cache 填满单 D 节点 HBM,1P1D 比例成为瓶颈
          Heterogeneous (L20+H20, long ctx)48.9% E2E↓baselineDecode 放大显存 GPU + KV 传输快速完成
          70B model, long prompts (10K)123 tok/sDistServe: FailureDistServe 无法处理 70B+10K