Prhub

#2151 fix(update_weight): bracket IPv6 master address in tcp:// init_method

原始 PR 作者 realJaydenCheng 合并时间 2026-07-01 17:49 文件变更 1 提交数 1 评论 0 代码增减 +2 / -1

执行摘要

修复 IPv6 环境下权重更新初始化崩溃

在 IPv6 或双栈集群上运行时,torch.distributedtcp:// 初始化方法要求 IPv6 地址用方括号包裹(例如 tcp://[::1]:29500)。而 ray._private.services.get_node_ip_address() 在 IPv6 环境中可能返回裸 IPv6 地址,导致拼接后的 URI 格式错误,权重更新的分布式进程组初始化失败。PR 的描述明确指出了该问题及修复方式。

该 PR 虽小但关键,修复了分布式训练在 IPv6 环境下的阻塞问题,值得合并。建议阅读 _wrap_ipv6 的实现以确认其鲁棒性。

讨论亮点

该 PR 没有 review 评论或讨论,变更简单直接,未产生争议。

实现拆解

  1. 新增导入:在文件 slime/backends/megatron_utils/update_weight/update_weight_from_distributed.py 中增加 from slime.utils.http_utils import _wrap_ipv6
  2. 修改 URI 构造:在 connect_rollout_engines_from_distributed 函数中,将 init_method=f"tcp://{master_address}:{master_port}" 改为 init_method=f"tcp://{_wrap_ipv6(master_address)}:{master_port}"
  3. 工具函数复用_wrap_ipv6slime.utils.http_utils 中已有的工具函数,对 IPv4 和主机名直接返回原值,对 IPv6 地址自动添加方括号。
文件 模块 状态 重要度
slime/backends/megatron_utils/update_weight/update_weight_from_distributed.py 后端 modified 5.16

关键符号

connect_rollout_engines_from_distributed

关键源码片段

slime/backends/megatron_utils/update_weight/update_weight_from_distributed.py dependency-wiring

修改了权重更新流程中进程组初始化的 `init_method`,增加 IPv6 地址包裹;是 PR 唯一变更的文件。

# slime/backends/megatron_utils/update_weight/update_weight_from_distributed.pyfrom slime.utils.http_utils import _wrap_ipv6 # 新增导入,用于 IPv6 地址包裹def connect_rollout_engines_from_distributed(
    args: Namespace,
    rollout_engines: Sequence[ActorHandle],
    group_name: str,
    engine_gpu_counts: list[int] | None = None,
) -> dist.ProcessGroup:
    # ... ( 省略前面的逻辑 )
    master_address = ray._private.services.get_node_ip_address()
    with socket.socket() as sock:
        sock.bind(("", 0))
        master_port = sock.getsockname()[1]
    world_size = sum(engine_gpu_counts) + 1
​
    # 计算累积偏移量 ...
    # 发起远程调用
    refs = [engine.init_weights_update_group.remote(...) for ...]
​
    # 关键修复:对 master_address 应用 _wrap_ipv6,确保 IPv6 地址被方括号包裹
    model_update_groups = init_process_group(
        backend="nccl",
        init_method=f"tcp://{_wrap_ipv6(master_address)}:{master_port}",
        world_size=world_size,
        rank=0,
        group_name=group_name,
    )
    ray.get(refs)
    return model_update_groups

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低。变更仅修改一行关键代码,且工具函数 _wrap_ipv6 已在其他模块中验证过,对 IPv4 和主机名行为不变。但该变更缺少测试覆盖,建议后续补充 IPv6 环境的集成测试。

正面影响:使 Slime 框架能够在 IPv6/双栈集群上正常运行权重更新流程,扩大了部署环境的兼容性。影响范围仅限于 connect_rollout_engines_from_distributed 函数中的进程组初始化,不会影响其他功能。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论