【问题标题】:Get mapping between /dev/nvidia* and nvidia-smi gpu list获取 /dev/nvidia* 和 nvidia-smi gpu 列表之间的映射
【发布时间】:2022-01-28 18:31:25
【问题描述】:

具有 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 之间的顺序应该是一致的。
  • 这就是我想要的答案。您想将您的评论放入答案区域,以便我可以将其标记为已接受并已解决。 @MartinPecka
  • 好的,我会的。

标签: gpu nvidia


【解决方案1】:

如果你设置了CUDA_DEVICE_ORDER=PCI_BUS_ID环境变量,那么CUDA和nvidia-smi的顺序应该是一致的。

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

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2014-11-25
    • 2023-03-31
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多