当前位置:   article > 正文

猴子看了都能在服务器上pytorch代码使用gpu跑神经网络模型

猴子看了都能在服务器上pytorch代码使用gpu跑神经网络模型

如何在服务器上pytorch代码使用gpu跑神经网络模型

前言

鉴于今天跑模型将cpu版本的改成cuda版本的心路历程,觉得必须要记录总结这一方法,不然以后忘记了debug的相关方法以及代码的改法
话不多说直接开始

一、pytorch—用gpu训练模型

首先我们明确:
pytorch允许把在GPU上训练的模型加载到CPU上,也允许把在CPU上训练的模型加载到GPU上。
在Pytorch中,只要在输入,输出,模型等后加.cuda()即可将模型由cpu上的运算调到gpu上运算。
首先需要确定自己的pytorch版本能否进行gpu计算。

print(torch.cuda.is_available())
  • 1

如果返回结果是true那么可以使用gpu进行计算,如果是false,那么说明要安装cuda或者gpu版本的pytorch了
,还可以通过以下指令来识别可以使用的gpu个数:

print(torch.cuda.device_count())
  • 1

那么平常我们在训练模型的时候我们首先要明确,我们训练模型的时候,要做的是将数据给模型,输出一个label去和标准的label算loss
因此我们需要将哪些部分放到gpu上面呢?

  1. 模型-----------需要加载到gpu上面
  2. 数据-----------包括输入的x和输出的label
  3. loss的function----------loss如果我们用的是torch中的一些functionu,那么也要放到gpu上面
  4. 注意:训练数据 x ,y 和 模型 ,损失函数criterion.to(device) 都需要放到 gpu上 模型内部基于tensor 的计算结果不用

二、放到gpu上的方法

我们首先要明确,只有模型以及类对象还有张量可以放到gpu上面
方法1:将CPU上的Tensor放到GPU上

x.cuda()
  • 1

或者

x.to(torch.device("cuda"))
  • 1

或者

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x.to(device)
  • 1
  • 2

所以一般我们这样写代码:

  1. 模型放在gpu上:
if torch.cuda.is_available():
    model.to(torch.device("cuda:0"))
  • 1
  • 2
  1. loss function放在gpu上:
    if torch.cuda.is_available():
        criterion = torch.nn.L1Loss().to(torch.device("cuda"))
    else:
        criterion = torch.nn.L1Loss()
  • 1
  • 2
  • 3
  • 4
  1. 数据放在cuda上:
if torch.cuda.is_available():
	index = index.to(torch.device("cuda"))
	或者
	index.cuda()
  • 1
  • 2
  • 3
  • 4

当index不是一个张量的时候,我们需要先转为张量

if torch.cuda.is_available():
	index = torch.FloatTensor(index).to(torch.device("cuda"))
	或者
	index = torch.FloatTensor(index).cuda()
  • 1
  • 2
  • 3
  • 4

比如以下例子:

x = torch.cuda.FloatTensor(1)
# x.get_device() == 0
y = torch.FloatTensor(1).cuda()
# y.get_device() == 0

with torch.cuda.device(1):
    # allocates a tensor on GPU 1
    a = torch.cuda.FloatTensor(1)

    # transfers a tensor from CPU to GPU 1
    b = torch.FloatTensor(1).cuda()
    # a.get_device() == b.get_device() == 1

    c = a + b
    # c.get_device() == 1

    z = x + y
    # z.get_device() == 0

    # even within a context, you can give a GPU id to the .cuda call
    d = torch.randn(2).cuda(2)
    # d.get_device() == 2

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

注意,放到gpu上面的数据只能和gpu上的data进行计算,所以如果要对一个数据使用numpy操作的话,会将gpu上面的张量直接挪到cpu上面进行操作,之后再与gpu上面的数据做计算的话就会报错,这个点可以注意系a

attention:当我们要把一个对象放到gpu上面的时候,只能
如上,g.to(device) 仅仅是返回一个对象,并不改变其自身的属性。因此,我们要想改变 g ,还需要将 g.to(device) 返回的对象赋值到 g 上。

g=g.to(torch.device("cuda:0")
  • 1

总结

今天讲了怎么在pytorch上面利用gpu跑程序,在我们修改我们cpu版本的代码的时候比较有用,主要修改的部分是训练数据 x ,y 和 模型 ,损失函数criterion.to(device) 都需要放到 gpu上 ,模型内部基于tensor 的计算结果不用 ,我们接收计算结果的时候将其自动保存到了cpu上面。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/371056
推荐阅读
相关标签
  

闽ICP备14008679号