web-dev-qa-db-de.com

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

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.

83
mikal94305

Wenn Sie Keras zwingen möchten, die CPU zu verwenden

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/461
89
Martin Thoma

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 booleansGPU 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:

  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, 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:

63
RACKGNOME

Dies funktionierte für mich (win10), platziere bevor du Keras importierst:

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

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)
21
harshlal028

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
20
sygi

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

3
DDz