【问题标题】:How to use GPU while training a model?训练模型时如何使用 GPU?
【发布时间】:2020-09-26 14:51:15
【问题描述】:

我正在运行代码以在 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 notebook 显示的 GPU 使用率为 0%,而我的 CPU 使用率高达 99%。我是否遗漏了使用 GPU 训练模型所需的任何代码?

【问题讨论】:

    标签: machine-learning deep-learning pytorch gpu


    【解决方案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)
    

    【讨论】:

    • 我已经添加了我的网络的详细信息,可能不会太多我会尝试让我的网络更加密集并回到这个答案。
    • 我不认为您的主要目标是使 GPU 使用率尽可能高。但只是为了看看是否完全使用 GPU,您可以通过引入例如更改您的 model.fc 覆盖。在初始层之后的另一个线性 1000 x 1000 层。顺便问一下num_ftrs的值是多少。
    • num_ftrs 的值为 512。
    • 我认为你的建议奏效了!我将线性层更改为输出大小为 2500,并添加了另一个线性层,但有时 GPU 使用率为 0,突然增加到 100%,然后再次下降到 0,但我猜它终于可以工作了。知道为什么它会下降到 0 吗?
    • 我认为这只是 Kaggle 显示 GPU 使用情况的一个人工制品(也许他们平均过去 1-2 秒的使用情况等)
    猜你喜欢
    • 2017-06-17
    • 2020-03-26
    • 2021-09-29
    • 2020-07-28
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2017-08-19
    • 2018-04-02
    相关资源
    最近更新 更多