我运行的是一个修改过的第三方代码,它使用了pytorch和GPU。我通过改变模型参数多次运行同一个模型,我在python中这样做,即我有一个 Package 器python文件,它用不同的模型参数调用模型。但是我在运行第二个或第三个模型时得到了out-of-memory
错误。也就是说,模型可以正常运行一次,没有任何内存问题。因此,如果我在运行第一个模型后结束代码,然后重新启动第二个模型,代码工作正常。但是,如果我在python中链接模型,我会遇到out-of-memory
问题。
我怀疑第三方代码中有一些内存泄漏。在谷歌上,我发现了两个建议。一个是调用torch.cuda.empty_cache()
,另一个是使用del tensor_name
显式删除Tensor。然而,empty_cache()
命令并不能帮助释放整个内存,而第三个-party代码中的Tensor太多,我无法单独删除所有Tensor。有没有办法在python代码中清除当前python程序使用的整个GPU内存本身?
2条答案
按热度按时间f0brbegy1#
在没有实际阅读代码的情况下,很难确定是什么导致了内存问题。但是,大多数情况下,
empty_cache()
无法完成清理是因为某些进程仍在运行。因此,请尝试在empty_cache()
之后添加此内容字符串
jaxagkaj2#
垃圾收集器和
del
直接在模型和训练数据上工作,当使用循环中的模型时,我很少工作。通常,每次迭代都会创建一个新模型,而不会从内存中清除前一个模型,因此整个循环需要(model_size + training data) * n
的内存容量,其中 n 是迭代次数。这在使用联邦学习工具(如Flower)或使用k-fold cross validation.如果你想使用一个多处理的方法,它应该总是工作,以清除子进程使用的GPU内存,这将工作:字符串
如果你不想使用Pool,而想显式地杀死子进程,你可以使用(而不是Pool):
型
我认为使用Pool比Process更方便。