在 Linux 下使用 PyTorch 进行多卡(多 GPU)训练,常见方式有以下几种,从简单到进阶:
torch.nn.DataParallel(简单但不推荐新项目)适合单机多卡、快速上手,但效率不如 DistributedDataParallel。
import torch
import torch.nn as nn
model = MyModel()
model = nn.DataParallel(model) # 默认使用所有 GPU
model = model.cuda()
注意:
DistributedDataParallel(DDP,单机/多机都支持)torchrun)torchrun \
--nproc_per_node=4 \
train.py
import torch
import torch.distributed as dist
import torch.multiprocessing as mp
from torch.nn.parallel import DistributedDataParallel as DDP
def main():
dist.init_process_group(backend="nccl")
local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
model = MyModel().cuda(local_rank)
model = DDP(model, device_ids=[local_rank])
# 数据
dataset = MyDataset()
sampler = torch.utils.data.distributed.DistributedSampler(dataset)
loader = torch.utils.data.DataLoader(
dataset, batch_size=32, sampler=sampler
)
for x, y in loader:
x, y = x.cuda(local_rank), y.cuda(local_rank)
loss = model(x, y)
loss.backward()
optimizer.step()
if __name__ == "__main__":
main()
✅ 优点:
假设:
# 机器 0
torchrun \
--nnodes=2 \
--node_rank=0 \
--nproc_per_node=4 \
--master_addr=192.168.1.1 \
--master_port=29500 \
train.py
# 机器 1
torchrun \
--nnodes=2 \
--node_rank=1 \
--nproc_per_node=4 \
--master_addr=192.168.1.1 \
--master_port=29500 \
train.py
nvidia-smi
DistributedSamplerDataParallel 但代码写错batch_sizegradient_accumulationtorch.cuda.empty_cache()| 场景 | 推荐方式 |
|---|---|
| 快速实验 | DataParallel |
| 单机多卡训练 | DDP + torchrun |
| 多机训练 | DDP |
| 大模型 | DDP + 模型并行 |
如果你愿意,可以告诉我:
我可以直接给你一份可运行的多卡训练代码。