Kann Keras mit Tensorflow-Backend gezwungen werden, nach Belieben CPU oder GPU zu verwenden?

96

Ich habe Keras mit dem Tensorflow-Backend und CUDA installiert. Ich möchte Keras manchmal auf Anfrage zwingen, CPU zu verwenden. Kann dies ohne die Installation eines separaten Tensorflow nur für die CPU in einer virtuellen Umgebung erfolgen? 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, auf die über Keras zugegriffen werden kann.

mikal94305
quelle

Antworten:

102

Wenn Sie Keras zur Verwendung der CPU zwingen möchten

Weg 1

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

bevor Keras / Tensorflow importiert wird.

Weg 2

Führen Sie Ihr Skript als aus

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Siehe auch

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/4613
Martin Thoma
quelle
19
Hat bei mir nicht funktioniert (Keras 2, Windows) - musste os.environ['CUDA_VISIBLE_DEVICES'] = '-1'wie in einer Antwort unten eingestellt werden
desertnaut
3
Auf welches Problem bezieht sich # 152? Ein Link wäre schön.
Martin R.
Ich sehe keinen Hinweis auf CUDA_DEVICE_ORDER=PCI_BUS_IDin Ausgabe # 152
Thawn
Ich bin in einem ipython3-Terminal und habe festgelegt import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , wie ich dies jetzt "rückgängig machen" kann. Ich möchte, dass Keras die GPU wieder verwendet.
Gabriel C
1
@ Gabriel C: Sie machen es rückgängig, indem Sie diese Zeilen löschen.
Martin Thoma
68

Eine ziemlich trennbare Möglichkeit, dies zu tun, ist die Verwendung

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 GPUund an CPU, ob wir unseren Code mit der GPU oder der CPU ausführen möchten, indem wir die Anzahl der GPUs und CPUs, auf die die Tensorflow-Sitzung zugreifen darf, genau definieren. Die Variablen num_GPUund num_CPUdefinieren diesen Wert. num_coresLegt dann die Anzahl der CPU-Kerne fest, die über intra_op_parallelism_threadsund zur Verwendung verfügbar sind inter_op_parallelism_threads.

Die intra_op_parallelism_threadsVariable bestimmt die Anzahl der Threads, die eine Paralleloperation in einem einzelnen Knoten im Berechnungsdiagramm verwenden darf (intra). Während die inter_ops_parallelism_threadsVariable die Anzahl der Threads definiert, auf die für parallele Operationen über die Knoten des Berechnungsgraphen (inter) zugegriffen werden kann.

allow_soft_placement ermöglicht die Ausführung von Operationen auf der CPU, wenn eines der folgenden Kriterien erfüllt ist:

  1. Es gibt keine GPU-Implementierung für den Vorgang

  2. Es sind keine GPU-Geräte bekannt oder registriert

  3. Es besteht die Notwendigkeit, sich mit anderen Eingängen der CPU zusammenzuschließen

All dies wird im Konstruktor meiner Klasse vor allen anderen Operationen ausgeführt und ist vollständig von jedem Modell oder anderen Code, den ich verwende, trennbar.

Hinweis: Dies erfordert tensorflow-gpuund cuda/ oder cudnnmuss installiert werden, da die Option zur Verwendung einer GPU angegeben ist.

Refs:

RACKGNOME
quelle
1
Dies ist eine gute Lösung, da nur das Definieren von "CUDA_VISIBLE_DEVICES" CUDA_ERROR_NO_DEVICE verursacht, gefolgt von vielen Diagnosen, bevor die Ausführung auf der CPU fortgesetzt wird. Obwohl ... beide Methoden funktionieren!
jsfa11
1
Dies ist die einzige konsistente Lösung, die für mich funktioniert. Komme immer wieder darauf zurück.
Authman Apatira
1
Können Sie bitte erklären, was die anderen Parameter bedeuten? wie allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN
beziehen sich die inter/ intra_op_parallelism_threadsauf CPU- oder GPU-Operationen?
Bluesummers
1
@ Bluesummers Sie beziehen sich auf CPU-Parallelisierung
RACKGNOME
57

Dies hat bei mir funktioniert (win10), bevor Sie Keras importieren:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Neuraleptisch
quelle
was macht das
KRazzy R
4
Erzwingt mit Win TF, die CPU zu verwenden und jede GPU zu ignorieren. Hatte kein Glück mit 0 oder leer, aber -1 schien den Trick zu tun.
Neuraleptic
1
Arbeitete an Win10 x64 für mich. Ich hatte auch kein Glück, 0 oder leer zu gewinnen und nur -1 hat funktioniert.
Cypher
4
Arbeitete für mich auf Ubuntu
TripleS
Ich habe zwei GPUs in meinem Computer. Wenn Sie 'CUDA_VISIBLE_DEVICES' = 0/1 setzen, bezieht sich dies auf die physische ID der verfügbaren GPUs. Wenn Sie den Wert auf -1 setzen, wird die CPU verwendet.
Prashanth Muthurajaiah
30

Importieren Sie einfach Tensortflow und verwenden Sie Keras, 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)
harshlal028
quelle
2
Die beste Antwort hier
xssChauhan
5
Als ich das einstellte tf.device('/cpu:0'), konnte ich immer noch sehen, dass Python später mit Speicher zugewiesen wurde nvidia-smi.
CMCDragonkai
@CMCDragonkai Löse es oder nicht ^ _ ^?
lhdgriver
4
Scheint auch nicht für mich zu funktionieren, verwendet immer noch GPU, wenn ich es auf CPU
Liyuan
Sollte nicht auch Modelldefinition und Kompilierung unter derselben ausgeführt werden with?
matt525252
22

Gemäß dem Keras- Tutorial können Sie einfach den gleichen tf.deviceBereich wie beim regulären Tensorflow verwenden:

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
Sygi
quelle
2
Wie kann dies in Keras mit Tensorflow als Backend durchgeführt werden, anstatt Tensorflow zum Aufrufen von Keras-Layern zu verwenden?
mikal94305
Ich verstehe deine Frage nicht. Der darin enthaltene Code withkann ein beliebiger Keras-Code sein.
Sygi
1
Wie kann dies mit einem trainierten Modell durchgeführt werden, das von der Festplatte geladen wird? Ich trainiere derzeit auf GPU, möchte aber anschließend auf CPU überprüfen
Ghostbust555
Ich denke nicht, dass diese Modelle austauschbar sind.
Sygi
3
Ich konnte das Training während des Trainings von GPU auf CPU umstellen, indem ich die oben genannte Methode verwendete, bei der ich das Modell zwischendurch mit model.save speichere und es dann mit keras.models.load_model mit einem anderen tf.device neu lade. Gleiches gilt, wenn Sie trainieren und dann auf einem anderen Gerät vorhersagen möchten.
TheLoneNut
3

Ich habe nur einige Zeit damit verbracht, es herauszufinden. Thomas Antwort ist nicht vollständig. test.pyAngenommen, Ihr Programm ist , Sie möchten gpu0 verwenden, um dieses Programm auszuführen, und andere gpus frei halten.

Du solltest schreiben CUDA_VISIBLE_DEVICES=0 python test.py

Beachten Sie, dass es DEVICESnicht istDEVICE

DDz
quelle
0

Für Personen, die an PyCharm arbeiten und die CPU erzwingen, können Sie in der Run / Debug-Konfiguration unter Umgebungsvariablen die folgende Zeile hinzufügen:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
Lerner
quelle