Cómo ejecutar Tensorflow en la CPU


128

He instalado la versión GPU de tensorflow en Ubuntu 14.04.

Estoy en un servidor de GPU donde tensorflow puede acceder a las GPU disponibles.

Quiero ejecutar tensorflow en las CPU.

Normalmente puedo usar env CUDA_VISIBLE_DEVICES=0para ejecutar en GPU no. 0.

¿Cómo puedo elegir entre las CPU en su lugar?

No estoy interesado en reescribir mi código con with tf.device("/cpu:0"):

Respuestas:


116

Puede aplicar el device_countparámetro por tf.Session:

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

Consulte también el archivo de configuración de protobuf:

tensorflow/core/framework/config.proto


2
Alguien dijo que ejecutar redes neuronales en CPU después de la fase de entrenamiento es tan eficiente como ejecutarlas en GPU, es decir, solo la frase de entrenamiento realmente necesita la GPU. ¿Sabes si esto es cierto? ¡Gracias!
Crashalot

3
Eso no me funciona (tf1.1). La solución de fabrizioM lo hace.
P-Gn

3
¿No es mejor usar CUDA_VISIBLE_DEVICESla variable de entorno en lugar de cambiar la configuración en el código?
Nandeesh

3
@Nandeesh Supongo que depende de tus necesidades. Hasta ahora, hay al menos 53 personas que se sienten más interesadas en las variables de entorno y 35 que prefieren establecer el número de dispositivos en el código. La ventaja de la primera es la simplicidad y de la otra es un control más explícito sobre (múltiples) sesiones desde el propio programa de Python (ese cero no es necesario para estar codificado, puede ser una variable).
Ivan Aksamentov - Salida el

1
@Crashalot depende de la naturaleza de la red. Por ejemplo, los RNN pueden ser más rápidos en las CPU para lotes pequeños debido a su naturaleza secuencial. Las CNN aún se beneficiarán de una GPU en modo de inferencia, pero dado que solo necesita ejecutarlas una vez por ejemplo, una CPU puede ser lo suficientemente rápida para muchos propósitos prácticos.
Davidmh

174

También puede establecer la variable de entorno en

CUDA_VISIBLE_DEVICES=""

sin tener que modificar el código fuente.


3
Alguien dijo que ejecutar redes neuronales en CPU después de la fase de entrenamiento es tan eficaz como ejecutarlas en GPU, es decir, solo la frase de entrenamiento realmente necesita la GPU. ¿Sabes si esto es cierto? ¡Gracias!
Crashalot

13
@Crashalot: Esto no es cierto. Busque varios puntos de referencia para detectar interferencias, las CPU también son un orden de magnitud más lentas allí.
Thomas

1
@Thomas gracias. sugerencias sobre qué puntos de referencia considerar? probablemente también varía según la carga de trabajo y la naturaleza de las redes neuronales, ¿verdad? aparentemente, la aplicación de traducción de Google ejecuta algunas redes neuronales directamente en los teléfonos inteligentes, presumiblemente en la CPU y no en la GPU.
Crashalot

@fabrizioM, un ejemplo de juguete será más útil.
Girishkumar

7
Esto no funcionó para mí. : / establezco la variable de entorno pero tensorflow todavía usa la GPU, estoy usando conda virtual env, ¿esto hace una diferencia?
Guilherme de Lazari

102

Si las respuestas anteriores no funcionan, intente:

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

4
Gracias, esto es mucho mejor que otras opciones.
user1098761

Solo para que conste, la primera opción ya no parece funcionar.
agcala

Funciona también para tf 2.X cuando se utilizan tf.keras.Sequentialmodelos.
Nicolas M.

22

Para mí, solo la configuración funciona CUDA_VISIBLE_DEVICEScon precisión -1:

Trabajos:

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

No no trabajar:

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

4

Simplemente usando el código a continuación.

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'

0

En algunos sistemas hay que especificar:

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

ANTES de importar tensorflow.


0

Podrías usar tf.config.set_visible_devices. Una función posible que le permite establecer si y qué GPU usar es:

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)

Suponga que está en un sistema con 4 GPU y desea usar solo dos GPU, la que tiene id = 0y la que tiene id = 2, entonces el primer comando de su código, inmediatamente después de importar las bibliotecas, sería:

set_gpu([0, 2])

En su caso, para usar solo la CPU, puede invocar la función con una lista vacía :

set_gpu([])

Para completar, si desea evitar que la inicialización en tiempo de ejecución asigne toda la memoria en el dispositivo, puede usar tf.config.experimental.set_memory_growth. Finalmente, la función para administrar qué dispositivos usar, ocupando la memoria de la GPU de forma dinámica, se convierte en:

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)

0

Otra posible solución a nivel de instalación sería buscar la única variante de CPU: https://www.tensorflow.org/install/pip#package-location

En mi caso, esto da ahora mismo:

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

Simplemente seleccione la versión correcta. Puntos de bonificación por usar un venv como se explica, por ejemplo, en esta respuesta .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.