在Linux环境下,使用PyTorch进行分布式训练通常涉及以下几个步骤:
环境准备:
启动分布式训练:
PyTorch提供了torch.distributed.launch
工具来启动分布式训练。你需要指定一些参数,如总的GPU数量、每个节点的GPU数量、节点的IP地址和端口号等。
python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_PER_NODE \
--nnodes=NUM_NODES --node_rank=NODE_RANK --master_addr=MASTER_IP \
--master_port=MASTER_PORT YOUR_TRAINING_SCRIPT.py
参数说明:
--nproc_per_node
:每个节点上使用的GPU数量。--nnodes
:总的节点数量。--node_rank
:当前节点的排名(从0开始)。--master_addr
:主节点的IP地址。--master_port
:主节点的端口号。YOUR_TRAINING_SCRIPT.py
:你的训练脚本。修改训练脚本: 在你的训练脚本中,需要初始化分布式环境。通常在脚本的最开始添加以下代码:
import torch.distributed as dist
dist.init_process_group(backend='nccl', # 或者 'gloo'
init_method='tcp://MASTER_IP:MASTER_PORT',
world_size=WORLD_SIZE, # 总的进程数
rank=RANK) # 当前进程的排名
参数说明:
backend
:分布式后端,常用的有nccl
(用于GPU)和gloo
(用于CPU和GPU)。init_method
:初始化分布式环境的地址。world_size
:总的进程数。rank
:当前进程的排名。数据并行:
在训练脚本中,使用torch.nn.parallel.DistributedDataParallel
来包装你的模型,以实现数据并行。
model = YourModel().to(rank)
ddp_model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[rank])
数据加载:
使用torch.utils.data.distributed.DistributedSampler
来包装你的数据集,以确保每个进程处理不同的数据子集。
from torch.utils.data import DataLoader, DistributedSampler
dataset = YourDataset()
sampler = DistributedSampler(dataset)
dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, sampler=sampler)
运行训练: 现在你可以像平常一样运行你的训练脚本,PyTorch会自动处理分布式训练的细节。
以下是一个完整的示例:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, DistributedSampler
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 初始化分布式环境
dist.init_process_group(backend='nccl', init_method='tcp://MASTER_IP:MASTER_PORT', world_size=WORLD_SIZE, rank=RANK)
# 定义模型
class YourModel(nn.Module):
def __init__(self):
super(YourModel, self).__init__()
# 定义模型结构
def forward(self, x):
# 前向传播
return x
model = YourModel().to(rank)
ddp_model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[rank])
# 加载数据
transform = transforms.Compose([transforms.ToTensor()])
dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
sampler = DistributedSampler(dataset)
dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, sampler=sampler)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(ddp_model.parameters(), lr=0.01)
# 训练模型
for epoch in range(EPOCHS):
sampler.set_epoch(epoch)
running_loss = 0.0
for i, data in enumerate(dataloader, 0):
inputs, labels = data[0].to(rank), data[1].to(rank)
optimizer.zero_grad()
outputs = ddp_model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch {epoch + 1}, Loss: {running_loss / len(dataloader)}')
通过以上步骤,你可以在Linux环境下使用PyTorch进行分布式训练。