# PR #7512 完整报告

- 仓库：`verl-project/verl`
- 标题：[trainer] fix: update backend initialization in initialize_global_process_group
- 合并时间：2026-08-27 14:28
- 原文链接：http://prhub.com.cn/verl-project/verl/pull/7512

---

# 执行摘要

- 一句话：统一进程组初始化后端为 cpu:gloo+ 设备后端
- 推荐动作：该 PR 值得精读，作为理解 veril 分布式初始化 back-end 处理的一个好例子。建议关注以下几点：
 1. 分离后端字符串的构造方式，以及如何将 CPU 操作显式路由到 Gloo。
 2. 如何通过对齐 ray 版本实现一致性，体现了代码复用和一致性设计。

# 功能与动机

PR body 明确指出，initialize_global_process_group 仅使用 get_nccl_backend() 初始化进程组，导致 CPU 操作（如 CPU 张量的 broadcast）回退到默认单后端行为，这与 initialize_global_process_group_ray 使用的分离后端字符串不一致。为修复这一不一致，构造相同的后端字符串以显式将 CPU 操作路由到 Gloo，保证两条初始化路径的一致性。

# 实现拆解

变更集中在 verl/utils/distributed.py 的 initialize_global_process_group 函数。

1. 构造后端字符串：在调用 torch.distributed.init_process_group 之前，新增 backend = f"cpu:gloo,{get_device_name()}:{get_nccl_backend()}"。
2. 替换后端参数：将原先的 get_nccl_backend() 位置参数改为 backend=backend 关键字参数，传入构造的分离后端字符串。
3. 与 ray 版本对齐：该字符串与 initialize_global_process_group_ray 中默认构造的 backend 字符串完全相同，使两个初始化路径行为一致。

测试：本次改动未新增或修改测试文件。
配置：无配置变更。
部署：无部署配套。

关键文件：
- `verl/utils/distributed.py`（模块 分布式工具；类别 source；类型 core-logic）: 核心变更文件，修改了 initialize_global_process_group 的后端初始化逻辑，使其与 ray 版本一致。

关键符号：initialize_global_process_group

## 关键源码片段

### `verl/utils/distributed.py`

核心变更文件，修改了 initialize_global_process_group 的后端初始化逻辑，使其与 ray 版本一致。

```python
# verl/utils/distributed.py
def initialize_global_process_group(timeout_second=36000):
    # 构造分离后端字符串，使 CPU 操作经 Gloo 路由，设备操作（如 NCCL/HCCL）保持原有后端
    backend = f"cpu:gloo,{get_device_name()}:{get_nccl_backend()}"
    torch.distributed.init_process_group(
        backend=backend,
        timeout=timedelta(seconds=timeout_second),
        init_method=os.environ.get("DIST_INIT_METHOD", None),
    )
    local_rank = int(os.environ["LOCAL_RANK"])
    rank = int(os.environ["RANK"])
    world_size = int(os.environ["WORLD_SIZE"])

    if torch.distributed.is_initialized():
        get_torch_device().set_device(local_rank)
    return local_rank, rank, world_size

```

# 评论区精华

本 PR 无 review 评论和讨论线程。仅有一个审核者 wuxibin89 的 APPROVED 状态，且 review body 为空，说明审核通过且无额外讨论。

- 暂无高价值评论线程

# 风险与影响

- 风险：该变更会影响所有非 ray 场景下的分布式进程组初始化。主要风险包括：
 1. 后端字符串要求 gloo 后端可用，若环境未安装 gloo 或无法提供 gloo 后端，可能导致初始化失败。
 2. get_device_name() 返回值需与进程组后端名称匹配，若设备名不规范可能导致 backend 字符串无效。
 3. 依赖 CPU 操作通过 gloo 的行为，可能引入额外的通信开销或延迟，但在大多数场景下影响较小。
 4. 由于没有新增测试，回归风险不可完全排除。
 - 影响：影响范围：所有使用 initialize_global_process_group 的非 ray 分布式训练场景，覆盖 fsdp、megatron 等后端。影响程度中等，因为该改动修复了 CPU 操作在分布式环境中的正确性，可能影响依赖 CPU 通信的算子行为。对用户而言，行为将从可能出错或回退到非预期后端，变为显式使用 gloo 路由，提升了可预期性。对团队而言，两条初始化路径的一致性降低了后续维护成本。
 - 风险标记：核心路径变更 , 缺少测试覆盖

# 关联脉络

- PR #7544 [BREAKING][megatron, cfg] fix: remove unused grad_offload: 同为 trainer 相关配置与初始化清理，涉及进程组初始化相关的配置项移除，与本 PR 共享 trainer 模块上下文。
- PR #7466 [cfg, megatron, doc] fix: drop unused actor.router_replay in favor of engine config: 同为 trainer 相关配置与初始化清理，涉及进程组初始化相关的配置项移除，与本 PR 共享 trainer 模块上下文。