在Ubuntu上进行PyTorch的分布式训练,你需要遵循以下步骤:
安装PyTorch: 确保你已经安装了PyTorch。你可以从PyTorch官网(https://pytorch.org/)获取适合你系统的安装指令。
设置环境变量: 为了使用多GPU进行分布式训练,你需要设置一些环境变量。例如,如果你有4个GPU,你可以这样设置:
export MASTER_ADDR='localhost'
export MASTER_PORT='12345'
export WORLD_SIZE=4
MASTER_ADDR 是主节点的IP地址,MASTER_PORT 是一个随机选择的端口号,WORLD_SIZE 是参与训练的GPU总数。
编写分布式训练脚本:
在你的PyTorch脚本中,你需要使用torch.distributed包来初始化分布式环境。以下是一个简单的例子:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.parallel import DistributedDataParallel as DDP
# 初始化进程组
torch.distributed.init_process_group(
backend='nccl', # 'nccl' is recommended for distributed GPU training
init_method='tcp://localhost:12345',
world_size=4,
rank=0 # 这个rank需要在每个进程中设置为不同的值
)
# 创建模型并将其移动到GPU
model = nn.Linear(10, 10).to(torch.device("cuda"))
# 使用DistributedDataParallel包装模型
ddp_model = DDP(model, device_ids=[rank])
# 创建损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(ddp_model.parameters(), lr=0.01)
# 假设我们有一些数据加载器
inputs = torch.randn(20, 10).to(torch.device("cuda"))
labels = torch.randint(0, 10, (20,)).to(torch.device("cuda"))
# 训练循环
for epoch in range(10):
optimizer.zero_grad()
outputs = ddp_model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
print(f"Rank {rank}, Epoch {epoch}, Loss {loss.item()}")
运行分布式训练脚本:
使用torch.distributed.launch工具来启动你的分布式训练脚本。例如,如果你的脚本名为train.py,你可以这样运行它:
python -m torch.distributed.launch --nproc_per_node=4 train.py
--nproc_per_node 参数指定了每个节点上使用的GPU数量。
注意事项:
rank值,通常是从0到WORLD_SIZE - 1。以上步骤提供了一个基本的框架,实际的分布式训练可能会涉及到数据加载、模型并行化、梯度聚合等更复杂的操作。根据你的具体需求,可能需要进行相应的调整。