PyTorch 分布式训练主要依赖:
nccl(NVIDIA GPU 推荐)gloo(CPU / 异构环境)mpi(传统 HPC)通信方式包括:
| 后端 | 设备 | 特点 |
|---|---|---|
| NCCL | GPU | 最快,支持 AllReduce / Broadcast |
| Gloo | CPU | 支持多机,速度一般 |
| MPI | CPU/GPU | HPC 环境,配置复杂 |
✅ GPU 训练几乎都用 NCCL
torch.distributed.init_process_group(backend="nccl")import os
import torch
import torch.distributed as dist
os.environ["MASTER_ADDR"] = "192.168.1.1"
os.environ["MASTER_PORT"] = "29500"
dist.init_process_group(
backend="nccl",
rank=int(os.environ["RANK"]),
world_size=int(os.environ["WORLD_SIZE"])
)用途:梯度同步(DDP 内部使用)
tensor = torch.ones(3).cuda()
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)if dist.get_rank() == 0:
tensor = torch.tensor([1,2,3]).cuda()
else:
tensor = torch.zeros(3).cuda()
dist.broadcast(tensor, src=0)Scatter(分发)
if dist.get_rank() == 0:
scatter_list = [torch.tensor([i]).cuda() for i in range(world_size)]
else:
scatter_list = None
tensor = torch.zeros(1).cuda()
dist.scatter(tensor, scatter_list, src=0)Gather(收集)
gather_list = [torch.zeros(1).cuda() for _ in range(world_size)]
dist.gather(tensor, gather_list, dst=0)tensor = torch.tensor([dist.get_rank()]).cuda()
output = [torch.zeros(1).cuda() for _ in range(world_size)]
dist.all_gather(output, tensor)# 发送
if dist.get_rank() == 0:
dist.send(tensor.cuda(), dst=1)
# 接收
if dist.get_rank() == 1:
dist.recv(tensor.cuda(), src=0)使用 DistributedDataParallel 时:
model = torch.nn.parallel.DistributedDataParallel(
model,
device_ids=[local_rank]
)✅ 通信是自动完成的:
✅ 使用 NCCL + GPU
✅ 开启 torch.backends.cudnn.benchmark = True
✅ 减少小 tensor 通信
✅ 使用 gradient_as_bucket_view=True
如果你愿意,我可以:
你现在是单机多卡还是多机多卡?