Como executar o Tensorflow na CPU

128

Eu instalei a versão GPU do tensorflow no Ubuntu 14.04.

Estou em um servidor GPU em que o tensorflow pode acessar as GPUs disponíveis.

Eu quero executar o tensorflow nas CPUs.

Normalmente eu posso usar env CUDA_VISIBLE_DEVICES=0para rodar na GPU no. 0

Como posso escolher entre as CPUs?

Não estou interessado em reescrever meu código com with tf.device("/cpu:0"):

Alexander R Johansen
fonte

Respostas:

115

Você pode aplicar o device_countparâmetro por tf.Session:

config = tf.ConfigProto(
        device_count = {'GPU': 0}
    )
sess = tf.Session(config=config)

Veja também o arquivo de configuração protobuf:

tensorflow/core/framework/config.proto

Ivan Aksamentov - Saque
fonte
2
Alguém disse que executar redes neurais em CPUs após a fase de treinamento é tão eficiente quanto executá-las em GPUs - ou seja, apenas a frase de treinamento realmente precisa da GPU. você sabe se isso é verdade? Obrigado!
Crashalot
3
Isso não funciona para mim (tf1.1). A solução do fabrizioM faz.
P-Gn
3
Não é melhor usar CUDA_VISIBLE_DEVICESa variável de ambiente em vez de alterar a configuração no código?
Nandeesh
3
@Andeesh Acho que depende de suas necessidades. Até o momento, existem pelo menos 53 pessoas que se interessam mais por variáveis ​​de ambiente e 35 que preferem definir o número de dispositivos no código. A vantagem do primeiro é a simplicidade e o outro é o controle mais explícito sobre (várias) sessões do próprio programa python (que o zero não é necessário para ser codificado permanentemente, pode ser uma variável).
Ivan Aksamentov -
1
@Crashalot depende da natureza da rede. Por exemplo, as RNNs podem ser mais rápidas em CPUs para lotes pequenos, devido à sua natureza sequencial. As CNNs ainda se beneficiarão de uma GPU no modo de inferência, mas como você só precisa executá-las uma vez por exemplo, uma CPU pode ser rápida o suficiente para muitos propósitos práticos.
Davidmh
174

Você também pode definir a variável de ambiente como

CUDA_VISIBLE_DEVICES=""

sem ter que modificar o código fonte.

fabrizioM
fonte
3
Alguém disse que executar redes neurais em CPUs após a fase de treinamento é tão eficiente quanto executá-las em GPUs - ou seja, apenas a frase de treinamento realmente precisa da GPU. você sabe se isso é verdade? Obrigado!
Crashalot
13
@Crashalot: Isso não é verdade. Procure por vários parâmetros de referência para interferência, as CPUs também são uma ordem de magnitude mais lenta.
Thomas Thomas
1
@ Thomas agradecimentos. sugestões sobre quais parâmetros de referência considerar? provavelmente também varia de acordo com a carga de trabalho e a natureza das redes neurais, certo? aparentemente, o aplicativo google translate executa algumas redes neurais diretamente em smartphones, presumivelmente na CPU e não na GPU?
Crashalot 17/11
@fabrizioM, um exemplo de brinquedo será mais útil.
precisa saber é o seguinte
7
Isto não funcionou para mim. : / define a variável de ambiente, mas o tensorflow ainda usa a GPU, estou usando o ambiente virtual conda, isso faz alguma diferença?
Guilherme de Lazari
102

Se as respostas acima não funcionarem, tente:

os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Aravindh Kuppusamy
fonte
4
Obrigado, isso é muito melhor do que outras opções.
precisa saber é o seguinte
Apenas para constar, a primeira opção parece não funcionar mais.
precisa saber é
Funciona também para o tf 2.X ao usar tf.keras.Sequentialmodelos.
Nicolas M.
22

Para mim, apenas definindo CUDA_VISIBLE_DEVICEScom precisão-1 funciona:

Trabalho:

import os
import tensorflow as tf

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

if tf.test.gpu_device_name():
    print('GPU found')
else:
    print("No GPU found")

# No GPU found

Será que não funciona:

import os
import tensorflow as tf

os.environ['CUDA_VISIBLE_DEVICES'] = ''    

if tf.test.gpu_device_name():
    print('GPU found')
else:
    print("No GPU found")

# GPU found
Andrzej Gis
fonte
4

Basta usar o código abaixo.

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
蔡 易 翔
fonte
0

Em alguns sistemas, é necessário especificar:

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]=""  # or even "-1"

ANTES de importar o fluxo tensor.

Fabrizio
fonte
0

Você poderia usar tf.config.set_visible_devices. Uma função possível que permite definir se e quais GPUs usar é:

import tensorflow as tf

def set_gpu(gpu_ids_list):
    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
        try:
            gpus_used = [gpus[i] for i in gpu_ids_list]
            tf.config.set_visible_devices(gpus_used, 'GPU')
            logical_gpus = tf.config.experimental.list_logical_devices('GPU')
            print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
        except RuntimeError as e:
            # Visible devices must be set before GPUs have been initialized
            print(e)

Suponha que você esteja em um sistema com 4 GPUs e deseje usar apenas duas GPUs, a com id = 0e a com id = 2, o primeiro comando do seu código, imediatamente após a importação das bibliotecas, seria:

set_gpu([0, 2])

No seu caso, para usar apenas a CPU, você pode chamar a função com uma lista vazia :

set_gpu([])

Para garantir a integridade, se você quiser evitar que a inicialização do tempo de execução aloque toda a memória do dispositivo, você pode usar tf.config.experimental.set_memory_growth. Por fim, a função de gerenciar quais dispositivos usar, ocupando a memória das GPUs dinamicamente, se torna:

import tensorflow as tf

def set_gpu(gpu_ids_list):
    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
        try:
            gpus_used = [gpus[i] for i in gpu_ids_list]
            tf.config.set_visible_devices(gpus_used, 'GPU')
            for gpu in gpus_used:
                tf.config.experimental.set_memory_growth(gpu, True)
            logical_gpus = tf.config.experimental.list_logical_devices('GPU')
            print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
        except RuntimeError as e:
            # Visible devices must be set before GPUs have been initialized
            print(e)
Roberto Amoroso
fonte
0

Outra solução possível no nível de instalação seria procurar a variante apenas da CPU: https://www.tensorflow.org/install/pip#package-location

No meu caso, isso dá agora:

pip3 install https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow_cpu-2.2.0-cp38-cp38-win_amd64.whl

Basta selecionar a versão correta. Pontos de bônus por usar um venv como explicado, por exemplo, nesta resposta .

Cadoiz
fonte