系统信息: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的错误吗?
事实证明,设置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内存了.
| 归档时间: |
|
| 查看次数: |
4971 次 |
| 最近记录: |