在深度学习领域,随着模型复杂度和数据集规模的不断增长,单机单 GPU 训练往往难以满足需求,多机多 GPU 训练成为了提升训练效率的重要手段。本文将详细介绍如何搭建一个分布式集群来进行 PyTorch 的多机多 GPU 训练。
在深入了解如何搭建集群之前,我们先来了解一些分布式训练的基本概念。
在每台服务器上安装相同版本的 CUDA 和 cuDNN,以确保 GPU 能够正常工作。可以从 NVIDIA 官方网站下载 CUDA 和 cuDNN 的安装包,并按照官方文档进行安装。
使用 pip 或 conda 安装 PyTorch,确保安装的版本支持分布式训练。例如,使用以下命令安装 PyTorch:
pip install torch torchvision torchaudio
为了方便在集群中的服务器之间进行通信,需要配置 SSH 免密登录。在每台服务器上生成 SSH 密钥对,并将公钥复制到其他服务器的 ~/.ssh/authorized_keys
文件中。
# 生成 SSH 密钥对
ssh-keygen -t rsa
# 将公钥复制到其他服务器
ssh-copy-id user@server_ip
以下是一个简单的 PyTorch 分布式训练代码示例:
import torch
import torch.distributed as dist
import torch.multiprocessing as mp
import torch.nn as nn
import torch.optim as optim
from torch.nn.parallel import DistributedDataParallel as DDP
def setup(rank, world_size):
os.environ['MASTER_ADDR'] = 'localhost'
os.environ['MASTER_PORT'] = '12355'
# initialize the process group
dist.init_process_group("nccl", rank=rank, world_size=world_size)
def cleanup():
dist.destroy_process_group()
class ToyModel(nn.Module):
def __init__(self):
super(ToyModel, self).__init__()
self.net1 = nn.Linear(10, 10)
self.relu = nn.ReLU()
self.net2 = nn.Linear(10, 5)
def forward(self, x):
return self.net2(self.relu(self.net1(x)))
def demo_basic(rank, world_size):
print(f"Running basic DDP example on rank {rank}.")
setup(rank, world_size)
# create model and move it to GPU with id rank
model = ToyModel().to(rank)
ddp_model = DDP(model, device_ids=[rank])
loss_fn = nn.MSELoss()
optimizer = optim.SGD(ddp_model.parameters(), lr=0.001)
optimizer.zero_grad()
outputs = ddp_model(torch.randn(20, 10).to(rank))
labels = torch.randn(20, 5).to(rank)
loss_fn(outputs, labels).backward()
optimizer.step()
cleanup()
def run_demo(demo_fn, world_size):
mp.spawn(demo_fn,
args=(world_size,),
nprocs=world_size,
join=True)
if __name__ == "__main__":
n_gpus = torch.cuda.device_count()
assert n_gpus >= 2, f"Requires at least 2 GPUs to run, but got {n_gpus}"
world_size = n_gpus
run_demo(demo_basic, world_size)
在单机上启动多 GPU 训练,可以使用 torch.multiprocessing
模块来启动多个进程,每个进程负责一个 GPU。
python your_script.py
在多机上启动多 GPU 训练,需要在每台服务器上分别启动进程。可以使用 torch.distributed.launch
工具来启动多个进程。
# 在主节点上启动
python -m torch.distributed.launch --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr="master_node_ip" --master_port=12355 your_script.py
# 在从节点上启动
python -m torch.distributed.launch --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr="master_node_ip" --master_port=12355 your_script.py
通过以上步骤,我们可以成功搭建一个 PyTorch 分布式集群,并进行多机多 GPU 训练。在实际应用中,还需要根据具体情况进行优化,如调整数据加载方式、优化网络通信等,以提高训练效率。
步骤 | 描述 |
---|---|
1. 环境配置 | 安装 CUDA、cuDNN 和 PyTorch,配置 SSH 免密登录 |
2. 编写代码 | 编写分布式训练代码,使用 DistributedDataParallel 包装模型 |
3. 启动训练 | 根据单机或多机情况,使用不同的方法启动训练 |
希望本文能够帮助你顺利搭建分布式集群,提升深度学习训练效率。