前言
我在跑深度学习模型。其中卷积用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多坑要踩啊!