Ich habe Keras mit dem Tensorflow-Backend und CUDA installiert. Ich möchte Keras manchmal auf Anforderung zwingen, CPU zu verwenden. Ist dies möglich, ohne einen separaten Tensorflow nur für die CPU in einer virtuellen Umgebung zu installieren? Wenn das so ist, wie? Wenn das Backend Theano wäre, könnten die Flags gesetzt werden, aber ich habe noch nichts von Tensorflow-Flags gehört, die über Keras erreichbar sind.
Wenn Sie Keras zwingen möchten, die CPU zu verwenden
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
bevor Keras/Tensorflow importiert wird.
Führen Sie Ihr Skript als aus
$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py
Siehe auch
Ein ziemlich trennbarer Weg, dies zu tun, ist zu verwenden
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)
Hier geben wir mit booleans
GPU
und CPU
an, ob wir unseren Code mit der GPU oder der CPU ausführen möchten, indem wir die Anzahl der GPUs und CPUs in der Tensorflow-Sitzung genau definieren darf zugreifen. Die Variablen num_GPU
Und num_CPU
Definieren diesen Wert. num_cores
Legt dann die Anzahl der für die Verwendung verfügbaren CPU-Kerne über intra_op_parallelism_threads
Und inter_op_parallelism_threads
Fest.
Die Variable intra_op_parallelism_threads
Gibt die Anzahl der Threads an, die eine parallele Operation in einem einzelnen Knoten im Berechnungsdiagramm verwenden darf (intra). Während die Variable inter_ops_parallelism_threads
Die Anzahl der Threads definiert, auf die für parallele Operationen über die Knoten des Berechnungsgraphen (inter) zugegriffen werden kann.
Mit allow_soft_placement
Können Operationen auf der CPU ausgeführt werden, wenn eines der folgenden Kriterien erfüllt ist:
es gibt keine GPU-Implementierung für den Vorgang
es sind keine GPU-Geräte bekannt oder registriert
es besteht die Notwendigkeit, zusammen mit anderen Eingängen von der CPU zu lokalisieren
All dies wird im Konstruktor meiner Klasse vor allen anderen Operationen ausgeführt und kann vollständig von jedem Modell oder anderem Code, den ich verwende, getrennt werden.
Hinweis: Hierfür müssen tensorflow-gpu
Und cuda
/cudnn
installiert sein, da die Option zur Verwendung einer GPU angegeben ist.
Refs:
Dies funktionierte für mich (win10), platziere bevor du Keras importierst:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Einfach Tensortflow importieren und Keras verwenden, so einfach ist das.
import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
Gemäß Keras Tutorial können Sie einfach das gleiche tf.device
Umfang wie beim regulären Tensorflow:
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
Ich habe nur einige Zeit damit verbracht, es herauszufinden. Die Antwort von Thoma ist nicht vollständig. Angenommen, Ihr Programm ist test.py
, Sie möchten gpu0 verwenden, um dieses Programm auszuführen und andere gpus frei zu halten.
Sie sollten schreiben CUDA_VISIBLE_DEVICES=0 python test.py
Beachten Sie, dass es DEVICES
nicht DEVICE
ist