【发布时间】: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