如何使用CUDA清空GPU内存(无法进行物理重置)

100
我的CUDA程序在执行过程中崩溃了,在内存被刷新之前。结果,设备内存仍然被占用。
我正在GTX 580上运行,nvidia-smi --gpu-reset不支持。
cudaDeviceReset()放在程序开头只影响由进程创建的当前上下文,并不能清除之前分配的内存。
我远程访问带有该GPU的Fedora服务器,因此物理重置非常复杂。
因此,问题是-在这种情况下有没有办法清空设备内存?

4
尽管nvidia-smi --gpu-reset不可用,但我仍可以通过使用nvidia-smi -q获得一些信息。在大多数字段中,它会显示“N/A”,但某些信息是有用的。这是相关的输出:内存使用情况 总共 : 1535 MB 已使用 : 1227 MB 空闲 : 307 MB - timdim
1
如果您拥有 root 访问权限,您可以卸载并重新加载 nvidia 驱动程序。 - tera
4
如果你运行 ps -ef |grep 'whoami' 命令,而结果显示出任何似乎与你崩溃的会话相关的进程,请终止它们。(其中单引号 ' 应该替换为反引号 `) - Robert Crovella
2
你尝试过 sudo rmmod nvidia 吗? - Przemyslaw Zych
2
nvidia-smi -caa 对我来说非常好用,可以一次释放所有GPU上的内存。 - David Arenburg
显示剩余7条评论
13个回答

191

使用以下工具检查正在占用您的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

然后在htop上或者使用命令行杀掉你不再需要的PID。

sudo kill -9 PID.

在上面的例子中,Pycharm占用了大量内存,所以我杀掉了20450和20699。


10
谢谢! 由于某种原因,我有一个进程占用了所有的VRAM,但在nvidia-smi上没有显示。 - Davidmh
1
我在不同的Jupyter笔记本中运行深度学习时需要经常使用它。唯一的问题是如何确切地知道哪个PID是哪个。有什么建议吗? - Little Bobby Tables
2
@josh 我一个一个地杀死它们,心里记下了命令。 - Kenan
2
@kRazzyR - 我认为它用于加速计算,渲染图形,但也可能用于其他方面。当我安装Nvidia驱动程序、CUDA和cudnn时,这确实给我带来了很多问题。我不得不关闭很多功能。请参见此处 - Little Bobby Tables
1
在我的情况下,sudo 不是必需的。 - one
显示剩余4条评论

64

首先类型

nvidia-smi

然后选择要终止的PID

sudo kill -9 PID

2
太棒了,这个方法对我真的有效。 PID 应该被替换为使用 GPU 的进程的 PID 号码(你可以通过 nvidia-smi 找到)。 - Lior Magen
命令 nvidia-smi 返回 无法初始化 NVML:驱动程序/库版本不匹配 - desmond13
nvidia-smi 给我两个进程,当我试图杀死它们时,它会显示没有这样的进程。这两个进程都叫做 Xwayland。 - ejkitchen

16

虽然除非特殊情况,否则没有必要这样做,但在Linux主机上建议通过执行以下操作来卸载nvidia驱动程序:

$ rmmod nvidia 

使用适当的根权限,然后重新加载它

$ modprobe nvidia
如果机器正在运行X11,则需要先手动停止它,然后再重启。驱动程序初始化过程应该会消除设备上的任何先前状态。
这个答案是从评论中组合而成的,作为社区Wiki发布,以便将此问题从CUDA标记的未回答列表中移除。

8
无法处理上述命令,错误显示CUDA正在使用中。因此,我使用https://dev59.com/1GUp5IYBdhLWcg3wj4Hu#46597252提供的解决方案杀死了该PID。这对我起作用。 - DSBLR

15

使用Python的人:

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

11
这与提问者所询问的问题毫无关系。 - talonmies
1
然而,它解决了我的问题(尽管与原帖提出的问题不完全相同,但在搜索时匹配了标题)。 - vmatyi
尽管回答了我的问题(虽然与原帖所问的不完全相同,但与搜索标题相符),但仍然解决了我的问题。 - vmatyi
1
同样的问题,任何帮助都将不胜感激 :) - Thiago Loureiro

11

当我无意中打开并加载两个不同的jupyter笔记本时,它效果很好,使用了 VGG16警告:它会将笔记本关闭。我猜你可以选择其中一个来为另一个释放一些内存,但我不知道如何选择给定笔记本的PID。 - Little Bobby Tables

9

还可以使用 nvtop,它提供一个与 htop 非常相似的界面,但显示 GPU 使用情况,并具有美观的图表。您还可以直接从此处终止进程。

这是它的 Github 链接:https://github.com/Syllo/nvtop

NVTOP 接口


5

对于macOS(/ OS X)用户,如果有人遇到操作系统内存泄漏的问题:

  • https://github.com/phvu/cuda-smi可以快速检查可用内存。
  • 退出应用程序似乎会释放它们使用的内存。退出您不需要的所有应用程序或单独停止应用程序以查看它们使用了多少内存。
  • 如果这还不够(对我来说,退出10个应用程序释放了约500MB / 15%),则最大的消耗者是WindowServer。 您可以强制退出它,这也将关闭您运行的所有应用程序并注销您。但它比重新启动要快一点,并让我的cuda设备空闲内存达到90%。

4

杀死GPU上的所有进程:

sudo fuser -v /dev/nvidia* -k

1
不要直接提供答案,尝试编写详细的注释来解释解决方案,只要说明不太冗长即可。@AbuAli。 - DSDmark

2

针对操作系统:UBUNTU 20.04

在终端中键入

nvtop

如果直接杀死消耗活动的方法不起作用,则需查找并记录使用GPU最多的活动PID的确切编号。

sudo kill PID -number

0
如果您遇到了这样的问题:在杀死一个进程后,下一个进程就会启动(Comment),比如当您有一个调用多个Python脚本的Bash脚本时,您想要杀死它们但找不到它们的PID,您可以使用ps -ef命令,在其中找到您“有问题”的进程的PID和其PPID(父进程ID)。使用kill PPIDkill -9 PPIDsudo kill PPID来停止这些进程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接