Чи можна Keras із серверною базою Tensorflow змусити використовувати CPU або GPU за власним бажанням?


96

У мене встановлено Keras із серверною базою Tensorflow та CUDA. Я хотів би іноді на вимогу змусити Keras використовувати центральний процесор. Чи можна це зробити, не кажучи вже про встановлення окремого процесора Tensorflow у віртуальному середовищі? Якщо так, то як? Якби заднім був Theano, прапори можна було б встановити, але я не чув про прапори Tensorflow, доступні через Керас.

Відповіді:


102

Якщо ви хочете змусити Keras використовувати процесор

Шлях 1

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

до імпорту Keras / Tensorflow

Шлях 2

Запустіть свій сценарій як

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Дивитися також

  1. https://github.com/keras-team/keras/isissue/152
  2. https://github.com/fchollet/keras/isissue/4613

19
Не працювало для мене (Keras 2, Windows) - довелося встановити, os.environ['CUDA_VISIBLE_DEVICES'] = '-1'як у відповіді нижче
пустельний

3
На яке питання йдеться № 152? Посилання було б непогано.
Martin R.

Я не бачу жодних посилань на CUDA_DEVICE_ORDER=PCI_BUS_IDвипуск № 152
Таун

Я перебуваю в терміналі ipython3, і я встановив import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , тепер як це "скасувати"? Я хотів би, щоб Keras знову використовував графічний процесор.
Габріель С

1
@Gabriel C: ви скасуєте це, видаливши ці рядки.
Мартін Тома,

68

Досить відокремлений спосіб зробити це - використовувати

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. Змінні num_GPUі num_CPUвизначають це значення. num_coresпотім встановлює кількість ядер процесора, доступних для використання через intra_op_parallelism_threadsта inter_op_parallelism_threads.

У intra_op_parallelism_threadsдиктує змінне число потоків паралельної роботи в одному вузлі в графі обчислення допускається використання (всередині). Тоді як inter_ops_parallelism_threadsзмінна визначає кількість потоків, доступних для паралельних операцій по вузлах обчислювального графіка (inter).

allow_soft_placement дозволяє виконувати операції над процесором, якщо виконується будь-який з наступних критеріїв:

  1. для операції немає реалізації графічного процесора

  2. немає відомих або зареєстрованих пристроїв графічного процесора

  3. існує необхідність спільного пошуку з іншими входами від центрального процесора

Все це виконується в конструкторі мого класу перед будь-якими іншими операціями і повністю відокремлюється від будь-якої моделі чи іншого коду, який я використовую.

Примітка. Це вимагає tensorflow-gpuта cuda/ cudnnбути встановленим, оскільки надається можливість використовувати GPU.

Посилання:


1
Це приємне рішення, оскільки саме визначення "CUDA_VISIBLE_DEVICES" спричиняє CUDA_ERROR_NO_DEVICE з подальшим рядом діагностики, перш ніж продовжувати виконувати на процесорі. Хоча ... обидва методи працюють!
jsfa11

1
Це єдине послідовне рішення, яке працює для мене. Продовжуйте повертатися до цього.
Автман Апатіра

1
Чи можете ви поясніть, що означають інші параметри? як allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN

є inter/ intra_op_parallelism_threadsпосилаються на операції процесора або графічного процесора?
Блюз-Леті

1
@bluesummers Вони стосуються паралелізації процесора
RACKGNOME

57

Це спрацювало для мене (win10), місце до того, як імпортувати кери:

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

що це робить?
kRazzy R

4
За допомогою Win примушує TF використовувати центральний процесор та ігнорувати будь-який графічний процесор. Не пощастило з 0 або порожнім, але, здавалося, -1 зробив трюк.
Нейралептик

1
Працював на Win10 x64 для мене. Я також не мав удачі виграти 0 або порожній і працював лише -1.
Сайфер

4
Працював у мене на Ubuntu
TripleS

У мене в машині два GPU, налаштування 'CUDA_VISIBLE_DEVICES' = 0/1 посилається на фізичний ідентифікатор наявних GPU. Встановлення значення -1 використовує центральний процесор.
Прашант Мутураджая

30

Просто імпортуйте тензорпотік і використовуйте кери - це так просто.

import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
    model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)

2
Найкраща відповідь тут
xssChauhan

5
Коли я встановив tf.device('/cpu:0'), я все ще міг бачити, як пізніше виділяється пам'ять для python nvidia-smi.
CMCDragonkai,

@CMCDragonkai Розв’яжи це чи ні ^ _ ^?
lhdgriver

4
Мабуть, не працює і для мене, але все ще використовує gpu, коли я встановив його для використання процесора
liyuan

Чи не слід також визначати модель і компілювати, виконані під одним і тим же with?
matt525252

22

Відповідно до підручника кераса , ви можете просто використовувати ту саму 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

2
Як це можна зробити в Keras із Tensorflow як серверною системою, а не за допомогою Tensorflow для виклику шарів Keras?
mikal94305

Я не розумію вашого запитання. Код всередині withможе бути будь-яким кодом Кераса.
сигі

1
Як це можна зробити за допомогою навченої моделі, завантаженої з диска? На даний момент я тренуюсь на GPU, але хочу перевірити потім на центральному процесорі
ghostbust555,

Я не думаю, що ці моделі взаємозамінні.
sygi

3
Мені вдалося переключити навчання з gpu на cpu в середині навчання, використовуючи вищезазначений метод, коли я зберігаю модель між тим, як model.save, а потім перезавантажую її іншим tf.device, використовуючи keras.models.load_model. Це ж стосується, якщо ви хочете тренуватися, то прогнозуйте на іншому пристрої.
TheLoneNut

3

Я просто витратив деякий час, щоб це зрозуміти. Відповідь Томи не є повною. Скажімо, ваша програма полягає в тому test.py, що ви хочете використовувати gpu0 для запуску цієї програми, а інші gpus безкоштовні.

Вам слід написати CUDA_VISIBLE_DEVICES=0 python test.py

Зауважте, що це DEVICESне такDEVICE


0

Для людей, які працюють на PyCharm та для примушування процесора, ви можете додати наступний рядок у конфігурації Запуск / Налагодження у розділі Змінні середовища:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.