RuntimeError: Invalid rank
RuntimeError: Address already in use原因
init_process_group 参数错误RANK / WORLD_SIZE 未正确设置NCCL WARN ...
RuntimeError: NCCL error原因
原因
DistributedDataParallelbackward() 未在所有 rank 执行原因
barrier() 使用不当这是最重要的一步
export CUDA_VISIBLE_DEVICES=0
python train.py✅ 确保:
torchrun --nproc_per_node=2 train.py如果这里就报错,问题一定在:
import os
print(f"Rank {os.environ['RANK']} PID {os.getpid()}")或:
local_rank = int(os.environ["LOCAL_RANK"])
print(f"local_rank={local_rank}")不要直接调试完整训练代码
import torch
import torch.distributed as dist
dist.init_process_group("nccl")
print("init ok")
dist.destroy_process_group()✅ 正确方式:
model = model.to(local_rank)
model = DDP(model, device_ids=[local_rank])❌ 错误方式:
model = DDP(model) # 没指定 device_ids
model.cuda() # DDP 之后又 cuda✅ 推荐:
DistributedSampler(
dataset,
num_replicas=world_size,
rank=rank,
shuffle=True
)dataloader = DataLoader(
dataset,
batch_size=...,
sampler=sampler,
num_workers=0 # 调试阶段设为 0
)⚠️ 注意:
shuffle=Truesampler.set_epoch(epoch)torch.distributed.barrier() 定位 hangprint("before barrier")
dist.barrier()
print("after barrier")如果卡住,说明:
loss = loss.detach().clone()
print(f"Rank {rank} loss {loss.item()}")如果每个 rank 的 loss 完全不一样,说明:
torchrun \
--nproc_per_node=4 \
--nnodes=1 \
--node_rank=0 \
--master_addr=127.0.0.1 \
--master_port=29500 \
train.pyRANK
LOCAL_RANK
WORLD_SIZE
MASTER_ADDR
MASTER_PORT| 错误 | 原因 | 解决 |
|---|---|---|
| NCCL error | GPU 通信失败 | 单卡先跑、检查 NCCL |
| hang | 死锁 | 用 barrier 定位 |
| loss 不一致 | 数据不同 | 用 DistributedSampler |
| Address already in use | 端口冲突 | 换 master_port |
| 某 rank 没训练 | 条件分支 | 打印 rank |
✅ 先单卡
✅ 再 torchrun 单机多卡
✅ 打印 rank / loss
✅ DataLoader 用 DistributedSampler
✅ DDP 后不再 .cuda()
✅ num_workers=0 调试
你可以直接贴:
我可以逐行帮你定位问题,甚至给你一个最小可运行 DDP 模板。