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日

相关文章

  • PyTorch 中,nn 与 nn.functional 有什么区别?

    作者:infiniteft链接:https://www.zhihu.com/question/66782101/answer/579393790来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 两者的相同之处: nn.Xxx和nn.functional.xxx的实际功能是相同的,即nn.Conv2d和nn.functional.…

    PyTorch 2023年4月8日
    00
  • pytorch 中pad函数toch.nn.functional.pad()的用法

    torch.nn.functional.pad()是PyTorch中的一个函数,用于在张量的边缘填充值。它的语法如下: torch.nn.functional.pad(input, pad, mode=’constant’, value=0) 其中,input是要填充的张量,pad是填充的数量,mode是填充模式,value是填充的值。 pad参数可以是一个…

    PyTorch 2023年5月15日
    00
  • Broadcast广播机制在Pytorch Tensor Numpy中如何使用

    本篇内容介绍了“Broadcast广播机制在Pytorch Tensor Numpy中如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1.什么是广播机制 根据线性代数的运算规则我们知道,矩阵运算往往都是在两个矩阵维度相同或者相匹配时才能运算。比如加减法…

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

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

    PyTorch 2023年5月15日
    00
  • pytorch基础(1)

    基本数据类型和tensor   1 import torch 2 import numpy as np 3 4 #array 和 tensor的转换 5 array = np.array([1.1,2,3]) 6 tensorArray = torch.from_numpy(array) #array对象变为tensor对象 7 array1 = tenso…

    PyTorch 2023年4月8日
    00
  • Pytorch GPU显存充足却显示out of memory的解决方式

    当我们在使用PyTorch进行深度学习训练时,经常会遇到GPU显存充足却显示out of memory的问题。这个问题的原因是PyTorch默认会占用所有可用的GPU显存,而在训练过程中,显存的使用可能会超出我们的预期。本文将提供一个详细的攻略,介绍如何解决PyTorch GPU显存充足却显示out of memory的问题,并提供两个示例说明。 1. 使用…

    PyTorch 2023年5月15日
    00
  • pytorch中的pack_padded_sequence和pad_packed_sequence用法

    pack_padded_sequence是将句子按照batch优先的原则记录每个句子的词,变化为不定长tensor,方便计算损失函数。 pad_packed_sequence是将pack_padded_sequence生成的结构转化为原先的结构,定长的tensor。 其中test.txt的内容 As they sat in a nice coffee sho…

    PyTorch 2023年4月7日
    00
  • pytorch网络转libtorch常见问题

    一、All inputs of range must be ints, found Tensor in argument 0: 问题参数类型不正确,函数的默认参数是tensor 解决措施函数传入参数不是tensor需要注明类型我的问题是传入参数npoint是一个int类型,没有注明会报错,更改如下:由 def test(npoint): … 更改为 de…

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