现象
nvidia-smi 看到 GPU 在等数据原因
DataLoader 没开 num_workers 或太小解决
DataLoader(
dataset,
batch_size=batch_size,
num_workers=8, # 建议 = CPU 核心数 / GPU 数
pin_memory=True,
prefetch_factor=2,
persistent_workers=True
)DistributedDataParallel 却没正确设置错误示例
model = DDP(model) # ❌ 忘了 device_ids正确写法
model = model.to(local_rank)
model = DDP(model, device_ids=[local_rank])常见坑
device_ids 没设local_rank 和 rank 搞混CUDA_VISIBLE_DEVICES 但没对应现象
原因
排查
export NCCL_DEBUG=INFO优化建议
export NCCL_IB_DISABLE=0 # 启用 InfiniBand
export NCCL_SOCKET_IFNAME=eth0 # 指定网卡现象
原因
解决
batch_size_per_gpuloss = loss / accum_steps
loss.backward()
if step % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()典型问题
.item().cpu()print(loss)# ❌ 慢
print(loss.item())
# ✅ 快
if rank == 0:
print(loss.detach())慢操作
torch.distributed.all_reduce 手动调用gather / broadcast 频繁不推荐
python train.py推荐
torchrun --nproc_per_node=8 train.py或
python -m torch.distributed.launch影响
解决
from torch.cuda.amp import autocast, GradScaler
with autocast():
output = model(x)错误
batch_size = 32 # 单卡正确
batch_size = 32 * world_size你可以按顺序检查:
num_workers 是否 ≥ 4?DDP 而不是 DP?batch_size_per_gpu 是否太小?.item() / .cpu()?NCCL_DEBUG=INFO 是否正常?PyTorch 分布式训练慢,90% 不是 DDP 慢,而是:
- 数据加载慢
- 通信配置差
- batch size 不合理
- 有隐藏的 CPU–GPU 同步
如果你愿意,可以直接贴:
nvidia-smi 截图我可以精准帮你定位是哪一条在拖慢训练。