gpt4 book ai didi

python - 为什么清除对象后GPU中的内存还在使用?

转载 作者:太空狗 更新时间:2023-10-29 20:59:52 24 4
gpt4 key购买 nike

从零使用开始:

>>> 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 元素张量,在 deltorch.cuda.empty_cache() 之后,GPUtil.showUtilization(all=True) 报告与巨大张量使用的 GPU 内存量完全相同(torch.cuda.memory_cached()torch.cuda.memory_allocated() 均返回零).

关于python - 为什么清除对象后GPU中的内存还在使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57496285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com