Prhub

#26346 Add mooncake_tcp transfer backend (mooncake over TCP)

原始 PR 作者 hnyls2002 合并时间 2026-05-27 09:15 文件变更 3 提交数 5 评论 8 代码增减 +99 / -59

执行摘要

添加 mooncake_tcp 传输后端,通过 TCP 替代 RDMA

PR body 说明:"Provides a no-RDMA path for PD disaggregation where RDMA is unavailable or unstable, without duplicating any mooncake bootstrap / transfer / staging logic."

建议重点理解以下设计决策:

  • 选择别名而非独立 TCP 后端,避免 GPU 同步复杂性。
  • 参数规范化钩子的模块化模式,便于维护和测试。
  • 使用 os.environ.setdefault 传递环境变量的灵活性。
讨论亮点

自动化助手 gemini-code-assist 在早期纯 Python TCP 后端的审查中指出了严重问题:

  • 异步 CUDA 拷贝同步导致数据损坏(_stage_d2h 和 _apply_frame)。
  • 锁内阻塞 connect 造成队头阻塞(_get_client_sock)。
  • 跨模块依赖(KVTransferError 导入)。
    这些反馈促使作者放弃纯 TCP 方案,改用 mooncake_tcp 别名。此外,ShangmingCai 确认 mooncake 官方支持 MC_FORCE_TCP

实现拆解

  1. 参数规范化钩子:在 python/sglang/srt/arg_groups/pd_disaggregation_hook.py 中新增 handle_pd_disaggregation 函数,检测 mooncake_tcp 时设置 MC_FORCE_TCP=1,改写后端为 mooncake 并清空 RDMA 设备参数。
  2. 扩展后端选项列表:在 python/sglang/srt/server_args.py 中将 mooncake_tcp 加入 DISAGG_TRANSFER_BACKEND_CHOICES
  3. 传输引擎适配:在 python/sglang/srt/distributed/device_communicators/mooncake_transfer_engine.py__init__ 中,当 MC_FORCE_TCP=1 时跳过 RDMA 设备选择。
  4. 清理内联逻辑:从 server_args.py 中移除原 _handle_pd_disaggregation 方法,全部移至钩子文件。
文件 模块 状态 重要度
python/sglang/srt/arg_groups/pd_disaggregation_hook.py 分解配置 added 7.82
python/sglang/srt/server_args.py 参数配置 modified 6.96
python/sglang/srt/distributed/device_communicators/mooncake_transfer_engine.py 传输引擎 modified 5.61

关键符号

handle_pd_disaggregation MooncakeTransferEngine.__init__

关键源码片段

python/sglang/srt/arg_groups/pd_disaggregation_hook.py core-logic

新增文件,核心的配置规范化逻辑,将 mooncake_tcp 别名映射到 mooncake 并设置 TCP 环境变量。

def handle_pd_disaggregation(server_args: "ServerArgs") -> None:
    """Validate and normalize PD-disaggregation server args."""
    # "mooncake_tcp" 是 mooncake 的 TCP 别名:设置 MC_FORCE_TCP 使 mooncake
    # 使用 TcpTransport 代替 RDMA,并将 backend 重写为 "mooncake" ,
    # 同时跳过 RDMA HCA 选择。此块必须在后端名称检查之前执行。
    if server_args.disaggregation_transfer_backend == "mooncake_tcp":
        os.environ.setdefault("MC_FORCE_TCP", "1")
        server_args.disaggregation_transfer_backend = "mooncake"
        server_args.disaggregation_ib_device = None
        logger.info(
            "disaggregation transfer backend 'mooncake_tcp' -> mooncake "
            "with MC_FORCE_TCP=1 (TCP transport, no RDMA)"
        )
​
    # decode 模式下的 radix cache 校验
    if server_args.disaggregation_mode == "decode":
        if server_args.disaggregation_decode_enable_radix_cache:
            if server_args.enable_hisparse:
                raise ValueError(
                    "--disaggregation-decode-enable-radix-cache is incompatible "
                    "with --enable-hisparse"
                )
            # radix cache 当前仅支持 nixl 或 mooncake(mooncake_tcp 已重写)
            if server_args.disaggregation_transfer_backend not in ("nixl", "mooncake"):
                raise ValueError(
                    "--disaggregation-decode-enable-radix-cache currently "
                    "requires --disaggregation-transfer-backend in "
                    "('nixl', 'mooncake'), but got "
                    f"{server_args.disaggregation_transfer_backend!r}"
                )
            # ... 其他校验和配置
        else:
            server_args.disable_radix_cache = True
    # ... 其他模式与 staging buffer 检查

评论区精华

异步 CUDA 拷贝同步可能导致数据损坏 正确性

gemini-code-assist 指出 _stage_d2h 在流同步前返回字节,导致 GPU 写入未完成;_apply_frame 中 host_buf 可能在循环中被回收。

结论:该问题促使作者放弃纯 Python TCP 后端,改用 mooncake_tcp 别名方案。 · 已解决

锁内阻塞 connect 造成队头阻塞 性能

gemini-code-assist 建议 _get_client_sock 中的阻塞 connect 应在锁外执行。

结论:方案被放弃,未在最终代码中处理。 · 已解决

风险与影响

  1. 环境变量依赖MC_FORCE_TCP 行为依赖 mooncake 内部实现,版本变更可能影响。
  2. 测试覆盖:未添加针对 mooncake_tcp 的专用测试,仅依赖已有 PD 测试间接验证。
  3. 配置冲突:若用户同时设置 MC_FORCE_TCP=0setdefault 不会覆盖,但预期行为一致。
  • 用户影响:新增 --disaggregation-transfer-backend mooncake_tcp 选项,允许无 RDMA 环境使用 PD 分解。
  • 系统影响:TCP 传输延迟高于 RDMA,属正常预期。
  • 团队影响:维护成本极低,无新代码引入。
新后端路径缺少测试覆盖 环境变量依赖 mooncake 内部行为

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论