是否可以强制带有Tensorflow后端的Keras随意使用CPU或GPU?

7z5jn7bk  于 2022-11-13  发布在  其他
关注(0)|答案(8)|浏览(253)

我安装了Keras和Tensorflow后端以及CUDA。有时候我希望根据需要强制Keras使用CPU。如果不需要在虚拟环境中安装单独的仅使用CPU的Tensorflow,是否可以做到这一点?如果可以,该如何操作?如果后端是Theano,则可以设置标记,但我从未听说过可以通过Keras访问Tensorflow标记。

k75qkfdt

k75qkfdt1#

如果要强制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
to94eoyn

to94eoyn2#

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

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

bqjvbblv3#

一种比较独立的方法是使用

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)

这里,用booleansCPU,我们通过严格定义Tensorflow会话允许访问的GPU和CPU的数量来指示是使用GPU还是CPU运行代码。变量num_GPUnum_CPU定义了该值。然后,num_cores通过intra_op_parallelism_threadsinter_op_parallelism_threads设置可供使用的CPU内核数。
intra_op_parallelism_threads变量规定了计算图中单个节点中的并行操作允许使用的线程数(内部),而inter_ops_parallelism_threads变量定义了跨计算图节点的并行操作可访问的线程数(内部)。
allow_soft_placement允许在满足以下任一条件的情况下在CPU上运行操作:
1.该操作没有GPU实现
1.没有已知或注册的GPU设备
1.需要与来自CPU的其他输入协同定位
所有这些都是在我的类的构造函数中执行的,在任何其他操作之前,并且与我使用的任何模型或其他代码完全分离。
注意:这需要安装tensorflow-gpucuda/cudnn,因为提供了使用GPU的选项。
参考文献:

yduiuuwa

yduiuuwa4#

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

1bqhqjot5#

根据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
46qrfjad

46qrfjad6#

我只是花了一些时间才弄明白。托马斯的答案并不完整。假设你的程序是test.py,你想使用gpu0来运行这个程序,并保持其他gpus的自由。
您应该写入CUDA_VISIBLE_DEVICES=0 python test.py
请注意,它是DEVICES,而不是DEVICE

xoshrz7s

xoshrz7s7#

对于使用PyCharm的人,为了强制使用CPU,您可以在Run/Debug配置中的Environment variables下添加下面的行:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
ufj5ltwl

ufj5ltwl8#

要禁用在GPU上运行(tensor flow 2.9),请使用tf.config.set_visible_devices([], 'GPU')。空列表参数表示在此运行中将没有可见的GPU。
在代码的早期执行此操作,例如在Keras初始化tf配置之前。
参见文档https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/config/set_visible_devices

相关问题