具有Tensorflow后端的Keras可以随意使用CPU或GPU吗?

mik*_*305 88 python machine-learning keras tensorflow

我在Keras上安装了Tensorflow后端和CUDA.我想有时需要强迫Keras使用CPU.这可以在没有在虚拟环境中安装单独的CPU Tensorflow的情况下完成吗?如果是这样的话?如果后端是Theano,可以设置标志,但我还没有听说过可通过Keras访问的Tensorflow标志.

Mar*_*oma 96

如果你想强迫Keras使用CPU

方式1

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"   # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
Run Code Online (Sandbox Code Playgroud)

在导入Keras/Tensorflow之前.

方式2

运行您的脚本

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py
Run Code Online (Sandbox Code Playgroud)

也可以看看

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/4613

  • 对我不起作用(Keras 2,Windows) - 必须在下面的答案中设置`os.environ ['CUDA_VISIBLE_DEVICES'] ='-1'. (12认同)
  • #152指的是什么问题?链接会很好. (3认同)

RAC*_*OME 65

一个相当可分的方法是使用

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

在这里,使用booleans GPUCPU,我们通过严格定义允许Tensorflow会话访问的GPU和CPU的数量来指示我们是否希望使用GPU或CPU运行我们的代码.变量num_GPUnum_CPU定义此值.num_cores然后通过intra_op_parallelism_threads和设置可用的CPU核心数inter_op_parallelism_threads.

intra_op_parallelism_threads变量指示允许计算图中的单个节点中的并行操作(内部)的线程数.而inter_ops_parallelism_threads变量定义了可在计算图(inter)的节点之间进行并行操作的线程数.

allow_soft_placement 允许在满足以下任何条件的情况下在CPU上运行操作:

  1. 该操作没有GPU实现

  2. 没有已知或已注册的GPU设备

  3. 需要与来自CPU的其他输入共存

所有这些都是在我的类的构造函数中执行任何其他操作之前,并且可以与我使用的任何模型或其他代码完全分离.

注意:这需要tensorflow-gpucuda/ cudnn要安装,因为该选项用于使用GPU.

参考文献:


Neu*_*tic 44

这对我(win10)起作用,在你导入keras之前放置:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Run Code Online (Sandbox Code Playgroud)

  • 在Ubuntu上为我工作 (3认同)
  • 使用Win,强制TF使用CPU并忽略任何GPU。运气没有0或空白,但是-1似乎可以解决问题。 (2认同)

har*_*028 22

只需导入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)
Run Code Online (Sandbox Code Playgroud)

  • 当我设置`tf.device('/ cpu:0')`时,我仍然可以看到后来用`nvidia-smi`将内存分配给python. (5认同)
  • 最好的答案在这里 (2认同)
  • 似乎对我不起作用,当我将它设置为使用cpu时仍然使用gpu (2认同)

syg*_*ygi 20

根据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
Run Code Online (Sandbox Code Playgroud)

  • 我可以使用上面提到的方法在训练过程中将训练从gpu切换到cpu,然后用model.save将模型保存在其间,然后使用keras.models.load_model用不同的tf.device重新加载它.如果您想要训练然后在不同的设备上进行预测,则同样适用. (3认同)
  • 如何在Keras中使用Tensorflow作为后端,而不是使用Tensorflow来调用Keras层? (2认同)