Prhub

#44528 [KV Connector][Mooncake] Pipeline-parallel support for PD-disaggregated serving with Mooncake connector

原始 PR 作者 HanHan009527 合并时间 2026-06-16 19:35 文件变更 4 提交数 28 评论 10 代码增减 +680 / -34

执行摘要

增加 Mooncake PD 分离推理的 PP prefill 支持

为了在 H20 级 GPU 上高效运行长上下文工作负载,prefill 侧需要 PP 来适应模型或提升吞吐。本 PR 为 Mooncake 连接器补齐了 PP 支持,确保 PD 分离部署中 prefill 使用 PP 时 KV 缓存能正确传输。PR 描述原文:'This PR adds Mooncake-specific support for pipeline-parallel prefill in PD-disaggregated serving. It is intended for long-context workloads where the prefill side needs PP to fit or run efficiently on H20-class devices.'

值得精读,尤其是 _align_transfer_regions 的层名对齐设计和 should_launch_bootstrap_server 的启动条件讨论。建议在合并后尽快补充多节点端到端集成测试。

讨论亮点
  • HMA 支持范围:@zixi-qi 询问 HMA 支持是否在此 PR 内,作者 @HanHan009527 表示 HMA 支持是单独的后续 PR。
  • import 风格:@NickLucche 建议 _sync_engine_id_across_tp 中直接导入 get_pp_group 到函数顶部,而非条件导入,作者已在后续 commit 中修复。
  • Bootstrap 服务器启动逻辑:@dtcccc 指出 is_local_first_rank() 在多节点 TP 时会返回 True 导致重复启动,必须使用全局 rank 判断。作者回复已修复,改用 get_pp_group().is_first_rank()
  • 集成测试建议:@NickLucche 呼吁增加端到端集成测试。

实现拆解

  1. 数据结构扩展:在 mooncake_connector.pyTransferRegion 中新增 layer_namelayer_index 字段,使每个传输区域关联到具体模型层。
  2. 区域展开函数更新_expand_transfer_regions 增加 layer_nameslayer_indices 参数,展开时保留层信息。
  3. 传输对齐函数:新增 _align_transfer_regions,基于层名出现次数索引(而非位置索引)对齐生产/消费区域,解决 PP 分片导致的 region 不匹配。
  4. Engine ID 同步:在 kv_transfer_state.py_sync_engine_id_across_tp 中,当 pipeline_parallel_size > 1 时额外通过 PP group 广播 engine_id,确保所有 PP rank 共享同一 ID。
  5. Bootstrap 服务器启动条件修正should_launch_bootstrap_server 将条件从 is_local_first_rank() 改为 get_pp_group().is_first_rank()get_tp_group().is_first_rank() 的组合,避免多节点 TP 时重复启动。
  6. 测试配套:在 test_mooncake_connector.py 中新增 test_align_transfer_regions_uses_layer_name_occurrencestest_build_transfer_params_separates_prefill_pp_layerstest_send_kv_to_decode_aligns_consumer_regions_by_layer_metadata 等用例,覆盖 PP 场景;HMA 测试文件同步更新 region 构造。
文件 模块 状态 重要度
vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py KV 连接器 modified 8.3
tests/v1/kv_connector/unit/test_mooncake_connector.py Mooncake 测试 modified 7.24
vllm/distributed/kv_transfer/kv_transfer_state.py 引擎初始化 modified 5.48
tests/v1/kv_connector/unit/test_mooncake_connector_hma.py Mooncake 测试 modified 4.16

关键符号

_align_transfer_regions keyed_regions _expand_transfer_regions _sync_engine_id_across_tp should_launch_bootstrap_server

关键源码片段

vllm/distributed/kv_transfer/kv_connector/v1/mooncake/mooncake_connector.py dependency-wiring

核心文件,实现了 PP 传输对齐逻辑:修改 TransferRegion 结构,新增 _align_transfer_regions 函数,调整 _expand_transfer_regions 和 should_launch_bootstrap_server。

@dataclass(frozen=True)
class TransferRegion:
    layer_name: str # 关联的模型层名称,如 model.layers.1.self_attn
    layer_index: int # 层索引
    base_addr: int
    block_len: int
    kv_block_len: int
​
​
def _align_transfer_regions(
    local_regions: list[TransferRegion],
    remote_regions: list[TransferRegion],
) -> tuple[list[TransferRegion], list[TransferRegion], str | None]:
    """按注册的层名称出现次数对齐 KV 传输区域。    PP 分片拥有不同的层子集,位置匹配在生产者和消费者 PP 布局不同时
    会出错。同一个层的多个注册传输缓冲区由重复的层名表示,并按照
    出现顺序匹配。
    """
​
    def keyed_regions(
        regions: list[TransferRegion],
    ) -> list[tuple[tuple[str, int], TransferRegion]]:
        counts: dict[str, int] = defaultdict(int)
        keyed: list[tuple[tuple[str, int], TransferRegion]] = []
        for region in regions:
            occurrence = counts[region.layer_name]
            counts[region.layer_name] += 1
            key = (region.layer_name, occurrence)
            keyed.append((key, region))
        return keyed
​
    local_keyed = keyed_regions(local_regions)
    remote_keyed = keyed_regions(remote_regions)
​
    local_map: dict[tuple[str, int], TransferRegion] = dict(local_keyed)
    remote_map: dict[tuple[str, int], TransferRegion] = dict(remote_keyed)
​
    combined_keys = sorted(
        local_map.keys() & remote_map.keys(),
        key=lambda k: (k[0], k[1])
    )
    aligned_local = [local_map[k] for k in combined_keys]
    aligned_remote = [remote_map[k] for k in combined_keys]
​
    if not aligned_local:
        return [], [], "No common layer occurrences found between producer and consumer"
​
    return aligned_local, aligned_remote, None
vllm/distributed/kv_transfer/kv_transfer_state.py core-logic

扩展 _sync_engine_id_across_tp 函数的 PP 广播逻辑,确保 engine ID 在 PP 层级同步。

def _sync_engine_id_across_tp(vllm_config: "VllmConfig") -> None:
    """Broadcast engine_id from TP rank 0 so all workers in a
    multi-node TP group share the same value.    When PP is enabled, also broadcast across PP ranks so all workers in
    the same model-parallel engine share the same value.
    """
    from vllm.distributed.parallel_state import (
        get_pp_group,
        get_tp_group,
    )
​
    assert vllm_config.kv_transfer_config is not None
    synced_id = get_tp_group().broadcast_object(
        vllm_config.kv_transfer_config.engine_id, src=0
    )
    # 如果启用了 PP,则额外通过 PP group 广播,
    # 确保所有 PP rank 拿到一致的 engine ID
    if vllm_config.parallel_config.pipeline_parallel_size > 1:
        synced_id = get_pp_group().broadcast_object(synced_id, src=0)
    vllm_config.kv_transfer_config.engine_id = synced_id
tests/v1/kv_connector/unit/test_mooncake_connector_hma.py test-coverage

配合 TransferRegion 结构变化,更新 HMA 测试数据使包含 layer_name/layer_index。

# HMA 测试中的 region 构造更新(局部示例)
local_regions = [
    TransferRegion(
        layer_name="model.layers.0.self_attn", # 新增
        layer_index=0, # 新增
        base_addr=0x1000,
        block_len=block_len,
        kv_block_len=block_len,
    ),
]

评论区精华

HMA 支持是否在此 PR 范围内 question

zixi-qi 询问 HMA(异构内存访问)支持是否在当前 PR 中实现。

结论:作者 @HanHan009527 确认 HMA 支持是独立的后续 PR,此 PR 专注于基础 PP 传输。 · closed

_sync_engine_id_across_tp 中 get_pp_group 的导入位置 style

NickLucche 建议将 get_pp_group 的 import 移至函数顶部,而非在 if 内部条件导入。

结论:作者在后续 commit 中修复,将 import 移到函数开始处。 · 已解决

Bootstrap 服务器在 multi-node TP 时重复启动 正确性

dtcccc 指出 is_local_first_rank() 在多节点 TP 时每个节点的 rank 0 都会返回 True,导致 bootstrap 服务器重复启动。建议使用全局 rank 判断。

结论:作者回复已修复,改用 get_pp_group().is_first_rank() 和 get_tp_group().is_first_rank() 组合判断。 · 已解决

缺少端到端集成测试 测试

NickLucche 建议增加 e2e 集成测试来验证 PP 传输功能。

结论:此 PR 未添加 e2e 测试,但单元测试已覆盖主要逻辑。未来可能需要补充。 · 待处理

风险与影响

  • 层名匹配假设_align_transfer_regions 依赖生产者和消费者使用相同的层名约定,不同模型或配置可能导致匹配失败,需确保一致性。
  • Engine ID 同步kv_transfer_state.py 的修改仅在 PP 启用时执行广播,但 get_pp_group() 在非 PP 模式下可能不存在,虽已通过条件导入解决,但仍需注意启动顺序。
  • Bootstrap 启动条件should_launch_bootstrap_server 的修改可能影响现有非 PP 部署,需验证在 DP 模式下每个 engine 仍能正确启动一个 bootstrap 服务器。
  • 测试覆盖:单元测试较多,但缺少端到端集成测试(如多节点 PP 传输);HMA 测试暂未覆盖 PP 场景。
  • 用户/系统:启用 Mooncake 连接器的 PD 分离部署现在可以使用 PP prefill,提升长上下文场景的性能和显存效率。
  • 团队:后续需要跟进 HMA 支持(计划下一个 PR)和更全面的集成测试。
  • 兼容性:非 PP 部署行为保持不变;TP engine ID 同步逻辑不变;bootstrap 启动条件调整后在内部 LB 模式下行为等效。
核心路径变更 层名匹配假设强依赖命名约定 缺少端到端集成测试

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论