Appearance
NCCL 常见问题
1. NCCL 通信超时
现象: 训练时出现 NCCL timeout 或 Watchdog caught collective operation timeout。
排查步骤:
- 检查网络连通性:
ib_write_bw -d mlx5_0测试带宽 - 检查 RoCE 流控(PFC/ECN)是否开启
- 确认所有节点 NCCL 版本一致
- 增大超时时间:
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=13. 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. 单节点多卡通信正常,跨节点失败
排查思路:
- 检查跨节点网络连通性:
ping和ibping - 确认 SSH 免密互通
- 检查所有节点的
/etc/hosts配置一致 - 尝试用
torchrun单节点测试先验证基础环境
7. ncclAllReduce 报错 unhandled system error
可能原因:
- GPU 掉卡或 Xid 错误
- 系统内存不足导致 DMA 分配失败
- 驱动版本与 CUDA 不匹配
处理方法:
bash
# 查看 GPU 状态
nvidia-smi
dmesg | grep -i xid
# 检查内存
free -h