【问题标题】:Pytorch not using GPU . Worked on FastaiPytorch 不使用 GPU 。在 Fastai 工作
【发布时间】:2019-12-29 21:06:42
【问题描述】:

我的 GPU Nvidia gtx1050 Ti

我正在尝试在 GPU 上对其进行训练,但在训练期间我只看到 60-90% 的 CPU 利用率和大约 5% 的 GPU,这可能是由于我不知道将张量复制到 GPU 造成的。但它只涨了 5% 就回落了。

我尝试根据一些在线解决方案将批量大小增加到 64 或 128,但它只会给我 Cuda 内存不足错误。我已经使用了 4gb 中的 2.3gb,并说需要 120 MB 并且只有 110 mb。---- 我什至不明白它是如何工作的

然后尝试将批处理大小减小到 16,然后还导致 Cuda 内存不足错误说需要 40 MB 并且有 16mb 相同的 2.3 GB 使用了 4gb

最终它适用于 8 个批量大小,但它只使用 CPU 没有 GPU

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

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

trainset....... PIL 图像格式转换为 rgb 以防止 4 通道错误,如果没有被 PIL 打开,则将其删除 --invalid images: 损坏的图像

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')

【问题讨论】:

    标签: pytorch


    【解决方案1】:

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

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

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

    您可能希望启动另一次训练,并密切关注 GPU 使用情况随时间的变化,以确定需要更改的内容以及是否需要更改。

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2020-05-22
      • 2020-08-10
      • 2019-09-20
      • 2020-12-22
      相关资源
      最近更新 更多