簡體   English   中英

可以強制使用 Tensorflow 后端的 Keras 隨意使用 CPU 或 GPU 嗎?

[英]Can Keras with Tensorflow backend be forced to use CPU or GPU at will?

我安裝了帶有 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

另見

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

這樣做的一個相當可分離的方法是使用

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_threadsinter_op_parallelism_threads設置可使用的 CPU 內核數。

intra_op_parallelism_threads變量指示允許計算圖中單個節點中的並行操作(內部)使用的線程數。 inter_ops_parallelism_threads變量定義了跨計算圖(inter)節點的並行操作可訪問的線程數。

如果滿足以下任一條件, allow_soft_placement允許在 CPU 上運行操作:

  1. 該操作沒有 GPU 實現

  2. 沒有已知或注冊的 GPU 設備

  3. 需要與來自 CPU 的其他輸入一起定位

所有這些都在我的類的構造函數中在任何其他操作之前執行,並且與我使用的任何模型或其他代碼完全分離。

注意:這需要安裝tensorflow-gpucuda / cudnn ,因為提供了使用 GPU 的選項。

參考:

這對我有用(win10),在導入 keras 之前放置:

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

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

根據 keras 教程,您可以簡單地使用與常規張量流相同的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

我只是花了一些時間才弄清楚。 托馬的回答並不完整。 假設你的程序是test.py ,你想使用 gpu0 來運行這個程序,並保持其他 gpus 空閑。

你應該寫CUDA_VISIBLE_DEVICES=0 python test.py

注意是DEVICES不是DEVICE

對於使用 PyCharm 和強制 CPU 的人員,您可以在運行/調試配置中的環境變量下添加以下行:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM