Skip to content

NCCL 常见问题 ​

1. NCCL 通信超时 ​

现象: 训练时出现 NCCL timeout 或 Watchdog caught collective operation timeout。

排查步骤:

  1. 检查网络连通性:ib_write_bw -d mlx5_0 测试带宽
  2. 检查 RoCE 流控(PFC/ECN)是否开启
  3. 确认所有节点 NCCL 版本一致
  4. 增大超时时间:export NCCL_TIMEOUT=1800

2. NCCL 初始化失败 / ncclSystemError ​

现象: 启动多卡训练时报 ncclSystemError: System call (e.g. socket, malloc) or internal error。

常见原因:

  • 防火墙拦截了通信端口
  • IB/RoCE 网卡状态异常
  • GPU 间 P2P 访问失败

解决方法:

bash
# 检查网卡状态
ibstat
# 检查 GPU 拓扑
nvidia-smi topo -m
# 禁用 IB 使用 TCP 回退
export NCCL_IB_DISABLE=1

3. NCCL 通信性能差 ​

现象: 多卡训练时 GPU 利用率低,NCCL 通信耗时占比高。

优化方向:

  • 开启 IB/RoCE 硬件卸载:export NCCL_IB_GID_INDEX=3
  • 调整 ring 顺序:export NCCL_NET_GDR_LEVEL=5
  • 使用 nvlink 拓扑感知的算法:export NCCL_ALGO=Ring
  • 检查 PCIe 带宽:nvidia-smi q -d PCI

4. NCCL 版本兼容性问题 ​

现象: 不同节点 NCCL 版本不一致导致通信异常。

建议:

  • 统一使用 Docker 镜像确保版本一致
  • 查看版本:/usr/local/bin/nccl-tests/build/all_reduce_perf --help | head
  • 推荐版本:NCCL 2.18+ 配合 CUDA 12.x

5. NCCL 与 RoCE 配合使用 ​

常见配置项:

bash
export NCCL_IB_HCA=mlx5_0:1,mlx5_1:1     # 指定 IB/RoCE 网卡
export NCCL_IB_GID_INDEX=3                 # RoCEv2 需要
export NCCL_IB_TC=128                      # 流量分类
export NCCL_IB_SL=5                        # 服务等级
export NCCL_IB_QPS_PER_CONNECTION=8        # 队列对数
export NCCL_NET_GDR_READ=1                 # GPU Direct RDMA 读取

6. 单节点多卡通信正常,跨节点失败 ​

排查思路:

  1. 检查跨节点网络连通性:ping 和 ibping
  2. 确认 SSH 免密互通
  3. 检查所有节点的 /etc/hosts 配置一致
  4. 尝试用 torchrun 单节点测试先验证基础环境

7. ncclAllReduce 报错 unhandled system error ​

可能原因:

  • GPU 掉卡或 Xid 错误
  • 系统内存不足导致 DMA 分配失败
  • 驱动版本与 CUDA 不匹配

处理方法:

bash
# 查看 GPU 状态
nvidia-smi
dmesg | grep -i xid
# 检查内存
free -h