私はKerasをTensorflowバックエンドとCUDAと共にインストールしました。私は時々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
また見なさい
これを行うには、かなり分離可能な方法を使用することです。
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
およびinter_op_parallelism_threads
を介して使用可能なCPUコアの数を設定します。
intra_op_parallelism_threads
変数は、計算グラフ内の単一ノード内の並列操作が使用できるスレッドの数(intra)を指定します。 inter_ops_parallelism_threads
変数は、計算グラフのノード間で並列操作にアクセス可能なスレッド数を定義します(inter)。
allow_soft_placement
は、以下の基準のいずれかが満たされている場合に、CPU上で操作を実行することを可能にします。
操作のためのGPU実装はありません
既知または登録済みのGPUデバイスがありません
cPUからの他の入力と同じ場所に配置する必要がある
これらすべては他の操作の前に私のクラスのコンストラクターで実行され、私が使用するモデルや他のコードから完全に分離可能です。
注:このオプションはGPUを使用するように指定されているため、これにはtensorflow-gpu
およびcuda
/cudnn
をインストールする必要があります。
参照:
これは私のために働きました(win10)、あなたがkerasをインポートする前の場所:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
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
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)
私はそれを理解するのにしばらく時間を費やしました。 Thomaの答えは完全ではありません。あなたのプログラムがtest.py
だとしたら、このプログラムを実行するのにgpu0を使い、他のgpusを解放したいと思うでしょう。
あなたはCUDA_VISIBLE_DEVICES=0 python test.py
を書くべきです
DEVICES
ではなくDEVICE
です。