Можно ли заставить Keras с бэкэндом Tensorflow по желанию использовать CPU или GPU?

97

У меня установлен Keras с серверной частью Tensorflow и CUDA. Я бы хотел, чтобы иногда по требованию Keras использовал CPU. Можно ли это сделать без установки отдельного Tensorflow только для ЦП в виртуальной среде? Если да, то как? Если бы бэкэнд был Theano, флаги можно было бы установить, но я не слышал о флагах Tensorflow, доступных через Keras.

mikal94305
источник

Ответы:

103

Если вы хотите заставить Keras использовать CPU

Способ 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/issues/152
  2. https://github.com/fchollet/keras/issues/4613
Мартин Тома
источник
20
Не сработало для меня (Keras 2, Windows) - пришлось установить, os.environ['CUDA_VISIBLE_DEVICES'] = '-1'как в ответе ниже
desertnaut
3
О каком выпуске идет речь в № 152? Ссылка была бы хороша.
Martin R.
Я не вижу упоминаний CUDA_DEVICE_ORDER=PCI_BUS_IDв выпуске № 152
Thawn
Я нахожусь в терминале ipython3, и я установил import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , как мне «отменить» это? Я бы хотел, чтобы Керас снова использовал графический процессор.
Gabriel C
@MartinThoma Я имею в виду, что, не покидая ipython, у меня было много работ, поэтому я хотел бы вернуться к среде с поддержкой GPU. Я тщетно пытался удалить ключи в словаре os.environ.
Gabriel C
69

Достаточно отдельный способ сделать это - использовать

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. нет реализации на GPU для операции

  2. нет известных или зарегистрированных устройств GPU

  3. необходимо совмещать с другими входами ЦП

Все это выполняется в конструкторе моего класса перед любыми другими операциями и полностью отделимо от любой модели или другого кода, который я использую.

Примечание. Для этого требуется установка tensorflow-gpuи cuda/ cudnn, поскольку предоставляется возможность использовать графический процессор.

Ссылки:

РЕКГНОМ
источник
1
Это хорошее решение, поскольку простое определение «CUDA_VISIBLE_DEVICES» вызывает CUDA_ERROR_NO_DEVICE, за которым следует большое количество диагностических сообщений, прежде чем продолжить выполнение на ЦП. Хотя ... работают оба метода!
jsfa11
1
Это единственное последовательное решение, которое мне подходит. Продолжайте возвращаться к этому.
Authman Apatira
1
Не могли бы вы объяснить, что означают другие параметры? как allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN
являются inter/ intra_op_parallelism_threadsсм CPU или GPU операций?
bluesummers
1
@bluesummers Они относятся к распараллеливанию ЦП
RACKGNOME
61

Это сработало для меня (win10), поместите перед импортом keras:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Нейролептик
источник
что это делает?
kRazzy R
4
С Win заставляет TF использовать ЦП и игнорировать любой графический процессор. Не повезло с 0 или пробелом, но -1, похоже, помогло.
Neuraleptic
1
У меня работал на Win10 x64. Мне также не повезло, выиграл 0 или пусто, и только -1 сработало.
Cypher
4
Работал у меня на Ubuntu
TripleS
У меня есть два графических процессора на моем компьютере, установка «CUDA_VISIBLE_DEVICES» = 0/1 относится к физическому идентификатору доступных графических процессоров. Установка его в -1 использует CPU.
Прашант Мутураджайя
31

Просто импортируйте tensortflow и используйте keras, это так просто.

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
источник
2
Лучший ответ здесь
xssChauhan
5
Когда я установил tf.device('/cpu:0'), я все еще мог видеть, что память выделяется для Python позже с помощью nvidia-smi.
CMCDragonkai
@CMCDragonkai Решить или нет ^ _ ^?
lhdgriver
4
Похоже, у меня тоже не работает, по-прежнему использует
графический
Не должны ли также выполняться определение модели и компиляция под тем же with?
matt525252
23

В соответствии с руководством по keras вы можете просто использовать ту же 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
Sygi
источник
2
Как это можно сделать в Keras с Tensorflow в качестве бэкэнда, вместо того, чтобы использовать Tensorflow для вызова слоев Keras?
mikal94305
Я не понимаю вашего вопроса. Код внутри withможет быть любым кодом Keras.
sygi
1
Как это можно сделать с помощью обученной модели, загруженной с диска? В настоящее время я тренируюсь на
графическом
3
Я смог переключить обучение с gpu на cpu в середине обучения, используя вышеупомянутый метод, в котором я сохраняю модель между ними с помощью model.save, а затем перезагружаю ее с помощью другого tf.device с помощью keras.models.load_model. То же самое применимо, если вы хотите тренироваться, а затем прогнозировать на другом устройстве.
TheLoneNut 05
3

Я просто потратил некоторое время на то, чтобы понять это. Ответ Тома неполный. Допустим, ваша программа test.pyхочет использовать gpu0 для запуска этой программы и оставить другие графические процессоры бесплатными.

Ты должен написать CUDA_VISIBLE_DEVICES=0 python test.py

Обратите внимание, это DEVICESнеDEVICE

DDz
источник
0

Для людей, работающих с PyCharm, и для форсирования ЦП вы можете добавить следующую строку в конфигурацию Run / Debug в разделе Environment variables:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
ученик
источник