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

Get mapping between /dev/nvidia* and nvidia-smi gpu list

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

Nvidia-smi results

使用的是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 results

正如我们所见,/dev/nvidia3 被一些 python 线程使用。因此 /dev/nvidia3 对应于 cuda device 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之间的顺序应该是一致的。

还有另一个选项(如果您确定对特定 GPU 的限制是通过 CUDA_VISIBLE_DEVICES env var 完成的)。 /proc/${PID}/environ 中可以检查每个进程的环境。格式部分是二进制的,但 grep 遍历输出通常有效(如果您强制 grep 将文件视为文本文件)。这可能需要 root 权限。