我正在运行一个代码,以在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训练模型所需的任何代码?
答案 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)