获取/dev/nvidia*和nvidia-smi gpu列表之间的映射

4

一个有4个GPU的服务器用于深度学习。 经常会发生在训练过程被终止(杀死)后GPU内存没有被释放的情况。 由nvidia-smi显示的结果如下:

Nvidia-smi结果

使用了cuda设备2。(可能是使用了CUDA_VISIBLE_DEVICES=2启动的进程)

一些子进程仍然存在,因此占用内存。

  1. 一种暴力解决方案是使用以下命令杀死所有由python创建的进程:

    pkill -u user_name python

如果只需要清理一个进程,则这应该是有帮助的。

  1. 另一个由pytorch官方提出的解决方案 My GPU memory isn’t freed properly 可以通过以下方式找到它们:

    ps -elf | grep python

  2. 但是,如果启动了多个进程,并且我们只想杀死与某个GPU相关的进程,则可以按gpu索引(nvidia0、nvidia1等)对进程进行分组,如下所示:

    fuser -v /dev/nvidia*

fuser -v结果

正如我们所看到的,/dev/nvidia3被一些Python线程使用。 因此,/dev/nvidia3 对应于 cuda设备2

问题是:我想杀死使用CUDA_VISIBLE_DEVICES=2设置启动的某些进程,但我不知道gpu索引(/dev/nvidia0、/dev/nvidia1、...)。

如何找到CUDA_VISIBLE_DEVICES={0,1,2,3}/dev/nvidia{0,1,2,3}之间的映射关系。


设置CUDA_DEVICE_ORDER=PCI_BUS_ID会有帮助吗?这样CUDA和nvidia-smi之间的顺序应该是一致的。 - Martin Pecka
这是我想要的答案。你愿意把你的评论放到答案区域吗,这样我就可以标记它为已接受和解决了。@MartinPecka - wstcegg
好的,我会做的。 - Martin Pecka
1个回答

1
如果您设置了CUDA_DEVICE_ORDER=PCI_BUS_ID环境变量,那么CUDA和nvidia-smi之间的顺序应该保持一致。
还有另一种选择(如果您确定将特定GPU限制在CUDA_VISIBLE_DEVICES环境变量中)。可以检查每个进程的环境变量,在/proc/${PID}/environ中。格式部分是二进制的,但通常通过输出进行grep(如果您强制grep将文件视为文本文件)即可解决。这可能需要root权限。

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