获取 /dev/nvidia* 和 nvidia-smi gpu 列表之间的映射
Get mapping between /dev/nvidia* and nvidia-smi gpu list
一个有 4 个 GPU 的服务器用于深度学习。
经常发生训练过程终止(杀死)后 GPU 内存未释放的情况。 nvidia-smi
显示的结果是
使用的是cuda设备2。 (可能是使用 CUDA_VISIBLE_DEVICES=2
启动的进程)
部分子进程还活着,占用内存
一个非常有效的解决方案是使用以下方法杀死 python 创建的所有进程:
pkill -u user_name python
如果只有一个进程需要清理,这应该会有帮助。
pytorch官方提出的另一种方案My GPU memory isn’t freed properly
人们可以通过
找到它们
ps -elf | grep python
.
但是,如果启动了多个进程,而我们只想杀死与某个 GPU 相关的进程,我们可以按 gpu 索引(nvidia0、nvidia1、...)对进程进行分组,如下所示:
fuser -v /dev/nvidia*
正如我们所见,/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 权限。
一个有 4 个 GPU 的服务器用于深度学习。
经常发生训练过程终止(杀死)后 GPU 内存未释放的情况。 nvidia-smi
显示的结果是
使用的是cuda设备2。 (可能是使用 CUDA_VISIBLE_DEVICES=2
启动的进程)
部分子进程还活着,占用内存
一个非常有效的解决方案是使用以下方法杀死 python 创建的所有进程:
pkill -u user_name python
如果只有一个进程需要清理,这应该会有帮助。
pytorch官方提出的另一种方案My GPU memory isn’t freed properly 人们可以通过
找到它们ps -elf | grep python
.但是,如果启动了多个进程,而我们只想杀死与某个 GPU 相关的进程,我们可以按 gpu 索引(nvidia0、nvidia1、...)对进程进行分组,如下所示:
fuser -v /dev/nvidia*
正如我们所见,/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 权限。