欢迎访问宙启技术站
智能推送

PyTorch中的torch.nn.parallel:利用多GPU加速深度学习训练

发布时间:2024-01-13 10:54:08

在深度学习中,使用多个GPU进行模型训练可以显著加快训练速度。PyTorch是一个流行的深度学习框架,它提供了torch.nn.parallel工具包来方便地利用多个GPU并行进行模型训练。

torch.nn.parallel模块主要提供了两个工具类:DataParallel和DistributedDataParallel。接下来将介绍这两个工具类,并提供一个使用例子。

1. DataParallel

DataParallel是torch.nn.parallel模块中最常用的类,它可以在多个GPU上复制模型并行运行,再将结果合并。使用DataParallel只需要稍作修改就可以将单GPU的代码转换为多GPU的代码。下面是一个使用DataParallel的简单例子:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.parallel import DataParallel

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.conv(x)
        x = self.relu(x)
        return x

model = Model()
model = DataParallel(model)  # 使用DataParallel封装模型

optimizer = optim.SGD(model.parameters(), lr=0.01)

input = torch.randn(10, 3, 32, 32)
output = model(input)
loss = output.sum()
loss.backward()
optimizer.step()

在上面的例子中,我们定义了一个简单的卷积神经网络模型,并使用DataParallel将模型封装起来。然后,就可以像单GPU一样进行训练,无需修改其他代码。DataParallel会自动将数据划分到不同的GPU上,并将计算结果合并。

2. DistributedDataParallel

DistributedDataParallel是一种更高级的多GPU并行工具,它可以在多个机器上进行模型的并行训练。使用DistributedDataParallel需要借助PyTorch的分布式包torch.distributed。下面是一个使用DistributedDataParallel的简单例子:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.distributed as dist
import torch.multiprocessing as mp
from torch.nn.parallel import DistributedDataParallel

def train(rank, world_size):
    dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', rank=rank, world_size=world_size)
    torch.manual_seed(0)
    
    model = nn.Linear(10, 10).to(rank)
    model = DistributedDataParallel(model, device_ids=[rank])
    
    optimizer = optim.SGD(model.parameters(), lr=0.01)
    input = torch.randn(10, 10).to(rank)
    
    for epoch in range(100):
        output = model(input)
        loss = output.sum()
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

def main():
    world_size = 2
    mp.spawn(train, args=(world_size,), nprocs=world_size)

if __name__ == '__main__':
    main()

在上面的例子中,我们使用了torch.multiprocessing模块来创建多个进程,每个进程上都运行一份相同的代码,但有不同的rank。rank用于 标识每个进程。然后我们使用torch.distributed模块中的init_process_group函数初始化进程组。DistributedDataParallel专门用于多机多卡的训练。

注意,在使用DistributedDataParallel时,需要确保每台机器上的GPU数量一致,并且需要在每台机器上运行相同的代码。

综上所述,PyTorch的torch.nn.parallel模块提供了DataParallel和DistributedDataParallel工具类,可以方便地利用多个GPU加速深度学习训练。开发者可以根据自己的需求选择合适的工具类,并按照相关示例进行使用。