Tensorflowバックエンドを使用するKerasは、CPUまたはGPUを自由に使用するように強制できますか?


96

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

回答:


102

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

19
私(Keras 2、Windows)ではos.environ['CUDA_VISIBLE_DEVICES'] = '-1'
うまくいき

3
#152はどの問題を指しているのですか?リンクがいいです。
マーティンR.17年

私はへの参照が表示されない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:それらの行を削除して元に戻します。
Martin Thoma

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 GPUおよびCPUを使用して、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からの他の入力と同じ場所に配置する必要がある

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

注:GPUを使用するオプションが指定されているため、/ をインストールする必要がtensorflow-gpuあります。cudacudnn

参照:


1
"CUDA_VISIBLE_DEVICES"を定義するだけでCUDA_ERROR_NO_DEVICEが発生し、CPUでの実行を続ける前に多くの診断が続くため、これは優れたソリューションです。しかし...両方の方法が機能します!
jsfa11 2018年

1
これは、私にとって有効な唯一の一貫したソリューションです。戻ってきてください。
Authman Apatira

1
他のパラメータの意味を説明していただけますか?以下のようなallow_soft_placementintra_op_parallelism_threadsinter_op_parallelism_threads
Nagabhushan SN

されているinter/ intra_op_parallelism_threadsCPUやGPUの操作を参照してください?
bluesummers

1
@bluesummersそれらはCPUの並列化に関係しています
RACKGNOME

57

これは私のために働きました(win10)、ケラスをインポートする前に:

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

これは何をしますか?
kRazzy R 2018

4
Winでは、TFに強制的にCPUを使用させ、GPUを無視します。0または空白では運がなかったが、-1でうまくいくようだった。
ニューラルセプティック2018年

1
Win10 x64で作業しました。私はまた、0または空白で勝った運がなく、-1しか機能しませんでした。
2018

4
Ubuntuで私のために働いた
TripleS 2018

マシンに2つのGPUがあり、「CUDA_VISIBLE_DEVICES」を0/1に設定すると、使用可能なGPUの物理IDが参照されます。-1に設定するとCPUを使用します。
Prashanth Muthurajaiah

30

tensortflowをインポートしてケラを使用するだけで、とても簡単です。

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 2018

@CMCDragonkai解決するかどうか^ _ ^?
lhdgriver

4
私にとっても動作しないようですが、cpuを使用するように設定した場合でもgpuを使用します
liyuan

同じでモデル定義とコンパイルも実行すべきではありませんwithか?
matt525252

22

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

2
これは、Tensorflowを使用してKerasレイヤーを呼び出すのではなく、TensorflowをバックエンドとしてKeras内でどのように実行できますか?
mikal94305 2016年

質問が理解できません。内部のコードwithは任意のKerasコードにすることができます。
sygi

1
ディスクからロードされたトレーニング済みモデルでこれをどのように行うことができますか?私は現在gpuでトレーニングしていますが、後でCPUで確認したいと思います
ghostbust555

これらのモデルは交換可能ではないと思います。
sygi

3
上記のメソッドを使用してトレーニングの途中でトレーニングをgpuからcpuに切り替えることができました。その場合、model.saveを使用してモデルを保存し、keras.models.load_modelを使用して別のtf.deviceで再ロードします。トレーニングして別のデバイスで予測する場合も同様です。
TheLoneNut

3

私はそれを理解するのに少し時間を費やしました。トマの答えは完全ではありません。test.pyたとえば、プログラムがで、gpu0を使用してこのプログラムを実行し、他のgpusを解放したいとします。

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

DEVICESないことに注意してくださいDEVICE


0

PyCharmで作業していて、CPUを強制している人のために、実行/デバッグ構成の環境変数の下に次の行を追加できます。

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.