web-dev-qa-db-ja.com

Tensorflowバックエンドを持つKerasは、意のままにCPUまたはGPUを使用することを強制されることができますか?

私はKerasをTensorflowバックエンドとCUDAと共にインストールしました。私は時々KerasにCPUの使用を強制したいです。これは、仮想環境にCPU専用のTensorflowを別にインストールしなくても実行できますか?もしそうならどうですか?バックエンドがTheanoの場合、フラグを設定することができますが、Kerasからアクセス可能なTensorflowフラグを聞いたことはありません。

77
mikal94305

KerasにCPU使用を強制したい場合

方法1

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"   # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""

keras/Tensorflowがインポートされる前に。

方法2

としてスクリプトを実行します。

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

また見なさい

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

これを行うには、かなり分離可能な方法を使用することです。

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)

ここでは、booleansGPUCPUで、TensorflowセッションがアクセスできるGPUとCPUの数を厳密に定義することによって、コードをGPUとCPUのどちらで実行するかを示します。変数num_GPUnum_CPUはこの値を定義します。次にnum_coresは、intra_op_parallelism_threadsおよびinter_op_parallelism_threadsを介して使用可能なCPUコアの数を設定します。

intra_op_parallelism_threads変数は、計算グラフ内の単一ノード内の並列操作が使用できるスレッドの数(intra)を指定します。 inter_ops_parallelism_threads変数は、計算グラフのノード間で並列操作にアクセス可能なスレッド数を定義します(inter)。

allow_soft_placementは、以下の基準のいずれかが満たされている場合に、CPU上で操作を実行することを可能にします。

  1. 操作のためのGPU実装はありません

  2. 既知または登録済みのGPUデバイスがありません

  3. cPUからの他の入力と同じ場所に配置する必要がある

これらすべては他の操作の前に私のクラスのコンストラクターで実行され、私が使用するモデルや他のコードから完全に分離可能です。

注:このオプションはGPUを使用するように指定されているため、これにはtensorflow-gpuおよびcuda/cudnnをインストールする必要があります。

参照:

58
RACKGNOME

これは私のために働きました(win10)、あなたがkerasをインポートする前の場所:

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

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
18
sygi

Tenortflowをインポートして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)
17
harshlal028

私はそれを理解するのにしばらく時間を費やしました。 Thomaの答えは完全ではありません。あなたのプログラムがtest.pyだとしたら、このプログラムを実行するのにgpu0を使い、他のgpusを解放したいと思うでしょう。

あなたはCUDA_VISIBLE_DEVICES=0 python test.pyを書くべきです

DEVICESではなくDEVICEです。

3
DDz