Tensorflow后端的Keras能否被迫随意使用CPU或GPU?


96

我安装了Tensorflow后端和CUDA的Keras。我有时想按需强迫Keras使用CPU。不用说在虚拟环境中安装单独的仅CPU的Tensorflow就能做到吗?如果可以,怎么办?如果后端是Theano,则可以设置标志,但是我还没有听说过可以通过Keras访问Tensorflow标志。

Answers:


102

如果要强制Keras使用CPU

方式1

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

也可以看看

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

19
不适用于我(Keras 2,Windows)-必须os.environ['CUDA_VISIBLE_DEVICES'] = '-1'按照下面的答案进行设置
-desertnaut

3
#152指的是什么问题?链接会很好。
Martin R.

我没有看到CUDA_DEVICE_ORDER=PCI_BUS_ID有关问题#152的任何参考
-Thawn

我在ipython3终端中,已经设置好了 import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" ,现在如何“撤消”呢?我希望Keras再次使用GPU。
加布里埃尔C

1
@Gabriel C:您可以通过删除这些行来撤消它。
马丁·托马

68

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

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 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变量定义了跨计算图节点(并行)进行并行操作可访问的线程数。

allow_soft_placement 如果满足以下任一条件,则允许在CPU上运行操作:

  1. 该操作没有GPU实现

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

  3. 需要与CPU的其他输入一起放置

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

注意:这要求tensorflow-gpucuda/ cudnn要安装,因为提供了使用GPU的选项。

参考:


1
这是一个很好的解决方案,因为仅定义“ CUDA_VISIBLE_DEVICES”会导致CUDA_ERROR_NO_DEVICE,然后进行大量诊断,然后继续在CPU上执行。虽然...两种方法都可以!
jsfa11

1
这是唯一适用于我的一致解决方案。继续回到它。
Authman Apatira

1
您能解释一下其他参数是什么意思吗?喜欢allow_soft_placementintra_op_parallelism_threadsinter_op_parallelism_threads
Nagabhushan SN

是的inter/ intra_op_parallelism_threads是指CPU或GPU操作?
bluesummers

1
@bluesummers它们与CPU并行化有关
RACKGNOME

57

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

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

这是做什么的?
kRazzy R

4
使用Win,强制TF使用CPU并忽略任何GPU。运气不是0或空白,但是-1似乎可以解决问题。
神经过敏症

1
为我工作在Win10 x64上。我也没有运气赢0或空白,只有-1起作用。
Cypher

4
在Ubuntu上为我工作
TripleS

我的计算机中有两个GPU,设置'CUDA_VISIBLE_DEVICES'= 0/1是指可用GPU的物理ID。将其设置为-1将使用CPU。
Prashanth Muthurajaiah

30

只需导入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)

2
最好的答案在这里
xssChauhan

5
设置时tf.device('/cpu:0'),我仍然可以看到稍后使用分配给python的内存nvidia-smi
CMCDragonkai

@CMCDragonkai解决问题^ _ ^?
lhdgriver

4
似乎对我也不起作用,当我将其设置为使用cpu时仍会使用gpu
liyuan 18-10-15

难道模型定义和编译也不应该在同一条件下执行with吗?
matt525252

22

按照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

2
如何在Tensorflow作为后端的Keras中完成此工作,而不是使用Tensorflow调用Keras层?
mikal94305 '16

我不明白你的问题。里面的代码with可以是任何Keras代码。
sygi '16

1
如何从磁盘加载经过训练的模型来完成?我目前正在使用gpu进行培训,但之后想在CPU上进行验证
ghostbust555

我认为这些模型不可互换。
sygi '16

3
通过使用上面提到的方法,我可以在训练过程中将训练从gpu切换到cpu,在该方法中,我将模型保存在model.save之间,然后使用keras.models.load_model将其重新加载到其他tf.device中。如果要训练然后在其他设备上进行预测,则同样适用。
TheLoneNut

3

我只是花了一些时间弄清楚。Thoma的答案不完整。假设您的程序是test.py,您想使用gpu0来运行该程序,并使其他gpus保持空闲。

你应该写 CUDA_VISIBLE_DEVICES=0 python test.py

注意DEVICES不是DEVICE


0

对于从事PyCharm并强制使用CPU的人员,您可以在“运行/调试”配置的“环境变量”下添加以下行:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.