ubuntu

PyTorch在Ubuntu上的分布式训练

小樊
46
2025-07-05 20:57:08
栏目: 智能运维

PyTorch是一个流行的开源机器学习库,它支持在多个GPU上进行分布式训练。在Ubuntu上进行PyTorch的分布式训练通常涉及以下步骤:

  1. 安装PyTorch: 首先,确保你已经在Ubuntu系统上安装了PyTorch。你可以从PyTorch官网获取适合你系统的安装命令。

  2. 设置环境变量: 为了启用分布式训练,你需要设置一些环境变量。例如,你可以设置NCCL_DEBUG=INFO来获取NCCL(NVIDIA Collective Communications Library)的调试信息。

  3. 准备数据集: 分布式训练通常需要将数据集分割成多个部分,每个部分由不同的进程处理。你可以使用PyTorch的DataLoaderDataset类来实现这一点。

  4. 编写分布式训练代码: 在PyTorch中,你可以使用torch.nn.parallel.DistributedDataParallel来包装你的模型,以实现模型的并行训练。你需要确保每个进程都有自己的GPU,并且它们能够通过网络通信。

  5. 启动分布式训练: 使用torch.distributed.launch工具或者mp.spawn函数来启动分布式训练。你需要指定总的进程数、每个节点的GPU数量以及启动脚本。

以下是一个简单的分布式训练脚本示例:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.data import DataLoader, DistributedSampler
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 初始化进程组
world_size = 4  # 总进程数
rank = 0  # 当前进程的rank
master_ip = 'localhost'  # 主节点的IP地址
master_port = '12345'  # 主节点的端口号
torch.distributed.init_process_group(
    backend='nccl',  # 使用NCCL后端
    init_method=f'tcp://{master_ip}:{master_port}',
    world_size=world_size,
    rank=rank
)

# 定义模型
class Model(nn.Module):
    # ...

# 创建模型实例并移动到对应的GPU
model = Model().to(rank)

# 使用DistributedDataParallel包装模型
model = DDP(model, device_ids=[rank])

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 加载数据集
transform = transforms.Compose([transforms.ToTensor()])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_sampler = DistributedSampler(train_dataset)
train_loader = DataLoader(dataset=train_dataset, batch_size=64, sampler=train_sampler)

# 训练模型
for epoch in range(num_epochs):
    train_sampler.set_epoch(epoch)
    for data, target in train_loader:
        data, target = data.to(rank), target.to(rank)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

# 清理
torch.distributed.destroy_process_group()

在运行上述脚本之前,你需要确保所有节点都能够通过网络相互通信,并且已经安装了必要的依赖库,如NCCL和CUDA。

启动分布式训练的命令可能如下所示:

python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE YOUR_TRAINING_SCRIPT.py

或者使用mp.spawn

import torch.multiprocessing as mp

def train(rank, world_size):
    # 初始化进程组和分布式训练代码
    # ...

if __name__ == '__main__':
    world_size = 4
    mp.spawn(train, args=(world_size,), nprocs=world_size, join=True)

请注意,这只是一个简化的例子,实际的分布式训练可能需要更复杂的设置,包括模型并行化、梯度累积、混合精度训练等高级特性。

0
看了该问题的人还看了