在Ubuntu上进行PyTorch的多GPU训练,你需要确保你的系统配置了多个GPU,并且已经安装了支持多GPU的PyTorch版本。以下是进行多GPU训练的基本步骤:
检查GPU可用性: 在开始之前,你可以使用以下命令来检查是否有多个GPU可用:
import torch
print(torch.cuda.device_count())
数据并行:
PyTorch提供了torch.nn.DataParallel
类来实现简单的数据并行。这是一个快速的实现方式,但它有一些限制,比如不支持某些层的并行化。
import torch
import torch.nn as nn
from torchvision import models
# 假设你有一个模型和数据加载器
model = models.resnet18(pretrained=True)
model.cuda() # 将模型发送到GPU
# 如果有多个GPU,使用DataParallel
if torch.cuda.device_count() > 1:
print(f"Let's use {torch.cuda.device_count()} GPUs!")
model = nn.DataParallel(model)
# 现在你可以像平常一样训练模型
# ...
分布式数据并行(DDP):
对于更复杂的场景,尤其是当你需要更大规模的并行化时,可以使用torch.nn.parallel.DistributedDataParallel
。DDP提供了更好的性能和更多的功能,但它需要更多的设置。
import torch
import torch.nn as nn
from torch.nn.parallel import DistributedDataParallel as DDP
from torchvision import models
import torch.distributed as dist
from torch.utils.data import DataLoader
from torch.nn.parallel import DistributedSampler
# 初始化分布式环境
dist.init_process_group(backend='nccl') # 'nccl' is recommended for distributed GPU training
# 假设你有一个模型、数据集和数据加载器
model = models.resnet18(pretrained=True).cuda()
model = DDP(model)
# 创建一个分布式采样器
dataset = ... # 你的数据集
sampler = DistributedSampler(dataset)
loader = DataLoader(dataset, batch_size=..., sampler=sampler)
# 训练模型
# ...
注意:使用DDP时,你需要为每个进程指定一个唯一的rank,并且通常会在命令行中使用-m
参数来启动多个进程。
运行多GPU训练:
如果你使用的是DataParallel
,你可以直接运行你的训练脚本,PyTorch会自动检测并使用所有可用的GPU。
如果你使用的是DDP,你需要在命令行中使用torch.distributed.launch
或accelerate
库来启动你的训练脚本。例如:
python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE YOUR_TRAINING_SCRIPT.py
或者,如果你使用accelerate
库:
accelerate launch YOUR_TRAINING_SCRIPT.py
确保你的PyTorch版本支持多GPU训练,并且你的硬件和驱动程序都是最新的。此外,多GPU训练可能需要大量的内存和带宽,因此确保你的系统资源足够。