【发布时间】:2019-12-21 02:31:01
【问题描述】:
从零使用开始:
>>> 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 东西......
知道为什么清除缓存后内存仍在使用吗?
【问题讨论】:
-
首先,使用
nvidia-smi确认哪个进程正在使用GPU内存。那里的进程 idpid可用于查找进程。如果没有显示任何进程但GPU内存仍在使用,您可以尝试this method清除内存。
标签: python memory-leaks garbage-collection gpu pytorch