前言
我在跑深度学习模型。其中卷积用CUDA写的。数据集是cifar10。在运行了1个epoch后,就报错:RuntimeError: CUDA error: an illegal memory access was encountered。这个错误是在调用loss.backward()方法时出现的。
在网上看了很多方法,有说改小batch_size的,有说让input_data和input_label都放在GPU上的,有说升级pytorch版本的,有说换GPU卡的…
解决办法
我在取数据进行训练时,先看看GPU内存和缓存的使用情况,具体是在出错的地方使用
print(torch.cuda.memory_allocated())
print(torch.cuda.memory_cached())
查看存储空间的使用情况。发现这两个值很接近。这说明内存被占用满了。但是我查看GPU的利用率,发现GPU的利用率才达到59%。
感觉挺玄乎的,我在调用loss.backward()前先使用torch.cuda.empty_cache()释放内存,把batch_size改小,就能运行了。
代码如下所示:
for step, (x, y) in enumerate(train_loader):
x = x.cuda()
y = y.cuda()
if step == 0:
batch_size = len(y)
optimizer.zero_grad()
output = net(x)
loss = loss_function(output, y).cuda()
#####加上了代码######
print(torch.cuda.memory_allocated())
print(torch.cuda.memory_cached())
torch.cuda.empty_cache()
#####加上了代码######
loss.backward()
if args.trainspflag:
UpdateBnFactor()
optimizer.step()
total_loss += (loss.item()/length)
#####在一次epoch完后再释放一次内存####
torch.cuda.empty_cache()
............
总结
玄乎!GPU内存利用率不高,但是就是说内存不够用。最开始我把batch_size调整为1,还是报同样的错!但是当我一边释放内存,一边改小batch_size后,又能用了。唉,我这个小白+菜鸟独闯CUDA编程,特别是涉及到内存管理上,真的是有N多坑要踩啊!