不要盲目调参,先定位:
常用工具:
nvidia-smi dmontorch.profilerpy-spy / nsight| 场景 | 推荐 |
|---|---|
| 单机多卡 | DDP(默认最优) |
| 大模型 / 显存不够 | FSDP |
| 超大模型 | FSDP + CPU offload |
| 推理 | DDP / Tensor Parallel |
dist.init_process_group(
backend="nccl",
init_method="env://"
)ncclgloo✅ 正确做法:
train_sampler = DistributedSampler(dataset)
loader = DataLoader(
dataset,
batch_size=...,
num_workers=4~8,
pin_memory=True,
prefetch_factor=2
)❌ 常见错误:
✅ 提升效果明显:
WebDataset / TFRecord环境变量(非常关键):
export NCCL_ASYNC_ERROR_HANDLING=1
export NCCL_P2P_LEVEL=NVL
export NCCL_IB_DISABLE=0 # 多机用 IB多机:
tcpDDP 自动 AllReduce,但可以优化:
✅ 使用:
torch.cuda.amp.autocast()
torch.cuda.amp.GradScaler()✅ 梯度压缩(极端场景):
torch.distributed.algorithms.ddp_comm_hooksnew_lr = base_lr * (world_size * batch_per_gpu / base_batch)⚠ 注意:
1024 总 batch 通常需要 LR warmup
with torch.cuda.amp.autocast():
output = model(input)model.gradient_checkpointing_enable()from torch.distributed.fsdp import FSDP选项:
sharding_strategy=FULL_SHARDcpu_offloadexport NCCL_SOCKET_IFNAME=eth0✅ 推荐:
torchrun --nproc_per_node=8 --nnodes=2 train.pymodel = model.to(device)
model = DDP(model, device_ids=[local_rank])
optimizer = ...
for x, y in loader:
x, y = x.cuda(), y.cuda()
with torch.cuda.amp.autocast():
loss = model(x, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()你可以告诉我:
我可以直接给你针对性配置和代码片段。