分布式训练中节点间通信失败排查记录
在使用 PyTorch Distributed Training 进行大模型训练时,我们遇到了节点间通信失败的问题。本文将详细记录排查过程和解决方案。
问题现象
训练过程中出现 torch.distributed.nccl.Backend 相关错误,具体为 NCCL ERROR,报错信息如下:
RuntimeError: NCCL error: invalid usage
NCCL error: invalid device pointer
排查步骤
-
环境检查
- 确认所有节点的 CUDA 版本一致
- 检查
nccl版本是否匹配:nccl --version - 验证
CUDA_VISIBLE_DEVICES设置正确
-
代码复现
import torch
import torch.distributed as dist
import torch.multiprocessing as mp
def setup(rank, world_size):
backend = "nccl" if torch.cuda.is_available() else "gloo"
dist.init_process_group(backend, rank=rank, world_size=world_size)
def cleanup():
dist.destroy_process_group()
if __name__ == "__main__":
world_size = 2
mp.spawn(run, args=(world_size,), nprocs=world_size, join=True)
- 关键排查点
- 检查 GPU 内存分配是否正常:
nvidia-smi - 查看 NCCL 环境变量设置:
export NCCL_DEBUG=INFO export NCCL_DEBUG_SUBSYS=ALL - 确保每节点使用独立的 GPU,避免资源冲突
- 检查 GPU 内存分配是否正常:
解决方案
通过排查发现是由于 GPU 内存不足导致通信异常。解决方法包括:
- 增加单个进程的内存分配
- 减少 batch size 以降低显存占用
- 更新 NCCL 版本至最新稳定版本
总结
在分布式训练中,节点间通信失败往往是硬件资源不足或环境配置不当所致。通过系统性排查和日志分析可快速定位问题。
建议后续使用 torchrun 替代 mp.spawn 进行更稳定的多进程启动。

讨论