pytorch多GPU并行运算的实现

yizhihongxing

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日

相关文章

  • pytorch转onnx问题

     Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchAddExportSupport.md#fail-to-export-the-model-in-pytorch 1. RuntimeError: ONNX ex…

    2023年4月8日
    00
  • 利用Python脚本实现自动刷网课

    自动刷网课是一种自动化技术,可以帮助我们节省时间和精力。在本文中,我们将介绍如何使用Python脚本实现自动刷网课,并提供两个示例说明。 利用Python脚本实现自动刷网课的步骤 要利用Python脚本实现自动刷网课,需要完成以下几个步骤: 安装必要的Python库。 编写Python脚本,实现自动登录和自动播放网课。 运行Python脚本,开始自动刷网课。…

    PyTorch 2023年5月15日
    00
  • [转] pytorch指定GPU

    查过好几次这个命令,总是忘,转一篇mark一下吧 转自:http://www.cnblogs.com/darkknightzh/p/6836568.html PyTorch默认使用从0开始的GPU,如果GPU0正在运行程序,需要指定其他GPU。 有如下两种方法来指定需要使用的GPU。 1. 类似tensorflow指定GPU的方式,使用CUDA_VISIBL…

    PyTorch 2023年4月8日
    00
  • 线性逻辑回归与非线性逻辑回归pytorch+sklearn

    1 import matplotlib.pyplot as plt 2 import numpy as np 3 from sklearn.metrics import classification_report 4 from sklearn import preprocessing 5 6 # 载入数据 7 data = np.genfromtxt(“LR…

    2023年4月6日
    00
  • Python数据集切分实例

    以下是关于“Python 数据集切分实例”的完整攻略,其中包含两个示例说明。 示例1:随机切分数据集 步骤1:导入必要库 在切分数据集之前,我们需要导入一些必要的库,包括numpy和sklearn。 import numpy as np from sklearn.model_selection import train_test_split 步骤2:定义数据…

    PyTorch 2023年5月16日
    00
  • pytorch之维度变化view/reshape;squeeze/unsqueeze;Transpose/permute;Expand/repeat

    ————恢复内容开始———— 概括:      一. view/reshape      作用几乎一模一样,保证size不变:意思就是各维度相乘之积相等(numel()),且具有物理意义,别瞎变,要不然破坏数据污染数据;     数据的存储、维度顺序非常重要,需要时刻记住            size没有保持固定住,报错  …

    PyTorch 2023年4月7日
    00
  • Python利用Pytorch实现绘制ROC与PR曲线图

    当我们需要评估二分类模型的性能时,ROC曲线和PR曲线是两个常用的工具。在Python中,我们可以使用PyTorch库来绘制这些曲线。下面是绘制ROC曲线和PR曲线的完整攻略,包括两个示例说明。 1. 绘制ROC曲线 ROC曲线是一种用于评估二分类模型性能的工具,它显示了真阳性率(TPR)与假阳性率(FPR)之间的关系。以下是使用PyTorch绘制ROC曲线…

    PyTorch 2023年5月15日
    00
  • linux中anaconda环境下pytorch的安装(conda安装本地包)

    跑代码的时候遇到和这位博主几乎一模一样的问题,安装的也是同一版本。目前清华源已经停止服务,如果要自己下载pytorch包的话估计只能在官网下载了。 原文:https://blog.csdn.net/summer2day/article/details/88652934 pytorch的安装(1)版本查看查看cuda版本cat /usr/local/cuda/…

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