回答:
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
こちらもご覧ください
CUDA_DEVICE_ORDER=PCI_BUS_ID
問題の#152で
import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = ""
、これを「元に戻す」にはどうすればよいですか?Kerasに再度GPUを使用してもらいたい。
これを行うためのかなり分離可能な方法は、使用することです
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_GPU
とnum_CPU
は、この値を定義します。num_cores
次に、intra_op_parallelism_threads
およびを介して使用できるCPUコアの数を設定しますinter_op_parallelism_threads
。
intra_op_parallelism_threads
変数おもむくは、スレッドの数の計算グラフ内の単一のノードで並列動作を使用(イントラ)を許可されています。ながらinter_ops_parallelism_threads
変数は、計算グラフ(インター)のノード間で並列動作のためにアクセス可能なスレッドの数を定義します。
allow_soft_placement
次の基準のいずれかが満たされた場合に、CPUで操作を実行できるようにします。
操作のためのGPU実装はありません
既知または登録されているGPUデバイスはありません
CPUからの他の入力と同じ場所に配置する必要がある
これはすべて、他の操作の前にクラスのコンストラクターで実行され、モデルや他のコードから完全に分離できます。
注:GPUを使用するオプションが指定されているため、/ をインストールする必要がtensorflow-gpu
あります。cuda
cudnn
参照:
allow_soft_placement
、intra_op_parallelism_threads
、inter_op_parallelism_threads
inter
/ intra_op_parallelism_threads
CPUやGPUの操作を参照してください?
これは私のために働きました(win10)、ケラスをインポートする前に:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
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)
tf.device('/cpu:0')
、後ででPythonにメモリが割り当てられているのを確認できましたnvidia-smi
。
with
か?
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
with
は任意のKerasコードにすることができます。
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'