PyTorch 并行训练极简 Demo

本文提供了一份PyTorch并行训练的简单示例,讲解如何利用多GPU进行训练。通过开启多进程,使用DataParallel进行数据划分,以及DistributedDataParallel同步模型参数和梯度,实现模型的并行训练。详细代码和解析帮助理解PyTorch的并行训练机制。
摘要由CSDN通过智能技术生成

刚刚学完了PyTorch的并行训练写法,我来分享一份非常简单的PyTorch并行训练代码。希望没有学过的读者能够在接触尽可能少的新知识的前提下学会写并行训练。

完整代码 main.py

import os
import torch
import torch.distributed as dist
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from torch.utils.data.distributed import DistributedSampler
from torch.nn.parallel import DistributedDataParallel

def setup():
    dist.init_process_group('nccl')


def cleanup():
    dist.destroy_process_group()


class ToyModel(nn.Module):

    def __init__(self) -> None:
        super().__init__()
        self.layer = nn.Linear(1, 1)

    def forward(self, x):
        return self.layer(x)


class MyDataset(Dataset):

    def __init__(self):
        super().__init__()
        self.data = torch.tensor([1, 2, 3, 4], dtype=torch.float32)

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        return self.data[index:index + 1]


ckpt_path = 'tmp.pth'


def main():
    setup()
    rank = dist.get_rank()
    pid = os.getpid()
    print(f'current pid: {pid}')
    print(f'Current rank {rank}')
    device_id = rank % torch.cuda.device_count()

    dataset = MyDataset()
    sampler = DistributedSampler(dataset)
    dataloader = DataLoader(dataset, batch_size=2, sampler=sampler)

    model = ToyModel().to(device_id)
    ddp_model = DistributedDataParallel(model, device_ids=[device_id])
    loss_fn = nn.MSELoss()
    optimizer = optim.SGD(ddp_model.parameters(), lr=0.001)

    if rank == 0:
        torch.save(ddp_model.state_dict(), ckpt_path)

    dist.barrier()

    map_location = {'cuda:0': f'cuda:{device_id}'}
    state_dict = torch.load(ckpt_path, map_location=map_location)
    print(f'rank {rank}: {state_dict}')
    ddp_model.load_state_dict(state_dict)

    for epoch in range(2):
        sampler.set_epoch(epoch)
        for x in dataloader:
            print(f'epoch {epoch}, rank {rank} data: {x}')
            x = x.to(device_id)
PyTorch提供了一个名为`DataParallel`的模块,可以方便地在多GPU环境中进行模型并行训练。以下是基本步骤: 1. **安装依赖**:首先确保你已经安装了PyTorch的版本支持多GPU功能,如PyTorch >= 1.4。 2. **创建模型**:定义你的深度学习模型,比如使用`nn.Module`类。 3. **实例化模型**:创建主模型实例,这将成为数据并行的基础。 ```python model = Model() # 假设Model是一个支持DataParallel的类 ``` 4. **启用并行**:在创建模型的时候,将它转换为`DataParallel`对象。这会在每个可用的GPU上复制一份模型。 ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = DataParallel(model, device_ids=[0, 1]) # 如果有两个GPU ``` 5. **准备数据**:创建一个可以在所有GPU之间分布的数据加载器。你可以使用`DistributedDataParallel`配合`torch.utils.data.DataLoader`来实现分布式训练。 6. **设置优化器和损失函数**:与单机训练一样,但可能需要调整学习率策略以适应更大的计算资源。 7. **训练循环**:在训练过程中,调用模型的`forward`方法,并使用`loss.backward()`更新权重。记得在每个迭代开始前手动同步GPU。 ```python optimizer.zero_grad() output = model(input) loss = criterion(output, target) loss.backward() optimizer.step() ``` 8. **同步状态**:在某些并行模式下(如`ReduceLROnPlateau`),可能需要在每个epoch结束后同步模型的状态。 注意,为了实现真正的并行训练,你还需确保你的数据、批处理大小以及模型结构能充分利用多GPU的优势。此外,还要处理好同步通信的问题,如使用`torch.distributed`包。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值