训练模型时如何使用GPU?

时间:2020-06-07 16:40:45

标签: machine-learning deep-learning pytorch gpu

我正在运行一个代码,以在kaggle笔记本上训练Resnet模型。我选择了加速器作为GPU,所以我在那没有犯任何错误。我正在使用以下代码训练模型:

model.cuda()
for epoch in range(10):
  model.train(True)
  trainloss=0
  for x,y in trainloader:

    x,y=x.cuda(),y.cuda()

    yhat=model(x)
    optimizer.zero_grad()
    loss=criterion(yhat,y)
    loss.backward()
    optimizer.step()
    trainloss+=loss.item()

  print('Epoch {}  Loss: {}'.format(epoch,(trainloss/len(trainloader.dataset))))
  model.eval()
  testcorrect=0
  with torch.no_grad():
    for test_x,test_y in testloader:
      test_x,test_y=test_x.cuda(),test_y.cuda()
      yhat=model(test_x)
      _,z=yhat.max(1)
      testcorrect+=(test_y==z).sum().item()

print('Model Accuracy: ',(testcorrect/len(testloader.dataset)))

网络代码:

model=torchvision.models.resnet18(pretrained=True)

num_ftrs=model.fc.in_features
model.fc=nn.Sequential(nn.Linear(num_ftrs,1000),
                        nn.ReLU(),
                        nn.Linear(1000,2)
)

如果您看到我在模型和张量(在训练部分以及验证部分内部)中都使用了.cuda()函数。但是,kaggle笔记本电脑显示的GPU使用率为0%,而我的CPU使用率则高达99%。我是否缺少使用GPU训练模型所需的任何代码?

1 个答案:

答案 0 :(得分:1)

可能是您的模型无法为GPU提供足够的工作。尝试使您的网络更加需要GPU,例如引入一些带有一堆神经元的线性层等,仔细检查在这种情况下您看到的GPU使用率增加了。另外我还注意到测量有些延迟,所以也许您可以给GPU做一些它可以在几分之一秒内完成的工作,并且GPU的使用率没有机会从0%升高。

也许您可以共享您正在使用的实际网络?

我可以看到Kaggle笔记本中的GPU使用率达到100%,这是一个玩具示例(请注意此处的2500 x 2500线性层):

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

trainloader = [(torch.Tensor(np.random.randn(1000, 5)), torch.Tensor([1.0] * 1000))] * 1000

model = nn.Sequential(nn.Linear(5, 2500), nn.Linear(2500, 1500), nn.Linear(1500, 1))
model.cuda()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.)
criterion = lambda x,y : ((x-y)**2).mean()

for epoch in range(10):
  for x,y in trainloader:
    x,y=x.cuda(),y.cuda()
    yhat=model(x)
    optimizer.zero_grad()
    loss=criterion(yhat,y)
    loss.backward()
    optimizer.step()
  print(epoch)