从零开始使用:
>>> 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:分离(detach),发送到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
东西...
不清缓存后为什么内存仍在使用中?有任何想法吗?
nvidia-smi
确认正在使用 GPU 内存的进程。在那里,可以使用进程 IDpid
查找进程。如果没有显示任何进程但仍在使用 GPU 内存,则可以尝试此方法来清除内存。 - akshayk07