Why is the memory in GPU still in use after clearing the object?(为什么清除对象后GPU中的内存仍在使用?)
问题描述
从零使用开始:
>>> import gc
>>> import GPUtil
>>> import torch
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
| 0 | 0% | 0% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
然后我创建一个足够大的张量并占用内存:
>>> x = torch.rand(10000,300,200).cuda()
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
| 0 | 0% | 26% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
然后我尝试了几种方法来查看张量是否消失。
尝试1:分离、发送到CPU并覆盖变量
否,不起作用。
>>> x = x.detach().cpu()
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
| 0 | 0% | 26% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
尝试2:删除变量
不,这也不起作用
>>> del x
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
| 0 | 0% | 26% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
尝试3:使用torch.cuda.empty_cache()函数
似乎管用,但似乎有一些挥之不去的管理费用.
>>> torch.cuda.empty_cache()
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
| 0 | 0% | 5% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
尝试4:可能清除垃圾回收器。
不,仍有5%被占用
>>> gc.collect()
0
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
| 0 | 0% | 5% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
尝试5:尝试全部删除torch(就好像del x不起作用-_-)
不,它不.*
>>> del torch
>>> GPUtil.showUtilization()
| ID | GPU | MEM |
------------------
| 0 | 0% | 5% |
| 1 | 0% | 0% |
| 2 | 0% | 0% |
| 3 | 0% | 0% |
然后我试着检查gc.get_objects(),看起来里面仍然有相当多奇怪的THCTensor东西……
是否知道清除缓存后内存仍在使用的原因?
推荐答案
看起来,即使没有张量,PyTorch的缓存分配器也会保留一定数量的内存,并且此分配是由第一次CUDA内存访问触发的
(torch.cuda.empty_cache()从缓存中删除未使用的张量,但缓存本身仍使用一些内存)。
即使使用很小的1元素张量,在del和torch.cuda.empty_cache()之后,GPUtil.showUtilization(all=True)报告的GPU内存量与巨大张量使用的GPU内存量完全相同(并且torch.cuda.memory_cached()和torch.cuda.memory_allocated()都返回零)。
这篇关于为什么清除对象后GPU中的内存仍在使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么清除对象后GPU中的内存仍在使用?
基础教程推荐
- Kivy 使用 opencv.调整图像大小 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
