在PyTorch模型训练后如何清除GPU内存而不重启内核

时间:2019-09-09 17:12:11

标签: python pytorch jupyter

我正在Jupyter-Lab笔记本上训练PyTorch深度学习模型,并使用Tesla K80 GPU上的CUDA进行训练。在进行训练迭代时,将使用12 GB的GPU内存。我通过保存模型检查点来完成培训,但希望继续使用笔记本进行进一步的分析(分析中间结果等)。

但是,完成训练后,这12 GB继续被占用(如从nvtop中看到的)。我想释放此内存,以便可以将其用于其他笔记本电脑。

到目前为止,我的解决方案是重新启动此笔记本的内核,但这不能解决我的问题,因为到目前为止,我无法继续使用同一笔记本及其相应的输出进行计算。

4 个答案:

答案 0 :(得分:4)

到目前为止,答案在Cuda方面是正确的,但在ipython方面也存在问题。

在笔记本环境中发生错误时,ipython Shell将存储异常的回溯,以便您可以使用%debug访问错误状态。问题是,这需要将所有导致错误的变量保存在内存中,并且gc.collect()之类的方法不会回收它们。基本上,所有变量都会卡住并且内存泄漏。

通常,引发新异常将释放旧异常的状态。因此,尝试使用类似1/0的方法可能会有所帮助。但是,使用Cuda变量会使事情变得怪异,有时无法在不重新启动内核的情况下清除GPU内存。

有关更多详细信息,请参见以下参考文献:

https://github.com/ipython/ipython/pull/11572

How to save traceback / sys.exc_info() values in a variable?

答案 1 :(得分:2)

with pytorch.no_grad():
    torch.cuda.empty_cache()

答案 2 :(得分:1)

我自己从未与PyTorch合作,但是Google的几项结果基本上都是相同的。.torch.cuda.empty_cache()

https://forums.fast.ai/t/clearing-gpu-memory-pytorch/14637

https://discuss.pytorch.org/t/how-can-we-release-gpu-memory-cache/14530

How to clear Cuda memory in PyTorch

答案 3 :(得分:-1)

如果仅将None设置占用大量内存的对象设置为:

obj = None

然后您致电

gc.collect() # Python thing

这是避免重新启动笔记本电脑的方法。


如果您仍然想从Nvidea smi或nvtop上清除它,则可以运行:

torch.cuda.empty_cache() # PyTorch thing

清空PyTorch缓存。