我的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')
答案 0 :(得分:0)
要连续监控GPU使用情况,您可以使用
nvidia-smi --loop=1
在终端中。
要寻找两件事,即GPU的使用和GPU的内存的使用,选择最大批处理大小,以免出现内存不足错误。
关于GPU的使用情况,只要它正在计算,它就应该接近100%,这可能是因为您在CPU上的数据加载过程很慢,因此在大多数情况下,GPU等待CPU给它张量以执行计算。例如,在您的情况下,所有转换都在CPU上执行,这需要一些时间。
您可能想再进行一次培训,并密切关注GPU使用情况随时间的变化,从而确定需要更改的内容以及是否需要更改的内容。