当前位置:   article > 正文

利用GPU训练模型_有没有trainloss.gpu()

有没有trainloss.gpu()

利用.cuda()函数

        网络模型中,有三种变量可以调用.cuda(),分别是网路模型数据(输入、标注)损失函数,调用完需要返回。

        以之前的一个网络为例:

  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch.utils.data import DataLoader
  5. dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
  6. dataloader = DataLoader(dataset, batch_size=1)
  7. class Model(nn.Module):
  8. def __init__(self):
  9. super(Model, self).__init__()
  10. self.model = nn.Sequential(
  11. nn.Conv2d(3, 32, 5, 1, 2),
  12. nn.MaxPool2d(2),
  13. nn.Conv2d(32, 32, 5, padding=2),
  14. nn.MaxPool2d(2),
  15. nn.Conv2d(32, 64, 5, padding=2),
  16. nn.MaxPool2d(2),
  17. nn.Flatten(),
  18. nn.Linear(1024, 64),
  19. nn.Linear(64, 10),
  20. )
  21. def forward(self, x):
  22. x = self.model(x)
  23. return x
  24. loss = nn.CrossEntropyLoss()
  25. model = Model()
  26. optim = torch.optim.SGD(model.parameters(), lr=0.01)
  27. for epoch in range(20):
  28. sum = 0
  29. for data in dataloader:
  30. imgs, targets = data
  31. outputs = model(imgs)
  32. result_loss = loss(outputs, targets)
  33. optim.zero_grad()
  34. result_loss.backward()
  35. optim.step()
  36. sum = sum+result_loss
  37. print(sum)

分别调用.cuda():

  1. loss = nn.CrossEntropyLoss().cuda()#将损失函数转移到cuda上
  2. model = Model().cuda()#将网络模型转移到cuda上
  3. ...
  4. for data in dataloader:
  5. imgs, targets = data
  6. imgs = imgs.cuda()#数据输入转移到cuda上
  7. targets = targets.cuda()#数据标注转移到cuda上
  8. ...

然后就可以利用gpu进行训练,输出结果:

tensor(18662.0469, device='cuda:0', grad_fn=<AddBackward0>)
tensor(16061.3145, device='cuda:0', grad_fn=<AddBackward0>)
tensor(15350.5762, device='cuda:0', grad_fn=<AddBackward0>)

...

        如果电脑没有gpu或者gpu没有配置成功则会报错,可以加一个条件语句:

  1. loss = nn.CrossEntropyLoss()
  2. if torch.cuda.is_available():
  3. loss = loss.cuda()

如果可以利用gpu时,在将其转移到cuda上,否则就在CPU训练。

        我们使用time查看CPU和GPU训练时间差别:

  1. import time
  2. for epoch in range(20):
  3. start_time = time.time()
  4. sum = 0
  5. for data in dataloader:
  6. imgs, targets = data
  7. imgs = imgs.cuda()#数据输入转移到cuda上
  8. targets = targets.cuda()#数据标注转移到cuda上
  9. outputs = model(imgs)
  10. result_loss = loss(outputs, targets)
  11. optim.zero_grad()
  12. result_loss.backward()
  13. optim.step()
  14. sum = sum+result_loss
  15. print(sum)
  16. end_time = time.time()
  17. print(end_time - start_time)

使用GPU训练:

tensor(18699.9785, device='cuda:0', grad_fn=<AddBackward0>)
17.295462369918823
tensor(16166.4746, device='cuda:0', grad_fn=<AddBackward0>)
14.85786747932434...

使用CPU训练:

tensor(18777.4297, grad_fn=<AddBackward0>)
21.17310380935669
tensor(16230.0479, grad_fn=<AddBackward0>)
19.265528202056885...

        在terminal输入nvidia-smi可以查看GPU的一些信息

使用Google colab

        谷歌搜索Google colab,使用谷歌提供的一个免费的GPU:

        创建一个笔记本,导入torch:

导入成功,因为其中自带pytorch,并且是GPU的版本。如果想使用GPU则在左上角修改,笔记本设置中,选择GPU加速:

 将我们原来的代码直接复制过去即可运行,也可以使用!nvidia-smi查看提供的显卡信息。

利用.to()函数

        定义训练的设备:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")#cuda和cuda:0没有区别

.to()改变定义的设备则所有的变量都跟着改变,不像.cuda()需要一个一个修改。

  1. loss = nn.CrossEntropyLoss().to(device)
  2. model = Model().to(device)
  3. ...
  4. for data in dataloader:
  5. imgs, targets = data
  6. imgs = imgs.to(device)
  7. targets = targets.to(device)
  8. ...
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/357336
推荐阅读
相关标签
  

闽ICP备14008679号