pytorch使用指定GPU训练的实例

在PyTorch中,我们可以使用指定的GPU来训练模型。在本文中,我们将详细讲解如何使用指定的GPU来训练模型。我们将使用两个示例来说明如何完成这些步骤。

示例1:使用单个GPU训练模型

以下是使用单个GPU训练模型的步骤:

import torch
import torch.nn as nn
import torch.optim as optim

# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = x.view(-1, 784)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = Net().to(device)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 加载数据
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)

# 训练模型
for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()

    print(f'Epoch {epoch + 1}, Loss: {running_loss / len(train_dataset)}')

在上述代码中,我们首先检查GPU是否可用,并将模型移动到GPU上。然后,我们定义了一个简单的全连接神经网络Net,它含有一个输入层、一个隐藏层和一个输出层。在训练模型的过程中,我们使用inputs.to(device)labels.to(device)将数据移动到GPU上。在训练模型的过程中,我们使用torch.utils.data.DataLoader加载数据,并使用enumerate()函数遍历数据。在每个批次中,我们使用optimizer.zero_grad()清除梯度,使用model(inputs)计算输出,使用criterion(outputs, labels)计算损失,使用loss.backward()计算梯度,使用optimizer.step()更新权重。

示例2:使用多个GPU训练模型

以下是使用多个GPU训练模型的步骤:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.parallel
import torch.distributed as dist
import torch.multiprocessing as mp
import torch.utils.data
import torch.utils.data.distributed

# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = x.view(-1, 784)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = Net().to(device)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss().to(device)
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 加载数据
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True, num_workers=4, pin_memory=True)

# 训练模型
def train(gpu, train_loader):
    rank = gpu
    dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', world_size=2, rank=rank)
    torch.cuda.set_device(gpu)
    model = Net().to(device)
    model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[gpu])
    criterion = nn.CrossEntropyLoss().to(device)
    optimizer = optim.SGD(model.parameters(), lr=0.1)

    for epoch in range(10):
        running_loss = 0.0
        for i, data in enumerate(train_loader, 0):
            inputs, labels = data
            inputs, labels = inputs.to(device), labels.to(device)
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            running_loss += loss.item()

        print(f'Epoch {epoch + 1}, Loss: {running_loss / len(train_dataset)}')

# 启动多个进程
if __name__ == '__main__':
    mp.spawn(train, nprocs=2, args=(train_loader,))

在上述代码中,我们首先检查GPU是否可用,并将模型移动到GPU上。然后,我们定义了一个简单的全连接神经网络Net,它含有一个输入层、一个隐藏层和一个输出层。在训练模型的过程中,我们使用inputs.to(device)labels.to(device)将数据移动到GPU上。在训练模型的过程中,我们使用torch.utils.data.DataLoader加载数据,并使用enumerate()函数遍历数据。在每个批次中,我们使用optimizer.zero_grad()清除梯度,使用model(inputs)计算输出,使用criterion(outputs, labels)计算损失,使用loss.backward()计算梯度,使用optimizer.step()更新权重。在使用多个GPU训练模型时,我们使用torch.nn.parallel.DistributedDataParallel函数将模型并行化,并使用mp.spawn()函数启动多个进程。

结论

在本文中,我们详细讲解了如何使用指定的GPU来训练模型。我们使用了两个示例来说明如何完成这些步骤。如果您按照这些步骤操作,您应该能够成功使用指定的GPU来训练模型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch使用指定GPU训练的实例 - Python技术站

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

相关文章

  • PyTorch如何构建深度学习模型?

    简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观。Pytorch就是这样一个库。 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易。Pytorch是我迄今为止所使用的深度学习库中最灵活的,最轻松的。 在本文中,我们将以实践的方式来探索Pytorch,包括基础知识与案例研究。我们会使用numpy和Py…

    2023年4月8日
    00
  • 【pytorch】.item()的用法

    Use torch.Tensor.item() to get a Python number from a tensor containing a single value. .item()方法返回张量元素的值。 用法示例 >>> import torch >>> x = torch.tensor([[1]]) >&…

    PyTorch 2023年4月7日
    00
  • pytorch简单测试

    pytorch demo import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable import torch import torch.optim as optim class Net(nn.Module):#需要继承这个类 def __…

    PyTorch 2023年4月6日
    00
  • 关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)

    PyTorch中的torch.optim模块提供了许多常用的优化器,如SGD、Adam等。但是,有时候我们需要根据自己的需求来定制优化器,例如加上L1正则化等。本文将详细讲解如何使用torch.optim模块灵活地定制优化器,并提供两个示例说明。 重写SGD优化器 我们可以通过继承torch.optim.SGD类来重写SGD优化器,以实现自己的需求。以下是重…

    PyTorch 2023年5月15日
    00
  • 基于pytorch中的Sequential用法说明

    在PyTorch中,Sequential是一个用于构建神经网络的容器。它可以将多个层组合在一起,形成一个序列化的神经网络模型。下面是两个示例说明如何使用Sequential。 示例1 假设我们有一个包含两个线性层和一个ReLU激活函数的神经网络模型,我们想要使用Sequential来构建这个模型。我们可以使用以下代码来实现这个功能。 import torch…

    PyTorch 2023年5月15日
    00
  • PyTorch一小时掌握之autograd机制篇

    PyTorch一小时掌握之autograd机制篇 在本文中,我们将介绍PyTorch的autograd机制,这是PyTorch的一个重要特性,用于自动计算梯度。本文将包含两个示例说明。 autograd机制的基本概念 在PyTorch中,autograd机制是用于自动计算梯度的核心功能。它可以根据输入和计算图自动计算梯度,并将梯度存储在张量的.grad属性中…

    PyTorch 2023年5月15日
    00
  • 使用Pytorch来拟合函数方式

    使用PyTorch来拟合函数的方式 在本文中,我们将介绍如何使用PyTorch来拟合函数。我们将提供两个示例,一个是使用线性函数,另一个是使用非线性函数。 示例1:使用线性函数 以下是使用PyTorch拟合线性函数的示例代码: import torch import torch.nn as nn import numpy as np import matpl…

    PyTorch 2023年5月16日
    00
  • Windows中安装Pytorch和Torch

    近年来,深度学习框架如雨后春笋般的涌现出来,如TensorFlow、caffe、caffe2、PyTorch、Keras、Theano、Torch等,对于从事计算机视觉/机器学习/图像处理方面的研究者或者教育者提高了更高的要求。其中Pytorch是Torch的升级版,其有非常优秀的前端和灵活性,相比TensorFlow不用重复造轮子,易于Debug调试,极大…

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