赞
踩
RuntimeError: CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 2.00 GiB total capacity; 1.34 GiB already allocated; 14.76 MiB free; 1.38 GiB reserved in total by PyTorch)
查资料的过程发现另一种报错:
RuntimeError: CUDA out of memory. Tried to allocate 12.50 MiB (GPU 0; 10.92 GiB total capacity; 8.57 MiB already allocated; 9.28 GiB free; 4.68 MiB cached)
注意到括号内最后一部分的报错是不一样的。
网络上提供的解决方法主要有以下几种:
最简单有效的办法:重新启动内核并找到最佳batch size之后减少batch size。
即加上:
torch.cuda.empty_cache()
或者手动清除未使用的变量:
import torch,gc
del variables
gc.collect()
torch.cuda.empty_cache()
但使用该方法错误可能依旧存在,因为Pytorch实际上并不清除内存,而是清除对变量占用的内存的引用。
即(在错误代码前)加上:
with torch.no_grad():
outputs = net(images) #该行为报错代码
在test过程中是要如此处理的,否则会使显存加倍导致out of memory (OOM)错误。但若是在训练过程中采用此策略,可能出现效果差甚至更严重的问题。
(Windows系统)打开cmd,输入命令查看:
nvidia-smi
可以看到gpu被占用情况和占用的进程(以及其进程号PID),接下来杀死最后一个进程:
taskkill /PID 12132 -t -f
其中12132是要杀死的进程号。再次查看可以看到:
可能最开始使用了:
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 2, 3"
但打开任务管理器查看性能却有:
查看性能,发现NVIDIA的只有GPU1,所以改成如下:
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
若想直接改到CPU上运行,则可以修改如下:
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
即购买或租用高性能显卡。
该方法请参考:RuntimeError:CUDA Error;CUDA out of memory.
通过以下命令进一步查看使用的gpu的内存分配情况:
torch.cuda.memory_summary(device=None, abbreviated=False)
通过可读的内存分配summary可以查看报错原因。
另外,迭代地传递数据或者改变网络层的大小也是可以尝试的方法。
我报的是第一类错误,最后使用方法(4)解决了。大家可以根据自己的情况用以上的一种或者多种方法尝试解决。
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。