相关文章推荐
含蓄的人字拖  ·  AWS ...·  9 月前    · 
腼腆的蚂蚁  ·  python 3.x - PyTorch ...·  1 年前    · 

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

32 人关注

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

然而,在完成培训后,这12GB继续被占用(从 nvtop 可以看出)。我想腾出这些内存,以便我可以将其用于其他笔记本。

到目前为止,我的解决方案是重启这台笔记本的内核,但这并不能解决我的问题,因为到目前为止,我无法继续使用同一台笔记本和它各自的输出计算。

python
pytorch
jupyter
Glyph
Glyph
发布于 2019-09-10
5 个回答
Karl
Karl
发布于 2022-06-15
已采纳
0 人赞同

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

当你在笔记本环境中出现错误时,ipython shell会存储异常的回溯,所以你可以用 %debug 来访问错误状态。问题是,这需要在内存中保留所有导致错误的变量,而这些变量并没有被 gc.collect() 这样的方法回收。基本上,你所有的变量都被卡住了,内存被泄露了。

通常情况下,引起一个新的异常会释放出旧的异常的状态。所以尝试类似 1/0 的方法可能会有帮助。然而,Cuda变量可能会变得很奇怪,有时没有办法在不重启内核的情况下清除你的GPU内存。

更多细节见这些参考资料。

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

如何将回溯/sys.exc_info()的值保存在一个变量中?

"然而,Cuda变量可能会变得很奇怪,有时没有办法在不重新启动内核的情况下清除你的GPU内存。"哇,你是认真的吗?这真的很糟糕...
替换代码0】这招对我来说很管用!
prosti
prosti
发布于 2022-06-15
0 人赞同

如果你只是把使用大量内存的对象设置为 None ,像这样。

obj = None

此后,你打电话给

gc.collect() # Python thing

这样你就可以避免重新启动笔记本。

如果你仍然想从Nvidea smi或nvtop看到它的清晰,你可以运行。

torch.cuda.empty_cache() # PyTorch thing

来清空PyTorch的缓存。

我试过 model = None gc.collect() ,但它没有清除任何GPU内存。
我通常使用nvtop来检查GPU内存。这是个好方法吗?
gc.collect是告诉Python进行垃圾收集,如果你使用nvidia工具,你不会看到它清楚,因为PyTorch仍然有分配的缓存,但它使其可用。
是的, torch.cuda.empty_cache() 可能会帮助你看清它。
这对我来说是有效的,以同样的顺序。1.- model = None, 2.- gc.collect(), 3.- torch.cuda.empty_cache()
Maunish Dave
Maunish Dave
发布于 2022-06-15
0 人赞同
with pytorch.no_grad():
    torch.cuda.empty_cache()
    
E.ws
对我来说,它总是只在 with torch.no_grad(): 下工作。
iScripters
iScripters
发布于 2022-06-15
0 人赞同

我自己没有用过PyTorch,但Google有几个结果,基本上都是这样说的。替换代码0

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