我安装了Tensorflow后端和CUDA的Keras。我有时想按需强迫Keras使用CPU。不用说在虚拟环境中安装单独的仅CPU的Tensorflow就能做到吗?如果可以,怎么办?如果后端是Theano,则可以设置标志,但是我还没有听说过可以通过Keras访问Tensorflow标志。
我安装了Tensorflow后端和CUDA的Keras。我有时想按需强迫Keras使用CPU。不用说在虚拟环境中安装单独的仅CPU的Tensorflow就能做到吗?如果可以,怎么办?如果后端是Theano,则可以设置标志,但是我还没有听说过可以通过Keras访问Tensorflow标志。
Answers:
如果要强制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
也可以看看
CUDA_DEVICE_ORDER=PCI_BUS_ID
有关问题#152的任何参考
import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = ""
,现在如何“撤消”呢?我希望Keras再次使用GPU。
一个相当分离的方法是使用
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
和设置可供使用的CPU内核数inter_op_parallelism_threads
。
该intra_op_parallelism_threads
变量指示在计算图中单个节点中并行操作被允许使用(内部)的线程数。虽然inter_ops_parallelism_threads
变量定义了跨计算图节点(并行)进行并行操作可访问的线程数。
allow_soft_placement
如果满足以下任一条件,则允许在CPU上运行操作:
该操作没有GPU实现
没有已知或注册的GPU设备
需要与CPU的其他输入一起放置
所有这些都在任何其他操作之前在我的类的构造函数中执行,并且可以与我使用的任何模型或其他代码完全分开。
注意:这要求tensorflow-gpu
和cuda
/ cudnn
要安装,因为提供了使用GPU的选项。
参考:
allow_soft_placement
,intra_op_parallelism_threads
,inter_op_parallelism_threads
inter
/ intra_op_parallelism_threads
是指CPU或GPU操作?
这对我有用(win10),在导入keras之前放置:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
只需导入tensortflow并使用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')
,我仍然可以看到稍后使用分配给python的内存nvidia-smi
。
with
吗?
按照keras 教程,您可以简单地使用与tf.device
常规tensorflow中相同的作用域:
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代码。
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
按照下面的答案进行设置