pytorch多GPU并行运算的实现

PyTorch多GPU并行运算的实现

在深度学习中,使用多个GPU可以加速模型的训练过程。PyTorch提供了多种方式实现多GPU并行运算,本文将详细介绍其中的两种方法,并提供示例说明。

1. 使用nn.DataParallel实现多GPU并行运算

nn.DataParallel是PyTorch提供的一种简单易用的多GPU并行运算方式。使用nn.DataParallel可以将模型自动划分到多个GPU上,并在每个GPU上运行相同的操作。以下是一个使用nn.DataParallel实现多GPU并行运算的示例代码:

import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
        self.fc1 = nn.Linear(128 * 8 * 8, 1024)
        self.fc2 = nn.Linear(1024, 10)

    def forward(self, x):
        x = nn.functional.relu(self.conv1(x))
        x = nn.functional.max_pool2d(nn.functional.relu(self.conv2(x)), 2)
        x = x.view(-1, 128 * 8 * 8)
        x = nn.functional.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 加载数据集
transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)

# 将模型移动到GPU上
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net = Net().to(device)

# 使用nn.DataParallel实现多GPU并行运算
if torch.cuda.device_count() > 1:
    net = nn.DataParallel(net)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)

# 训练模型
for epoch in range(100):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data[0].to(device), data[1].to(device)
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

在上面的示例代码中,我们首先定义了一个名为Net的类,它继承自nn.Module。然后,我们加载CIFAR-10数据集,并将模型移动到GPU上。接着,我们使用nn.DataParallel实现多GPU并行运算,并定义损失函数和优化器。最后,我们训练模型并输出每个epoch的平均损失。

2. 使用torch.nn.parallel.DistributedDataParallel实现多GPU并行运算

torch.nn.parallel.DistributedDataParallel是PyTorch提供的一种更加灵活的多GPU并行运算方式。使用torch.nn.parallel.DistributedDataParallel可以将模型划分到多个进程中,并在每个进程中运行相同的操作。以下是一个使用torch.nn.parallel.DistributedDataParallel实现多GPU并行运算的示例代码:

import torch.distributed as dist
import torch.multiprocessing as mp
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
        self.fc1 = nn.Linear(128 * 8 * 8, 1024)
        self.fc2 = nn.Linear(1024, 10)

    def forward(self, x):
        x = nn.functional.relu(self.conv1(x))
        x = nn.functional.max_pool2d(nn.functional.relu(self.conv2(x)), 2)
        x = x.view(-1, 128 * 8 * 8)
        x = nn.functional.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 定义训练函数
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)

    # 加载数据集
    transform_train = transforms.Compose([
        transforms.RandomCrop(32, padding=4),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
    ])
    trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
    train_sampler = torch.utils.data.distributed.DistributedSampler(trainset, num_replicas=world_size, rank=rank)
    trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=False, num_workers=2, sampler=train_sampler)

    # 将模型移动到GPU上
    device = torch.device("cuda:%d" % rank)
    net = Net().to(device)

    # 使用torch.nn.parallel.DistributedDataParallel实现多GPU并行运算
    net = nn.parallel.DistributedDataParallel(net, device_ids=[rank])

    # 定义损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)

    # 训练模型
    for epoch in range(100):
        running_loss = 0.0
        train_sampler.set_epoch(epoch)
        for i, data in enumerate(trainloader, 0):
            inputs, labels = data[0].to(device), data[1].to(device)
            optimizer.zero_grad()
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            running_loss += loss.item()
            if i % 100 == 99:
                print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
                running_loss = 0.0

    # 释放进程组
    dist.destroy_process_group()

# 启动多个进程进行训练
if __name__ == '__main__':
    world_size = torch.cuda.device_count()
    mp.spawn(train, args=(world_size,), nprocs=world_size, join=True)

在上面的示例代码中,我们首先定义了一个名为Net的类,它继承自nn.Module。然后,我们定义了一个名为train的函数,它用于在每个进程中训练模型。在train函数中,我们首先初始化进程组,并加载CIFAR-10数据集。然后,我们将模型移动到当前进程对应的GPU上,并使用torch.nn.parallel.DistributedDataParallel实现多GPU并行运算。接着,我们定义损失函数和优化器,并训练模型。最后,我们释放进程组。在main函数中,我们启动多个进程进行训练。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch多GPU并行运算的实现 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 教你一分钟在win10终端成功安装Pytorch的方法步骤

    PyTorch安装教程 PyTorch是一个基于Python的科学计算库,它支持GPU加速,提供了丰富的神经网络模块,可以用于自然语言处理、计算机视觉、强化学习等领域。本文将提供详细的PyTorch安装教程,以帮助您在Windows 10上成功安装PyTorch。 步骤一:安装Anaconda 在开始安装PyTorch之前,您需要先安装Anaconda。An…

    PyTorch 2023年5月16日
    00
  • pytorch tensorboard可视化的使用详解

    PyTorch TensorBoard是一个可视化工具,可以帮助开发者更好地理解和调试深度学习模型。本文将介绍如何使用PyTorch TensorBoard进行可视化,并演示两个示例。 安装TensorBoard 在使用PyTorch TensorBoard之前,需要先安装TensorBoard。可以使用以下命令在终端中安装TensorBoard: pip …

    PyTorch 2023年5月15日
    00
  • 浅谈PyTorch中in-place operation的含义

    在PyTorch中,in-place operation是指对Tensor进行原地操作,即在不创建新的Tensor的情况下,直接修改原有的Tensor。本文将浅谈PyTorch中in-place operation的含义,并提供两个示例说明。 1. PyTorch中in-place operation的含义 在PyTorch中,in-place operat…

    PyTorch 2023年5月15日
    00
  • Windows下实现pytorch环境搭建

    Windows下实现PyTorch环境搭建 在 Windows 系统下,我们可以通过 Anaconda 或 pip 来安装 PyTorch 环境。本文将详细讲解 Windows 下实现 PyTorch 环境搭建的完整攻略,并提供两个示例说明。 1. 使用 Anaconda 安装 PyTorch 在 Windows 系统下,我们可以使用 Anaconda 来安…

    PyTorch 2023年5月16日
    00
  • 【笔记】PyTorch框架学习 — 2. 计算图、autograd以及逻辑回归的实现

    1. 计算图 使用计算图的主要目的是使梯度求导更加方便。 import torch w = torch.tensor([1.], requires_grad=True) x = torch.tensor([2.], requires_grad=True) a = torch.add(w, x) # retain_grad() b = torch.add(w,…

    2023年4月8日
    00
  • 对pytorch网络层结构的数组化详解

    PyTorch网络层结构的数组化详解 在PyTorch中,我们可以使用nn.ModuleList()函数将多个网络层组合成一个数组,从而实现网络层结构的数组化。以下是一个示例代码,演示了如何使用nn.ModuleList()函数实现网络层结构的数组化: import torch import torch.nn as nn # 定义网络层 class Net(…

    PyTorch 2023年5月15日
    00
  • 贝叶斯个性化排序(BPR)pytorch实现

    一、BPR算法的原理: 1、贝叶斯个性化排序(BPR)算法小结https://www.cnblogs.com/pinard/p/9128682.html2、Bayesian Personalized Ranking 算法解析及Python实现https://www.cnblogs.com/wkang/p/10217172.html3、推荐系统中的排序学习ht…

    2023年4月8日
    00
  • 超简单!pytorch入门教程(五):训练和测试CNN

    我们按照超简单!pytorch入门教程(四):准备图片数据集准备好了图片数据以后,就来训练一下识别这10类图片的cnn神经网络吧。 按照超简单!pytorch入门教程(三):构造一个小型CNN构建好一个神经网络,唯一不同的地方就是我们这次训练的是彩色图片,所以第一层卷积层的输入应为3个channel。修改完毕如下: 我们准备了训练集和测试集,并构造了一个CN…

    PyTorch 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部