CUDA Error: out of memory - Python process utilizes all GPU memory
CUDA Error: out of memory - Python process utilizes all GPU memory
即使在重新启动机器后,python3
进程(系统范围的解释器)也使用了 >95% 的 GPU 内存。
请注意,即使没有 运行ning 训练脚本,内存消耗仍然存在,而且我从未在系统环境中使用过 keras/tensorflow
,仅在 venv
或 docker 容器中使用过.
更新:
最后activity是执行NN测试脚本,配置如下:
tensorflow==1.14.0
Keras==2.0.3
tf.autograph.set_verbosity(1)
tf.set_random_seed(1)
session_conf = tf.ConfigProto(intra_op_parallelism_threads=8, inter_op_parallelism_threads=8)
session_conf.gpu_options.allow_growth = True
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.26 Driver Version: 440.26 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| 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 105... Off | 00000000:01:00.0 Off | N/A |
| N/A 53C P3 N/A / N/A | 3981MiB / 4042MiB | 1% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 4105 G /usr/lib/xorg/Xorg 145MiB |
| 0 4762 C /usr/bin/python3 3631MiB |
| 0 4764 G /usr/bin/gnome-shell 88MiB |
| 0 5344 G ...quest-channel-token=8947774662807822104 61MiB |
| 0 6470 G ...Charm-P/ch-0/191.6605.12/jre64/bin/java 5MiB |
| 0 7200 C python 45MiB |
+-----------------------------------------------------------------------------+
在恢复模式下重新启动后,我尝试 运行 nvidia-smi -r
但没有解决问题。
默认情况下,Tf 为进程的生命周期分配 GPU 内存,而不是会话对象的生命周期(因此内存可以比对象存在的时间长得多)。这就是为什么在您停止程序后内存仍然存在的原因。在很多情况下,使用 gpu_options.allow_growth = True
参数很灵活,但它会根据运行时进程的需要分配尽可能多的 GPU 内存。
为了防止 tf.Session
使用所有 GPU 内存,您可以通过更改 gpu_options.allow_growth = True
以允许定义的内存分数来为整个进程分配固定数量的内存(让我们使用50%,因为您的程序似乎能够在运行时使用大量内存),例如:
session_conf.gpu_options.per_process_gpu_memory_fraction = 0.5
这应该会阻止您达到上限并限制在 ~2GB(因为看起来您有 4GB 的 GPU)。
即使在重新启动机器后,python3
进程(系统范围的解释器)也使用了 >95% 的 GPU 内存。
请注意,即使没有 运行ning 训练脚本,内存消耗仍然存在,而且我从未在系统环境中使用过 keras/tensorflow
,仅在 venv
或 docker 容器中使用过.
更新: 最后activity是执行NN测试脚本,配置如下:
tensorflow==1.14.0
Keras==2.0.3
tf.autograph.set_verbosity(1)
tf.set_random_seed(1)
session_conf = tf.ConfigProto(intra_op_parallelism_threads=8, inter_op_parallelism_threads=8)
session_conf.gpu_options.allow_growth = True
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.26 Driver Version: 440.26 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| 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 105... Off | 00000000:01:00.0 Off | N/A |
| N/A 53C P3 N/A / N/A | 3981MiB / 4042MiB | 1% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 4105 G /usr/lib/xorg/Xorg 145MiB |
| 0 4762 C /usr/bin/python3 3631MiB |
| 0 4764 G /usr/bin/gnome-shell 88MiB |
| 0 5344 G ...quest-channel-token=8947774662807822104 61MiB |
| 0 6470 G ...Charm-P/ch-0/191.6605.12/jre64/bin/java 5MiB |
| 0 7200 C python 45MiB |
+-----------------------------------------------------------------------------+
在恢复模式下重新启动后,我尝试 运行 nvidia-smi -r
但没有解决问题。
默认情况下,Tf 为进程的生命周期分配 GPU 内存,而不是会话对象的生命周期(因此内存可以比对象存在的时间长得多)。这就是为什么在您停止程序后内存仍然存在的原因。在很多情况下,使用 gpu_options.allow_growth = True
参数很灵活,但它会根据运行时进程的需要分配尽可能多的 GPU 内存。
为了防止 tf.Session
使用所有 GPU 内存,您可以通过更改 gpu_options.allow_growth = True
以允许定义的内存分数来为整个进程分配固定数量的内存(让我们使用50%,因为您的程序似乎能够在运行时使用大量内存),例如:
session_conf.gpu_options.per_process_gpu_memory_fraction = 0.5
这应该会阻止您达到上限并限制在 ~2GB(因为看起来您有 4GB 的 GPU)。