【发布时间】:2017-09-14 05:19:37
【问题描述】:
考虑以下两行 Python/TensorFlow 交互会话:
import tensorflow as tf
s=tf.Session()
如果这些命令在 Ubuntu Linux 14.04 机器上执行,使用 Anaconda Python 2.7.13 和 TensorFlow r1.3(从源代码编译),具有 32G 物理内存和 2 个 GPU(一个 GTX Titan X 和一个 GTX 970),而CUDA_VISIBLE_DEVICES 未设置(即两个 GPU 都可见)生成的 python 进程分配了 59.7G 内存!请注意,它实际上只使用了 754M。
如果CUDA_VISIBLE_DEVICES=0(即只有 Titan X 可见),则分配 55.2G 并使用 137M。
如果CUDA_VISIBLE_DEVICES=1(即只有 970 可见)则分配 47.0G 并使用 325M。
如果CUDA_VISIBLE_DEVICES=(即两个 GPU 都不可见),则仅分配 2.5G 且仅使用 131M。
这在分配的内存量受到限制的环境中是一个问题,例如在 Grid Engine 设置中。
有没有办法限制 TensorFlow 在使用 CUDA 时分配的主内存量?
更新 1
在这些试验中,分配的内存量是通过查看htop 中的VIRT 列来确定的。
TensorFlow r1.3 编译时大多使用默认的configure 答案。唯一的变化是通往 CUDA 和 cuDNN 的路径。因此,jemalloc 正在被使用。
更新 2
我尝试在禁用 jemalloc 的情况下重新编译并看到相同的行为。
【问题讨论】:
-
可能是由此处讨论的 CUDA 驱动程序问题引起的:stackoverflow.com/questions/11631191/…
-
如何检查分配了多少内存?也可以尝试使用不同的分配器运行——
sudo apt-get install google-perftools; export LD_PRELOAD="/usr/lib/libtcmalloc.so.4" -
谢谢@YaroslavBulatov。我尝试使用
tcmalloc,但它似乎对行为没有影响。当直接使用 CUDA 而不是通过 TensorFlow 时,我听说过类似的行为,所以我认为最好的 TF 可能是在加载 CUDA 驱动程序时对其进行不同的配置。 -
啊,你在看虚拟内存。我认为这在 Unix 上相当典型,我经常看到进程分配的巨大“virt”分配没有任何实际缺点
-
不幸的是,TF+CUDA 进程无法在监视虚拟内存分配的执行容器中运行,以确定进程是否表现自己并保持在指定的约束范围内,例如通过
ulimit。 Open Grid Scheduler/Grid Engine 就是一个例子。
标签: python tensorflow