首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么没有用torch.cuda.empty_cache()发布CUDA内存

为什么没有用torch.cuda.empty_cache()发布CUDA内存
EN

Stack Overflow用户
提问于 2020-09-08 05:06:49
回答 5查看 5.8K关注 0票数 2

在我的Windows 10上,如果我直接创建一个GPU张量,我可以成功地释放它的内存。

代码语言:javascript
运行
复制
import torch
a = torch.zeros(300000000, dtype=torch.int8, device='cuda')
del a
torch.cuda.empty_cache()

但是如果我创建一个正常张量并将它转换成GPU张量,我就不能再释放它的内存了。

代码语言:javascript
运行
复制
import torch
a = torch.zeros(300000000, dtype=torch.int8)
a.cuda()
del a
torch.cuda.empty_cache()

为什么会发生这种事。

EN

Stack Overflow用户

发布于 2022-06-05 20:58:32

为了得到来自@wstcegg的最佳答案,我清理Ubuntu上的GPU缓存(在windows下没有工作)的方法是:

代码语言:javascript
运行
复制
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()函数。

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63787404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档