如何使用 CUDA 刷新 GPU 内存(物理重置不可用)

我的 CUDA 程序在执行期间崩溃,在内存被刷新之前。结果,设备内存仍然被占用。

我运行在一个 GTX 580,其中 nvidia-smi --gpu-reset是不支持的。

在程序的开头放置 cudaDeviceReset()只会影响进程创建的当前上下文,并且不会刷新在它之前分配的内存。

我正在用那个 GPU 远程访问一个 Fedora 服务器,所以物理重置相当复杂。

所以,问题是,在这种情况下有没有办法刷新设备内存?

237435 次浏览

尽管在异常情况以外的任何情况下都没有必要这样做,但是在 linux 主机上这样做的推荐方法是通过以下方法卸载 nvidia 驱动程序

$ rmmod nvidia

然后重新加载它

$ modprobe nvidia

如果机器正在运行 X11,您需要事先手动停止,然后再重新启动它。驱动程序初始化过程应该消除设备上的任何先前状态。

这个答案已经从评论中汇集起来,并作为一个社区 wiki 发布,以便将这个问题从 CUDA 标签的未回答列表中删除

MacOS(/OSX)上,如果其他人在操作系统上遇到明显的内存泄漏问题:

  • Https://github.com/phvu/cuda-smi 有助于快速检查空闲内存
  • 退出应用程序似乎可以释放它们使用的内存。退出所有您不需要的东西,或者逐个退出应用程序,以查看它们使用了多少内存。
  • 如果这还不够的话(放弃大约10个应用程序对我来说释放了大约500MB/15%) ,目前最大的消费者是 WindowServer。您可以强制退出,这也会杀死所有运行的应用程序并将您注销。但是它比重启要快一点,并且让我回到了 Cuda 设备上90% 的空闲内存。

我也有同样的问题,我在 quora 中看到了一个很好的解决方案,使用

sudo kill -9 PID.

https://www.quora.com/How-do-I-kill-all-the-computer-processes-shown-in-nvidia-smi

检查什么是使用您的 GPU 内存与

sudo fuser -v /dev/nvidia*

您的输出如下所示:

                     USER        PID  ACCESS COMMAND
/dev/nvidia0:        root       1256  F...m  Xorg
username   2057  F...m  compiz
username   2759  F...m  chrome
username   2777  F...m  chrome
username   20450 F...m  python
username   20699 F...m  python

然后杀死 PID,你不再需要对 htop或与

sudo kill -9 PID.

在上面的例子中,Pycharm 吞噬了大量的内存,所以我杀死了20450和20699。

第一种

nvidia-smi

然后选择要杀死的 PID

sudo kill -9 PID

对于使用 python 的用户:

import torch, gc
gc.collect()
torch.cuda.empty_cache()

人们也可以使用 nvtop,它提供了一个非常类似于 htop的界面,但显示您的 GPU (s)的使用情况,以一个漂亮的图形。 您还可以从这里直接终止进程。

这里有一个到 Github 的链接: https://github.com/Syllo/nvtop

NVTOP interface

操作系统: UBUNTU 20.04 在终端类型中

nvtop

如果直接杀死消费活动不起作用,那么查找并记录大多数 GPU 使用情况下活动 PID 的确切数目。

sudo kill PID -number

我刚开始一个新的终端,关闭了旧的,它工作得很好,为我。

如果你有问题,杀死一个进程后,下一个开始(评论)-例如,当你有一个 bash 脚本,调用多个 python 脚本,你想杀死他们,但找不到它的 PID,你可以使用 ps -ef,在那里你会找到你的“问题”进程的 PID 和它的 PPID (父 PID)。使用 kill PPIDkill -9 PPIDsudo kill PPID停止进程。