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

GPh*_*ilo 7 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)
Run Code Online (Sandbox Code Playgroud)

如何强制Tensorflow忽略GPU?

更新:

正如@Nicolas在评论中所建议的那样,我看了看这个答案然后跑了

import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""
import tensorflow as tf

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
Run Code Online (Sandbox Code Playgroud)

打印:

[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"
]
Run Code Online (Sandbox Code Playgroud)

在我看来,即使我明确告诉脚本忽略任何CUDA设备,它仍然会发现并使用它们.这可能是TF 1.1的错误吗?

GPh*_*ilo 9

事实证明,设置CUDA_VISIBLE_DEVICES为空字符串也不能掩盖的脚本可见CUDA设备.

文件CUDA_VISIBLE_DEVICES(我强调):

只有序列中存在索引的设备对CUDA应用程序可见,并且它们按序列的顺序枚举.如果其中一个索引无效,则只有索引位于无效索引之前的设备才对CUDA应用程序可见.例如,将CUDA_VISIBLE_DEVICES设置为2,1会导致设备0不可见,设备2将在设备1之前枚举.将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())
Run Code Online (Sandbox Code Playgroud)

现在打印

[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 14097726166554667970
]
Run Code Online (Sandbox Code Playgroud)

并且实例化a tf.Session不再占用GPU内存了.