Czy Keras z zapleczem Tensorflow może być zmuszony do korzystania z procesora lub karty graficznej w dowolnym momencie?

96

Mam zainstalowany Keras z zapleczem Tensorflow i CUDA. Chciałbym czasami na żądanie zmusić Keras do korzystania z procesora. Czy można to zrobić bez, powiedzmy, instalowania oddzielnego Tensorflow z samym procesorem w środowisku wirtualnym? Jeśli tak to jak? Gdyby backendem był Theano, flagi można by ustawić, ale nie słyszałem o flagach Tensorflow dostępnych przez Keras.

mikal94305
źródło

Odpowiedzi:

102

Jeśli chcesz zmusić Keras do używania procesora

Sposób 1

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

przed zaimportowaniem Keras / Tensorflow.

Sposób 2

Uruchom skrypt jako

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Zobacz też

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/4613
Martin Thoma
źródło
19
U mnie nie działało (Keras 2, Windows) - musiałem ustawić os.environ['CUDA_VISIBLE_DEVICES'] = '-1'jak w odpowiedzi poniżej
desertnaut
3
Do jakiego problemu odnosi się # 152? Link byłby fajny.
Martin R.
Nie widzę żadnej wzmianki o CUDA_DEVICE_ORDER=PCI_BUS_IDnumerze 152
Odwilż
Jestem w terminalu ipython3 i ustawiłem import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , jak teraz mogę to „cofnąć”? Chciałbym, aby Keras ponownie użył GPU.
Gabriel C
1
@Gabriel C: cofasz to, usuwając te linie.
Martin Thoma
68

Dość oddzielnym sposobem na to jest użycie

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)

Tutaj, za pomocą booleans GPUi CPU, wskazujemy, czy chcielibyśmy uruchamiać nasz kod na GPU lub CPU, sztywno określając liczbę GPU i procesorów, do których sesja Tensorflow ma dostęp. Zmienne num_GPUi num_CPUdefiniują tę wartość. num_coresnastępnie ustawia liczbę rdzeni procesora dostępnych do użycia za pośrednictwem intra_op_parallelism_threadsi inter_op_parallelism_threads.

W intra_op_parallelism_threadsdyktuje zmienna liczba nici równolegle pracy w jednym węźle wykresu obliczeniowego jest dozwolony do zastosowania (wewnątrz). Podczas gdy inter_ops_parallelism_threadszmienna definiuje liczbę wątków dostępnych dla operacji równoległych w węzłach grafu obliczeniowego (inter).

allow_soft_placement umożliwia wykonywanie operacji na CPU, jeśli spełnione jest którekolwiek z poniższych kryteriów:

  1. nie ma implementacji GPU dla tej operacji

  2. nie są znane ani zarejestrowane żadne urządzenia GPU

  3. istnieje potrzeba kolokacji z innymi wejściami z CPU

Wszystko to jest wykonywane w konstruktorze mojej klasy przed innymi operacjami i można je całkowicie oddzielić od dowolnego modelu lub innego kodu, którego używam.

Uwaga: wymaga to zainstalowania tensorflow-gpui cuda/ cudnndo zainstalowania, ponieważ istnieje opcja korzystania z GPU.

Odniesienia:

RACKGNOME
źródło
1
Jest to fajne rozwiązanie, ponieważ samo zdefiniowanie „CUDA_VISIBLE_DEVICES” powoduje, że CUDA_ERROR_NO_DEVICE, po którym następuje wiele diagnostyki przed kontynuowaniem wykonywania na CPU. Chociaż ... obie metody działają!
jsfa11
1
To jedyne spójne rozwiązanie, które działa dla mnie. Wracaj do tego.
Authman Apatira
1
Czy możesz wyjaśnić, co oznaczają inne parametry? jak allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN
czy inter/ intra_op_parallelism_threadsodnoszą się do operacji CPU lub GPU?
bluesummers
1
@bluesummers Dotyczą one równoległości procesora
RACKGNOME
59

To zadziałało dla mnie (win10), umieść przed importem keras:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Neuraleptyk
źródło
co to robi?
kRazzy R
4
Z Win zmusza TF do używania procesora i ignorowania dowolnego GPU. Nie miałem szczęścia z 0 lub pustym miejscem, ale wydaje się, że -1 załatwiło sprawę.
Neuraleptic
1
Pracował dla mnie na Win10 x64. Nie miałem też szczęścia, wygrywając 0 lub puste, a tylko -1 działało.
Cypher,
4
Pracował dla mnie na Ubuntu
TripleS
Mam dwa procesory GPU na moim komputerze, ustawienie „CUDA_VISIBLE_DEVICES” = 0/1 odnosi się do fizycznego identyfikatora dostępnych procesorów graficznych. Ustawienie wartości -1 zużywa procesor.
Prashanth Muthurajaiah
30

Po prostu zaimportuj tensortflow i użyj keras, to takie proste.

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
źródło
2
Najlepsza odpowiedź tutaj
xssChauhan
5
Kiedy ustawiłem tf.device('/cpu:0'), nadal widziałem, jak pamięć jest przydzielana do Pythona później za pomocą nvidia-smi.
CMCDragonkai
@CMCDragonkai Rozwiąż czy nie ^ _ ^?
lhdgriver
4
Wydaje się, że dla mnie też nie działa, nadal używa GPU, gdy
ustawię
Czy nie powinno się również wykonywać definicji modelu i kompilacji w ramach tego samego with?
matt525252
22

Zgodnie z tutorialem keras , możesz po prostu użyć tego samego tf.devicezakresu, co w zwykłym 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
sygi
źródło
2
Jak można to zrobić w Keras z Tensorflow jako zapleczem, zamiast używać Tensorflow do wywoływania warstw Keras?
mikal94305
Nie rozumiem twojego pytania. Kod wewnątrz withmoże być dowolnym kodem Keras.
sygi
1
Jak można to zrobić z wytrenowanym modelem załadowanym z dysku? Obecnie trenuję na GPU, ale chcę później zweryfikować na CPU
ghostbust555
3
Udało mi się przełączyć trening z gpu na cpu w środku treningu, używając wyżej wymienionej metody, w której zapisuję model pomiędzy z model.save, a następnie przeładowuję go z innym tf.device przy użyciu keras.models.load_model. To samo dotyczy sytuacji, gdy chcesz trenować, a następnie przewidywać na innym urządzeniu.
TheLoneNut
3

Po prostu spędziłem trochę czasu, aby to rozgryźć. Odpowiedź Thomy nie jest pełna. Załóżmy, że Twój program jest taki test.py, że chcesz używać gpu0 do uruchamiania tego programu, a pozostałe procesory GPU będą wolne.

Powinieneś napisać CUDA_VISIBLE_DEVICES=0 python test.py

Zauważ, że tak DEVICESnie jestDEVICE

DDz
źródło
0

W przypadku osób pracujących nad PyCharm i do wymuszania procesora można dodać następujący wiersz w konfiguracji Uruchom / debugowanie w obszarze Zmienne środowiskowe:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
uczeń
źródło