centos

PyTorch在CentOS上的分布式训练怎么实现

小樊
46
2025-09-16 02:51:12
栏目: 智能运维

在CentOS上使用PyTorch进行分布式训练,通常涉及以下几个步骤:

  1. 环境准备

    • 确保所有节点上都安装了相同版本的PyTorch和CUDA(如果使用GPU)。
    • 安装必要的依赖库,如ncclopenmpimvapich等,这些库对于分布式训练至关重要。
  2. 网络配置

    • 确保所有节点之间可以互相通信,通常需要配置无密码SSH登录。
    • 设置主机名解析,确保每个节点可以通过主机名或IP地址访问。
  3. 启动分布式训练

    • 使用torch.distributed.launch工具或torch.multiprocessing.spawn来启动分布式训练。
    • 配置分布式训练参数,如世界大小(world size),即参与训练的进程总数;每个节点上的GPU数量;以及每个进程的GPU ID等。

以下是一个简单的示例,展示如何在CentOS上使用PyTorch进行分布式训练:

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

def train(rank, world_size):
    # 初始化进程组
    dist.init_process_group(backend='nccl', init_method='tcp://<master_ip>:<master_port>', world_size=world_size, rank=rank)

    # 创建模型并将其移动到对应的GPU
    model = nn.Linear(10, 10).to(rank)

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

    # 创建数据加载器
    transform = transforms.Compose([transforms.ToTensor()])
    dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
    sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
    loader = DataLoader(dataset, batch_size=64, sampler=sampler)

    # 创建优化器
    optimizer = optim.SGD(ddp_model.parameters(), lr=0.01)

    # 训练循环
    for epoch in range(5):
        sampler.set_epoch(epoch)
        for data, target in loader:
            data, target = data.to(rank), target.to(rank)
            optimizer.zero_grad()
            output = ddp_model(data)
            loss = nn.functional.cross_entropy(output, target)
            loss.backward()
            optimizer.step()
        print(f'Rank {rank}, Epoch {epoch}, Loss {loss.item()}')

    # 清理进程组
    dist.destroy_process_group()

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--world_size', type=int, default=4, help='number of distributed processes')
    parser.add_argument('--rank', type=int, default=0, help='rank 0 for master node')
    args = parser.parse_args()

    train(args.rank, args.world_size)

在运行上述脚本之前,你需要确保所有节点都已经安装了PyTorch和相关的依赖库,并且已经配置好了网络和SSH无密码登录。然后,你可以使用以下命令来启动分布式训练:

python -m torch.distributed.launch --nproc_per_node=<num_gpus_per_node> --nnodes=<num_nodes> --node_rank=<node_rank> <your_training_script.py> --world_size <total_world_size> --rank <rank>

其中:

请根据你的实际情况替换上述命令中的参数。

0
看了该问题的人还看了