# PR #2151 完整报告

- 仓库：`THUDM/slime`
- 标题：fix(update_weight): bracket IPv6 master address in tcp:// init_method
- 合并时间：2026-07-01 17:49
- 原文链接：http://prhub.com.cn/THUDM/slime/pull/2151

---

# 执行摘要

- 一句话：修复 IPv6 环境下权重更新初始化崩溃
- 推荐动作：该 PR 虽小但关键，修复了分布式训练在 IPv6 环境下的阻塞问题，值得合并。建议阅读 `_wrap_ipv6` 的实现以确认其鲁棒性。

# 功能与动机

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

# 实现拆解

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_ipv6` 是 `slime.utils.http_utils` 中已有的工具函数，对 IPv4 和主机名直接返回原值，对 IPv6 地址自动添加方括号。

关键文件：
- `slime/backends/megatron_utils/update_weight/update_weight_from_distributed.py`（模块 后端；类别 source；类型 dependency-wiring；符号 connect_rollout_engines_from_distributed）: 修改了权重更新流程中进程组初始化的 `init_method`，增加 IPv6 地址包裹；是 PR 唯一变更的文件。

关键符号：connect_rollout_engines_from_distributed

## 关键源码片段

### `slime/backends/megatron_utils/update_weight/update_weight_from_distributed.py`

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

```python
# slime/backends/megatron_utils/update_weight/update_weight_from_distributed.py

from 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

```

# 评论区精华

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

- 暂无高价值评论线程

# 风险与影响

- 风险：风险极低。变更仅修改一行关键代码，且工具函数 `_wrap_ipv6` 已在其他模块中验证过，对 IPv4 和主机名行为不变。但该变更缺少测试覆盖，建议后续补充 IPv6 环境的集成测试。
- 影响：正面影响：使 Slime 框架能够在 IPv6/ 双栈集群上正常运行权重更新流程，扩大了部署环境的兼容性。影响范围仅限于 `connect_rollout_engines_from_distributed` 函数中的进程组初始化，不会影响其他功能。
- 风险标记：缺少测试覆盖

# 关联脉络

- PR #2148 feat: add _wrap_ipv6 to http_utils: 该 PR 引入了 `_wrap_ipv6` 函数，本 PR 依赖其功能。