O Keras com back-end Tensorflow pode ser forçado a usar CPU ou GPU à vontade?


96

Eu tenho o Keras instalado com o back-end Tensorflow e CUDA. Às vezes, eu gostaria de forçar Keras a usar a CPU. Isso pode ser feito sem dizer instalar um Tensorflow separado apenas de CPU em um ambiente virtual? Se sim, como? Se o backend fosse Theano, os sinalizadores poderiam ser definidos, mas eu não ouvi falar dos sinalizadores do Tensorflow acessíveis via Keras.

Respostas:


102

Se você quiser forçar Keras a usar CPU

Caminho 1

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

antes de importar o Keras / Tensorflow.

Caminho 2

Execute seu script como

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Veja também

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

19
Não funcionou para mim (Keras 2, Windows) - teve que definir os.environ['CUDA_VISIBLE_DEVICES'] = '-1'como na resposta abaixo
— desertnaut

3
A que problema se refere o nº 152? Um link seria bom.
— Martin R.

Não vejo nenhuma referência CUDA_DEVICE_ORDER=PCI_BUS_IDna edição nº 152
— Thawn em

Estou em um terminal ipython3 e configurei import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , agora como faço para "desfazer" isso? Gostaria que Keras usasse a GPU novamente.
— Gabriel C de

1
@Gabriel C: você desfaz deletando essas linhas.
— Martin Thoma de

68

Uma maneira bastante separável de fazer isso é usar

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)

Aqui, com booleans GPUe CPU, indicamos se gostaríamos de executar nosso código com a GPU ou CPU, definindo rigidamente o número de GPUs e CPUs que a sessão do Tensorflow pode acessar. As variáveis num_GPUe num_CPUdefinem este valor. num_coresem seguida, define o número de núcleos de CPU disponíveis para uso via intra_op_parallelism_threadse inter_op_parallelism_threads.

A intra_op_parallelism_threadsvariável determina o número de threads que uma operação paralela em um único nó no gráfico de computação pode usar (intra). Enquanto a inter_ops_parallelism_threadsvariável define o número de threads acessíveis para operações paralelas entre os nós do gráfico de computação (inter).

allow_soft_placement permite que as operações sejam executadas na CPU se qualquer um dos seguintes critérios forem atendidos:

  1. não há implementação de GPU para a operação

  2. não há dispositivos GPU conhecidos ou registrados

  3. há uma necessidade de co-localizar com outras entradas da CPU

Tudo isso é executado no construtor da minha classe antes de qualquer outra operação e é completamente separável de qualquer modelo ou outro código que eu uso.

Nota: Isso requer tensorflow-gpue cuda/ cudnndeve ser instalado porque a opção é fornecida para usar uma GPU.

Refs:


1
Esta é uma boa solução, pois apenas definir "CUDA_VISIBLE_DEVICES" causa CUDA_ERROR_NO_DEVICE seguido de muitos diagnósticos antes de continuar a execução na CPU. Embora ... ambos os métodos funcionem!
— jsfa11

1
Esta é a única solução consistente que funciona para mim. Continue voltando para ele.
— Authman Apatira

1
Você pode explicar o que os outros parâmetros significam? como allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
— Nagabhushan SN

são inter/ intra_op_parallelism_threadsreferem-se a operações de CPU ou GPU?
— bluesummers de

1
@bluesummers Eles pertencem à paralelização de CPU
— RACKGNOME

57

Isso funcionou para mim (win10), coloque antes de importar keras:

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

o que isso faz?
— kRazzy R

4
Com Win, força o TF a usar CPU e ignorar qualquer GPU. Não tive sorte com 0 ou em branco, mas -1 parecia funcionar.
— Neuraléptico de

1
Trabalhou em Win10 x64 para mim. Eu também não tive sorte em ganhar 0 ou branco e apenas -1 funcionou.
— Cypher

4
Trabalhou para mim no Ubuntu
— TripleS

Eu tenho duas GPUs em minha máquina, definir 'CUDA_VISIBLE_DEVICES' = 0/1 se refere à ID física das GPUs disponíveis. Definir como -1 usa CPU.
— Prashanth Muthurajaiah

30

Basta importar tensortflow e usar keras, é muito fácil.

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
A melhor resposta aqui
— xssChauhan

5
Quando defini o tf.device('/cpu:0'), ainda posso ver a memória sendo alocada para o python posteriormente com nvidia-smi.
— CMCDragonkai

@CMCDragonkai Resolva ou não ^ _ ^?
— lhdgriver

4
Não parece funcionar para mim também, ainda usa gpu quando eu configuro para usar cpu
— liyuan

Não deve ser também a definição do modelo e a compilação executada sob o mesmo with?
— matt525252

22

De acordo com o tutorial do keras , você pode simplesmente usar o mesmo tf.deviceescopo do tensorflow regular:

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
Como isso pode ser feito no Keras com Tensorflow como back-end, em vez de usar o Tensorflow para chamar as camadas Keras?
— mikal94305

Eu não entendo sua pergunta. O código interno withpode ser qualquer código Keras.
— sygi

1
Como isso pode ser feito com um modelo treinado carregado do disco? Atualmente, estou treinando em GPU, mas quero verificar depois na CPU
— ghostbust555

Não acho que esses modelos sejam intercambiáveis.
— Sygi

3
Consegui mudar o treinamento de gpu para cpu no meio do treinamento usando o método mencionado acima, em que salvo o modelo intermediário com model.save e recarrego-o com um tf.device diferente usando keras.models.load_model. O mesmo se aplica se você deseja treinar e prever em um dispositivo diferente.
— TheLoneNut

3

Acabei de passar algum tempo descobrindo. A resposta de Thoma não está completa. Diga que seu programa étest.py , você deseja usar gpu0 para executar este programa e manter outros gpus livres.

Você deveria escrever CUDA_VISIBLE_DEVICES=0 python test.py

Observe que DEVICESnão éDEVICE


0

Para pessoas que trabalham no PyCharm e para forçar a CPU, você pode adicionar a seguinte linha na configuração Executar / Depurar, em Variáveis ​​de ambiente:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.