pytorch不使用GPU。在Fastai上工作

时间:2019-08-25 09:45:59

标签: pytorch

我的GPU Nvidia gtx1050 Ti

我正在尝试在GPU上进行训练,但我只看到CPU利用率为60-90%,而在训练期间GPU约为5%,可能是由于将张量复制到了我不知道的GPU上造成的。但它仅上升了5%,然后下降了。

我尝试根据一些在线解决方案将批处理大小增加到64或128,但这只是给我Cuda内存不足错误。我在4GB内存中使用了2.3GB内存,说需要120 MB内存,只有110 mb。----我什至不知道它现在是如何工作的

然后尝试将批处理大小减小到16,然后又使Cuda出现内存不足错误,提示需要40 MB内存,并且16GB内存占用了2.3GB的4GB内存

最后它可以处理8个批处理大小,但只使用CPU而没有GPU

我使用批处理大小为128的fastai,它可以正常工作并使用gpu。我不知道我做错了什么。任何帮助表示赞赏。下面是我基于pytorch图像分类器教程编写的代码

模型Resnet预训练为True 有205个标签,包含约117000张图像作为训练数据。 只是使用预训练的权重,以使权重可以相应地修改而不会冻结权重,并且不会从头开始训练,我认为这就是代码的作用。如果我做错了什么或更好的解决方案,请随时纠正我。最后,我只是pytorch中的菜鸟……。pytorch中的第一个代码

trainset ....... PIL带有rgb的图像格式已转换,以防止出现4通道错误;如果未由PIL打开,则将其删除-无效图像:损坏的图像

device = torch.device("cuda:0") #0 device is my nvidia gtx 1050 ti when printed

model.fc=nn.Linear(2048, 205) 

from torchvision import transforms
t = transforms.Compose([            
 transforms.Resize(256),                    #[2]
 transforms.CenterCrop(224),                #[3]
 transforms.ToTensor(),                     #[4]
 transforms.Normalize(                      #[5]
 mean=[0.485, 0.456, 0.406],                #[6]
 std=[0.229, 0.224, 0.225] )                 #[7]
 ])
trainloader = torch.utils.data.DataLoader(trainset, batch_size=8,
                                          shuffle=True)

if torch.cuda.is_available():
    print('yes gpu')
    torch.set_default_tensor_type('torch.cuda.FloatTensor')
    model = model.cuda()

import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

for epoch in range(6):  # loop over the dataset multiple times
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels,img_name = data
        inputs = inputs.to(device) 
        labels = labels.to(device)
        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        total=0
        correct=0
        if i % 2000 == 1999: 
            # print every 2000 mini-batches

            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            outputs = model(inputs)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()

            print('Accuracy of the network on the batch size  images: %d %%' % (
                100 * correct / total)) #training accuraccy

            running_loss = 0.0

print('Finished Training')

1 个答案:

答案 0 :(得分:0)

要连续监控GPU使用情况,您可以使用 nvidia-smi --loop=1在终端中。

要寻找两件事,即GPU的使用和GPU的内存的使用,选择最大批处理大小,以免出现内存不足错误。

关于GPU的使用情况,只要它正在计算,它就应该接近100%,这可能是因为您在CPU上的数据加载过程很慢,因此在大多数情况下,GPU等待CPU给它张量以执行计算。例如,在您的情况下,所有转换都在CPU上执行,这需要一些时间。

您可能想再进行一次培训,并密切关注GPU使用情况随时间的变化,从而确定需要更改的内容以及是否需要更改的内容。