Prhub

#45159 fix(distributed): propagate distributed_timeout_seconds to NCCL device groups

原始 PR 作者 jialoop-git 合并时间 2026-07-07 10:52 文件变更 2 提交数 11 评论 5 代码增减 +36 / -3

执行摘要

修复 NCCL 设备组超时未从配置传播的问题

用户反馈设置 --distributed-timeout-seconds 3600 后,长时间 Triton JIT 编译仍被 NCCL 看门狗在 600 秒后终止(issue #45078)。根因是 GroupCoordinator.__init__() 中 NCCL device_group 未接收任何超时,且 CPU 组超时使用的是独立的 cpu_distributed_timeout_seconds 字段。

值得关注的设计决策包括分离 CPU 与设备超时配置,以及覆盖所有代码路径(包括 experimental split_group)。PR 本身逻辑清晰,可作为分布式配置传播的参考实现。建议代码审阅者和开发者关注类似的配置传播模式,确保新加的参数不会遗漏。

讨论亮点

Reviewer tomeras91 指出:同样的超时传播问题也存在于 VLLM_DISTRIBUTED_USE_SPLIT_GROUP=True 路径和 stateless_init_torch_distributed_process_group 函数中,建议一并修复。作者在后续 commit 中已补全这两处,获得了 reviewer 的批准。

实现拆解

  1. 新增 get_distributed_timeout_or_none() 辅助函数:在 vllm/distributed/utils.py 中,模仿 get_cpu_distributed_timeout_or_none() 编写新函数,从 vllm_config.parallel_config.distributed_timeout_seconds 读取超时值。
  2. 修复 stateless 路径:在 stateless_init_torch_distributed_process_group 中,对非 gloo 后端(即 NCCL)调用新函数覆盖默认超时。
  3. 修复常规 new_group 路径:在 GroupCoordinator.__init__ 中,导入 get_distributed_timeout_or_none 并作为 timeout 参数传入 torch.distributed.new_group
  4. 修复 make_sibling_device_group:在创建兄弟设备组时也传入设备超时。
  5. 修复 split_group 路径:在 _create_subgroups_split_group 中,为 split_group 分别传入设备超时和 CPU 超时,覆盖 VLLM_DISTRIBUTED_USE_SPLIT_GROUP=True 实验性路径。
  6. 验证:通过 Tensor Parallel 双卡脚本手动验证,模型初始化成功且推理正常,未复现超时错误。未添加自动化测试。
文件 模块 状态 重要度
vllm/distributed/utils.py 分布式工具 modified 6.7
vllm/distributed/parallel_state.py 并行状态 modified 6.21

关键符号

get_distributed_timeout_or_none stateless_init_torch_distributed_process_group GroupCoordinator.__init__ make_sibling_device_group _create_subgroups_split_group

关键源码片段

vllm/distributed/parallel_state.py dependency-wiring

在 `GroupCoordinator.__init__`、`make_sibling_device_group` 和 `_create_subgroups_split_group` 中将超时传递给 NCCL 组创建,覆盖所有代码路径。

def _create_subgroups_split_group(
    group_ranks: list[list[int]],
    group_name: str,
    torch_distributed_backend: str | Backend,
) -> tuple[ProcessGroup, ProcessGroup]:
    from vllm.distributed.utils import (
        get_cpu_distributed_timeout_or_none,
        get_distributed_timeout_or_none,
    )
​
    device_backend_str = _device_backend_str(torch_distributed_backend)
    # 设备子组:传入设备超时(distributed_timeout_seconds)
    self_device_group = torch.distributed.split_group(
        split_ranks=group_ranks,
        group_desc=f'{group_name}:device',
        backend=device_backend_str,
        timeout=get_distributed_timeout_or_none(),
    )
    # CPU 子组:传入 CPU 超时(cpu_distributed_timeout_seconds)
    self_cpu_group = torch.distributed.split_group(
        split_ranks=group_ranks,
        group_desc=f'{group_name}:cpu',
        backend=f'cpu:gloo,{device_backend_str}',
        timeout=get_cpu_distributed_timeout_or_none(),
    )
    return self_device_group, self_cpu_group

评论区精华

超时传播到拆分组路径和 stateless 路径 设计

Reviewer tomeras91 指出相同的超时传播问题也存在于 VLLM_DISTRIBUTED_USE_SPLIT_GROUP=True 路径和 stateless_init_torch_distributed_process_group 函数中,建议一并修复。

结论:作者在后续 commit 中为两个路径均添加了超时传递,reviewer 认可并 approved。 · 已解决

风险与影响

  • 缺少测试覆盖:改动未包含自动化测试,依赖手动验证,未来重构可能引入回归。
  • 核心路径变更:分布式初始化是系统关键路径,但改动仅为传递参数,逻辑简单,风险可控。
  • 超时值为 None:当用户未设置超时时,行为退化为 PyTorch 默认(600秒),与之前一致,无破坏性。
  • 用户:设置 --distributed-timeout-seconds 的用户将正确获得自定义超时,避免 NCCL 看门狗误判。
  • 系统:不影响默认行为,仅在显式设置超时时生效。
  • 团队:解决了持续影响用户的分布式超时问题,减少用户工作区。
缺少测试覆盖 核心路径变更 潜在回归风险

关联 Issue

#45078 [Bug]: --distributed-timeout-seconds not propagating to the NCCL TP group

完整报告

参与讨论