在进行大语言模型(LLM)的分布式训练时,我们遇到了一个典型的PyTorch分布式训练问题:RuntimeError: Expected all tensors to be on the same device。这个问题通常出现在使用torch.nn.parallel.DistributedDataParallel进行多GPU训练时。
复现步骤:
- 启动分布式训练进程:
torchrun --nproc_per_node=2 train.py - 在代码中初始化进程组:
dist.init_process_group(backend='nccl', rank=rank, world_size=world_size) - 将模型和数据移动到GPU:
model = model.cuda()和data = data.cuda() - 训练过程中出现错误。
解决方案: 关键在于确保所有张量都在同一设备上。正确的做法是将模型和数据同时移动到同一GPU上,例如:
# 确保模型在正确的GPU上
model = model.to(rank)
# 确保数据也在相同GPU上
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[rank])
此外,还需检查环境变量是否正确设置:export CUDA_VISIBLE_DEVICES=0,1。该问题的根源通常在于设备不一致或分布式初始化错误。
安全建议: 在进行分布式训练时,确保所有节点的环境配置一致,并且使用版本兼容的PyTorch和CUDA库。避免直接暴露模型参数或训练数据至公网。

讨论