一个有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设备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