我正在Jupyter-Lab笔记本上训练PyTorch深度学习模型,并使用Tesla K80 GPU上的CUDA进行训练。在进行训练迭代时,将使用12 GB的GPU内存。我通过保存模型检查点来完成培训,但希望继续使用笔记本进行进一步的分析(分析中间结果等)。
但是,完成训练后,这12 GB继续被占用(如从nvtop
中看到的)。我想释放此内存,以便可以将其用于其他笔记本电脑。
到目前为止,我的解决方案是重新启动此笔记本的内核,但这不能解决我的问题,因为到目前为止,我无法继续使用同一笔记本及其相应的输出进行计算。
答案 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
答案 3 :(得分:-1)
如果仅将None
设置占用大量内存的对象设置为:
obj = None
然后您致电
gc.collect() # Python thing
这是避免重新启动笔记本电脑的方法。
如果您仍然想从Nvidea smi或nvtop上清除它,则可以运行:
torch.cuda.empty_cache() # PyTorch thing
清空PyTorch缓存。