在我的 GPU #0 中,使用了 11341MiB 的 GPU RAM,并且 没有列出任何进程nvidia-smi
。这怎么可能,我怎样才能恢复记忆?
Thu Aug 18 14:27:58 2016
+------------------------------------------------------+
| NVIDIA-SMI 352.63 Driver Version: 352.63 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX TIT... Off | 0000:02:00.0 Off | N/A |
| 29% 61C P2 71W / 250W | 11341MiB / 12287MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX TIT... Off | 0000:03:00.0 Off | N/A |
| 22% 42C P0 71W / 250W | 23MiB / 12287MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 GeForce GTX TIT... Off | 0000:82:00.0 Off | N/A |
| 22% 35C P0 69W / 250W | 23MiB / 12287MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 3 GeForce GTX TIT... Off | 0000:83:00.0 Off | N/A |
| 0% 33C P0 60W / 250W | 23MiB / 12287MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
我启动了一个带有标志的 Theano Python 脚本lib.cnmem=0.9
,这解释了为什么它使用 11341MiB 的 GPU 内存(CNMeM 库是一个“帮助深度学习框架管理 CUDA 内存的简单库。”。)。然而,我终止了脚本,并期望 GPU 内存得到释放。
pkill -9 python
并sudo nvidia-smi --gpu-reset -i 0
没有帮助。sudo fuser -v /dev/nvidia*
没有显示任何不需要的进程。
我使用 GeForce GTX Titan Maxwell 和 Ubuntu 14.04.4 LTS x64。
答案1
用于kill -9
任意结束进程是一个非常糟糕的主意,并且可能会把事情搞砸。SIGKILL
或信号 9 立即停止进程执行,而不让它完成任何操作并正确终止。在这种情况下,当您的脚本被终止时,它可能没有释放 RAM。在您的情况下,回收内存的唯一方法是通过重置 GPU nvidia-smi --gpu-reset
,或者如果不可用,则重新启动。
下次您需要简单地停止程序时,请使用不带参数的kill,它会发送一个SIGTERM
,SIGTERM
这是一个更友好的信号,允许程序实际处理它并终止。SIGKILL
仅应用于停止不响应其他信号的作业,并且是最后的手段。