跳到主要内容

集合通信死锁

NCCL 调用序不一致如何导致训练 hang 及预防方法

核心要点

  • 集合通信死锁多是应用层逻辑死锁
  • ring / tree 数据依赖天然无环
  • 跨 rank 调用序不一致是主因
  • NCCL on-GPU 忙等控制使其易 hang
  • 调用序一致 + NCCL_LAUNCH_ORDER_IMPLICIT 预防

前置阅读

集合通信死锁和网络死锁是一回事吗?

不是。集合通信死锁绝大多数是应用层的逻辑死锁,不是网络通道死锁

  • 网络死锁(02-05 各章):缓冲 / 通道 / 消息类的循环等待,发生在硬件与协议层。
  • 集合通信死锁:各 rank 调用集合操作的顺序不一致,导致 GPU 上的通信 kernel 互相等待——环在应用调用逻辑里,不在网络里。

因此它的预防手段也不同:不是改路由或加虚网络,而是保证所有 rank 以一致顺序发起集合操作。这是训练 hang 最常见的根因之一。

为什么 ring / tree 算法本身不死锁?

ring / tree 等集合通信算法的数据依赖是链状 / 树状的,天然无环,因此算法本身不会死锁

  • Ring:每个 rank 只等它的前驱发来数据、向后继发出——依赖是一条单向链,无环。
  • Tree:依赖沿树的父子方向,也是无环的有向图。

只要缓冲充足、所有 rank 都按同一算法参与,ring / tree 的执行就能逐步推进到完成(算法细节见 04-集合通信)。换句话说,死锁不来自算法结构,而来自 rank 之间「谁先调用哪个集合」的不一致

调用序不一致为什么导致 hang?

NCCL 把控制逻辑下放到 GPU 上忙等(busy-wait)执行,一旦各 rank 的通信 kernel 执行顺序错位,就会互相空等而 hang[1]

成因链:

  • 一个集合操作要所有 rank 的对应 kernel 都就位才能推进
  • 若 rank A 先发起 all-reduce、再发起 all-gather,而 rank B 顺序相反,两边的 kernel 互相等对方那个还没发起的——循环等待,死锁
  • 在 N-D 并行(如 FSDP)下,不同 process group 把集合 back-to-back 调度到同一 GPU 且无同步时,GPU 通信 kernel 的执行顺序可能跨 rank 不一致,触发死锁
  • NCCL 2.26 之前,per-device 用多个 communicator 必须把所有通信操作串成一致的全局序(靠 CUDA stream 依赖或同步),否则死锁[2]

症状:进程卡死、GPU 利用率居高不下、NCCL 日志无有效信息——典型的应用层死锁表现。调用序一致与相反两种情形的对比见 @fig-deadlock-nccl-order

两 rank 调用序一致时每个集合双方 kernel 都到齐、正常完成(左);调用序相反时各等对方尚未发起的集合、互相空等而 hang(右)@fig-deadlock-nccl-order

怎么预防集合通信死锁?

根本预防是保证所有 rank 的 host 侧发起顺序一致,最可靠的做法是每 device 用单一 host 线程按确定顺序发起[2]。在此之上有两层工具:

  • NCCL_LAUNCH_ORDER_IMPLICIT(NCCL 2.26):隐式按 host 发起操作的顺序给通信 kernel 之间加依赖,从而在 per-device 多 communicator 场景下防死锁。默认关闭(会增加延迟)[2]
  • DFCCL(库底层抢占式预防):在 GPU 集合通信库底层实现抢占,对循环集合依赖做全面死锁预防[1]

预防的共同点:都是在调用 / 调度层强制一致顺序或打破循环依赖,而非在网络层。

hang 了怎么诊断?

集合通信 hang 的难点是 NCCL 日志信息少,需专用工具还原各 rank 的集合调用轨迹

  • NCCL watchdog:检测集合操作超时(卡住超过阈值),报 timeout(与故障检测一并见 10-集群可靠性/05-弹性训练)。
  • Flight Recorder(PyTorch):记录每个 rank 的集合操作轨迹,watchdog timeout 时 dump,定位是哪个集合、哪些 rank 没到齐、调用序在哪错位[3]

诊断思路:对比各 rank 的集合调用序列,找出「卡住的那个集合在不同 rank 上的发起顺序是否一致」——不一致即根因。

Takeaway

问题结论
与网络死锁的区别集合通信死锁是应用层逻辑死锁,环在调用逻辑非网络
ring / tree 是否会死锁算法数据依赖天然无环,本身不死锁
主因跨 rank 集合调用序不一致 + NCCL on-GPU 忙等
预防host 发起序一致;NCCL_LAUNCH_ORDER_IMPLICIT;DFCCL
诊断NCCL watchdog timeout + Flight Recorder 还原调用轨迹

@tbl-deadlock-collective-takeaway 集合通信死锁速查

开放问题

  • 调研 NCCL_LAUNCH_ORDER_IMPLICIT 开启后的延迟代价实测
  • 整理 Megatron-LM / FSDP 中常见的集合调用序陷阱清单

参考资料

  1. Pan et al., Comprehensive Deadlock Prevention for GPU Collective Communication (DFCCL), arXiv:2303.06324, 2023. https://arxiv.org/abs/2303.06324
  2. NVIDIA, Improved Performance and Monitoring Capabilities with NCCL 2.26, 2025. https://developer.nvidia.com/blog/improved-performance-and-monitoring-capabilities-with-nvidia-collective-communications-library-2-26
  3. PyTorch, Flight Recorder: A New Lens for Understanding NCCL Watchdog Timeouts. https://pytorch.org/blog/flight-recorder-a-new-lens-for-understanding-nccl-watchdog-timeouts/

延伸阅读