温馨提示×

Ubuntu下如何进行PyTorch的分布式训练

小樊
48
2025-10-16 17:52:36
栏目: 智能运维

在Ubuntu下进行PyTorch的分布式训练,你需要遵循以下步骤:

  1. 安装PyTorch: 确保你已经安装了PyTorch。你可以从PyTorch官网根据你的CUDA版本选择合适的安装命令。

  2. 准备环境: 在开始分布式训练之前,确保所有参与训练的机器都已经安装了相同版本的PyTorch,并且网络连接正常。

  3. 设置环境变量: 为了使分布式训练正常工作,你需要设置一些环境变量,例如MASTER_ADDR(主节点的IP地址)、MASTER_PORT(一个未被使用的端口号)和WORLD_SIZE(参与训练的总进程数)。

    export MASTER_ADDR='主节点IP'
    export MASTER_PORT='端口号'
    export WORLD_SIZE='进程总数'
    
  4. 编写分布式训练脚本: 在你的PyTorch脚本中,你需要使用torch.distributed包来初始化分布式环境。以下是一个简单的例子:

    import torch
    import torch.distributed as dist
    from torch.nn.parallel import DistributedDataParallel as DDP
    
    def main(rank, world_size):
        # 初始化进程组
        dist.init_process_group(
            backend='nccl',  # 'nccl' for GPU, 'gloo' for CPU
            init_method=f'tcp://{MASTER_ADDR}:{MASTER_PORT}',
            world_size=world_size,
            rank=rank
        )
    
        # 创建模型并将其移动到GPU
        model = ...  # 定义你的模型
        model.cuda(rank)
    
        # 使用DistributedDataParallel包装模型
        ddp_model = DDP(model, device_ids=[rank])
    
        # 准备数据加载器
        dataset = ...  # 定义你的数据集
        sampler = torch.utils.data.distributed.DistributedSampler(dataset)
        dataloader = torch.utils.data.DataLoader(dataset, batch_size=..., sampler=sampler)
    
        # 训练循环
        for epoch in range(...):
            sampler.set_epoch(epoch)
            for inputs, targets in dataloader:
                inputs, targets = inputs.cuda(rank), targets.cuda(rank)
                # 前向传播
                outputs = ddp_model(inputs)
                loss = ...  # 计算损失
                # 反向传播
                loss.backward()
                # 更新参数
                ...
    
    if __name__ == "__main__":
        import argparse
        parser = argparse.ArgumentParser()
        parser.add_argument('--rank', type=int)
        parser.add_argument('--world_size', type=int)
        args = parser.parse_args()
    
        main(args.rank, args.world_size)
    
  5. 启动分布式训练: 使用torch.multiprocessing来启动多个进程。每个进程都会调用你的训练脚本,并传入不同的rank参数。

    import torch.multiprocessing as mp
    
    def run(rank, world_size):
        main(rank, world_size)
    
    if __name__ == "__main__":
        world_size = ...  # 总进程数
        mp.spawn(run, args=(world_size,), nprocs=world_size, join=True)
    
  6. 运行脚本: 在命令行中,你可以使用mpiruntorch.distributed.launch来启动分布式训练。例如:

    mpirun -np WORLD_SIZE python your_training_script.py --rank 0
    

    或者使用torch.distributed.launch

    python -m torch.distributed.launch --nproc_per_node=WORLD_SIZE your_training_script.py --rank 0
    

    其中WORLD_SIZE是你的总进程数,--rank是每个进程的排名。

请注意,这些步骤假设你已经有了一个可以分布式训练的模型和数据集。分布式训练的具体实现细节可能会根据你的模型和数据集有所不同。此外,确保所有节点之间的SSH无密码登录已经设置好,以便于进程间的通信。

0