使用tf.device('/ cpu:0')时Tensorflow分配GPU内存

时间:2017-06-12 13:31:00

标签: python tensorflow

系统信息: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的错误吗?

2 个答案:

答案 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:
    ...