我安装了带有 Tensorflow 后端和 CUDA 的 Keras。我有时想按需强制 Keras 使用 CPU。不用说在虚拟环境中安装单独的仅 CPU 的 Tensorflow 就可以做到这一点吗?如果有怎么办?如果后端是 Theano,则可以设置标志,但我还没有听说过可以通过 Keras 访问的 Tensorflow 标志。
如果你想强制 Keras 使用 CPU
方式一
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
在导入 Keras / Tensorflow 之前。
方式二
运行你的脚本
$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py
也可以看看
https://github.com/keras-team/keras/issues/152 https://github.com/fchollet/keras/issues/4613
这对我有用(win10),在导入 keras 之前放置:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
这样做的一个相当可分离的方法是使用
import tensorflow as tf
from keras import backend as K
num_cores = 4
if GPU:
num_GPU = 1
num_CPU = 1
if CPU:
num_CPU = 1
num_GPU = 0
config = tf.ConfigProto(intra_op_parallelism_threads=num_cores,
inter_op_parallelism_threads=num_cores,
allow_soft_placement=True,
device_count = {'CPU' : num_CPU,
'GPU' : num_GPU}
)
session = tf.Session(config=config)
K.set_session(session)
在这里,使用 booleans
GPU
和 CPU
,我们通过严格定义允许 Tensorflow 会话访问的 GPU 和 CPU 的数量来指示我们是否希望使用 GPU 或 CPU 运行我们的代码。变量 num_GPU
和 num_CPU
定义了这个值。 num_cores
然后通过 intra_op_parallelism_threads
和 inter_op_parallelism_threads
设置可供使用的 CPU 内核数。
intra_op_parallelism_threads
变量指示计算图中单个节点中的并行操作允许使用的线程数(内部)。而 inter_ops_parallelism_threads
变量定义跨计算图(inter)节点的并行操作可访问的线程数。
allow_soft_placement
允许在满足以下任一条件时在 CPU 上运行操作:
该操作没有 GPU 实现 没有已知或注册的 GPU 设备 需要与来自 CPU 的其他输入共同定位
所有这些都在我的类的构造函数中执行,然后再进行任何其他操作,并且与我使用的任何模型或其他代码完全分离。
注意:这需要安装 tensorflow-gpu
和 cuda
/cudnn
,因为提供了使用 GPU 的选项。
参考:
ConfigProto 中的 allow_soft_placement 和 log_device_placement 等选项是什么意思?
inter_op_parallelism_threads 和 intra_op_parallelism_threads 的含义
allow_soft_placement
、intra_op_parallelism_threads
、inter_op_parallelism_threads
inter
/intra_op_parallelism_threads
是指 CPU 还是 GPU 操作?
只需导入 tensorflow 并使用 keras,就这么简单。
import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
tf.device('/cpu:0')
时,我仍然可以看到稍后使用 nvidia-smi
分配给 python 的内存。
with
下执行模型定义和编译吗?
根据 keras tutorial,您可以简单地使用与常规 tensorflow 中相同的 tf.device
范围:
with tf.device('/gpu:0'):
x = tf.placeholder(tf.float32, shape=(None, 20, 64))
y = LSTM(32)(x) # all ops in the LSTM layer will live on GPU:0
with tf.device('/cpu:0'):
x = tf.placeholder(tf.float32, shape=(None, 20, 64))
y = LSTM(32)(x) # all ops in the LSTM layer will live on CPU:0
with
内的代码可以是任何 Keras 代码。
我只是花了一些时间弄清楚。托马斯的回答并不完整。假设你的程序是 test.py
,你想使用 gpu0 来运行这个程序,并保持其他 gpus 空闲。
你应该写 CUDA_VISIBLE_DEVICES=0 python test.py
注意它是 DEVICES
而不是 DEVICE
对于使用 PyCharm 和强制 CPU 的人,您可以在运行/调试配置中的环境变量下添加以下行:
<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
CUDA_DEVICE_ORDER=PCI_BUS_ID
的任何引用import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = ""
,现在如何“撤消”这个?我希望 Keras 再次使用 GPU。