系统信息:1.1.0,GPU,Windows,Python 3.5,代码在ipython控制台中运行。
我正在尝试运行两个不同的Tensorflow会话,一个在GPU上(执行一些批处理工作),一个在CPU上用于快速测试,而另一个工作。
问题是当我产生指定with tf.device('/cpu:0')
的第二个会话时,会话尝试分配GPU内存并崩溃我的其他会话。
我的代码:
import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""
import time
import tensorflow as tf
with tf.device('/cpu:0'):
with tf.Session() as sess:
# Here 6 GBs of GPU RAM are allocated.
time.sleep(5)
如何强制Tensorflow忽略GPU?
根据@Nicolas的评论中的建议,我看了at this answer然后跑了
import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""
import tensorflow as tf
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
打印:
[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 2215045474989189346
, name: "/gpu:0"
device_type: "GPU"
memory_limit: 6787871540
locality {
bus_id: 1
}
incarnation: 13663872143510826785
physical_device_desc: "device: 0, name: GeForce GTX 1080, pci bus id: 0000:02:00.0"
]
在我看来,即使我明确告诉脚本忽略任何CUDA设备,它仍然会找到并使用它们。这可能是TF 1.1的错误吗?
答案 0 :(得分:7)
事实证明,将CUDA_VISIBLE_DEVICES
设置为空字符串不会屏蔽脚本可见的CUDA设备。
来自documentation of CUDA_VISIBLE_DEVICES
(我强调):
只有序列中存在索引的设备才可见 CUDA应用程序和它们按顺序枚举 序列。 如果其中一个索引无效,则只有其中的设备 无效索引之前的索引对CUDA应用程序可见。对于 例如,将CUDA_VISIBLE_DEVICES设置为2,1会导致设备0成为 在设备1之前枚举不可见和设备2. 设置 CUDA_VISIBLE_DEVICES为0,2,-1,1会导致设备0和2可见 和设备1不可见。
似乎空字符串曾经被处理为"没有有效的设备存在"但改变了意义,因为文档中没有提到。
将代码更改为os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
可解决问题。运行
import os
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
import tensorflow as tf
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
现在打印
[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14097726166554667970
]
并实例化tf.Session
不会再占用GPU内存。
答案 1 :(得分:2)
你介意尝试其中一个配置选项吗?
finalize
根据documentation,它应该可以帮助您管理此特定会话的GPU内存,因此您的第二个会话应该能够在GPU上运行。
编辑:根据这个answer你也应该试试这个:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
# or config.gpu_options.per_process_gpu_memory_fraction = 0.0
with tf.Session(config=config) as sess:
...