• <bdo id='4rCdd'></bdo><ul id='4rCdd'></ul>
    <i id='4rCdd'><tr id='4rCdd'><dt id='4rCdd'><q id='4rCdd'><span id='4rCdd'><b id='4rCdd'><form id='4rCdd'><ins id='4rCdd'></ins><ul id='4rCdd'></ul><sub id='4rCdd'></sub></form><legend id='4rCdd'></legend><bdo id='4rCdd'><pre id='4rCdd'><center id='4rCdd'></center></pre></bdo></b><th id='4rCdd'></th></span></q></dt></tr></i><div id='4rCdd'><tfoot id='4rCdd'></tfoot><dl id='4rCdd'><fieldset id='4rCdd'></fieldset></dl></div>

    <small id='4rCdd'></small><noframes id='4rCdd'>

      <legend id='4rCdd'><style id='4rCdd'><dir id='4rCdd'><q id='4rCdd'></q></dir></style></legend>
    1. <tfoot id='4rCdd'></tfoot>
      1. 为什么清除对象后GPU中的内存仍在使用?

        时间:2024-08-11

          <tbody id='kquC4'></tbody>

        <small id='kquC4'></small><noframes id='kquC4'>

            <bdo id='kquC4'></bdo><ul id='kquC4'></ul>
            <i id='kquC4'><tr id='kquC4'><dt id='kquC4'><q id='kquC4'><span id='kquC4'><b id='kquC4'><form id='kquC4'><ins id='kquC4'></ins><ul id='kquC4'></ul><sub id='kquC4'></sub></form><legend id='kquC4'></legend><bdo id='kquC4'><pre id='kquC4'><center id='kquC4'></center></pre></bdo></b><th id='kquC4'></th></span></q></dt></tr></i><div id='kquC4'><tfoot id='kquC4'></tfoot><dl id='kquC4'><fieldset id='kquC4'></fieldset></dl></div>

              <legend id='kquC4'><style id='kquC4'><dir id='kquC4'><q id='kquC4'></q></dir></style></legend>
                • <tfoot id='kquC4'></tfoot>
                  本文介绍了为什么清除对象后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元素张量,在deltorch.cuda.empty_cache()之后,GPUtil.showUtilization(all=True)报告的GPU内存量与巨大张量使用的GPU内存量完全相同(并且torch.cuda.memory_cached()torch.cuda.memory_allocated()都返回零)。

                  这篇关于为什么清除对象后GPU中的内存仍在使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:如何让pip从需求文件中运行特定命令? 下一篇:将PyTorch张量转换为Python列表

                  相关文章

                    <small id='iv9k2'></small><noframes id='iv9k2'>

                    <i id='iv9k2'><tr id='iv9k2'><dt id='iv9k2'><q id='iv9k2'><span id='iv9k2'><b id='iv9k2'><form id='iv9k2'><ins id='iv9k2'></ins><ul id='iv9k2'></ul><sub id='iv9k2'></sub></form><legend id='iv9k2'></legend><bdo id='iv9k2'><pre id='iv9k2'><center id='iv9k2'></center></pre></bdo></b><th id='iv9k2'></th></span></q></dt></tr></i><div id='iv9k2'><tfoot id='iv9k2'></tfoot><dl id='iv9k2'><fieldset id='iv9k2'></fieldset></dl></div>

                  1. <tfoot id='iv9k2'></tfoot>
                  2. <legend id='iv9k2'><style id='iv9k2'><dir id='iv9k2'><q id='iv9k2'></q></dir></style></legend>
                    • <bdo id='iv9k2'></bdo><ul id='iv9k2'></ul>