在我的Windows 10上,如果我直接创建一个GPU张量,我可以成功地释放它的内存。
import torch
a = torch.zeros(300000000, dtype=torch.int8, device='cuda')
del a
torch.cuda.empty_cache()
但是如果我创建一个正常张量并将它转换成GPU张量,我就不能再释放它的内存了。
import torch
a = torch.zeros(300000000, dtype=torch.int8)
a.cuda()
del a
torch.cuda.empty_cache()
为什么会发生这种事。
发布于 2022-06-05 20:58:32
为了得到来自@wstcegg的最佳答案,我清理Ubuntu上的GPU缓存(在windows下没有工作)的方法是:
import gc
import torch
gc.collect()
torch.cuda.empty_cache()
您还可能希望删除已创建的元素,请参阅How can I explicitly free memory in Python?
有关垃圾收集的更多细节,请参阅下面我引用的这个很好的参考资料。
https://stackabuse.com/basics-of-memory-management-in-python/
为什么执行手动垃圾收集?
我们知道Python解释器跟踪对程序中使用的对象的引用。在早期版本的Python中(直到版本1.6),Python解释器只使用引用计数机制来处理内存。当引用计数降到零时,Python解释器会自动释放内存。这种经典的参考计数机制是非常有效的,只是当程序有参考周期时,它不能工作。如果一个或多个对象相互引用,那么引用周期就会发生,因此引用计数永远不会达到零。
让我们考虑一个example.
def create_cycle():.列表= 8,9,10 .List.append(名单).返回列表. >>> create_cycle() [8,9,10 .]
上面的代码创建了一个引用周期,其中对象列表引用自身。因此,当函数返回时,对象列表的内存不会自动释放。参考周期问题不能用参考计数来解决。但是,这个引用周期问题可以通过改变Python应用程序中垃圾收集器的行为来解决。
为此,我们可以使用gc.collect()
模块的gc
函数。
导入gc n= gc.collect() print(“GC收集的不可访问对象的数量:”,n)
gc.collect()
返回它收集和取消分配的对象的数量。
执行手动垃圾回收的方法有两种:基于时间的垃圾收集方法或基于事件的垃圾回收方法。
基于时间的垃圾收集非常简单:在固定时间的interval.之后调用gc.collect()
函数。
https://stackoverflow.com/questions/63787404
复制相似问题