Cómo obtener las GPU disponibles actuales en tensorflow?


Tengo un plan para usar TensorFlow distribuido, y vi que TensorFlow puede usar GPU para entrenamiento y pruebas. En un entorno de clúster, cada máquina podría tener 0 o 1 o más GPU, y quiero ejecutar mi gráfico TensorFlow en GPU en tantas máquinas como sea posible.

Descubrí que al ejecutar tf.Session() TensorFlow proporciona información sobre la GPU en los mensajes de registro como a continuación:

I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0)

Mi pregunta es ¿cómo puedo obtener información sobre la GPU disponible actual de TensorFlow? Puedo conseguir cargado información de GPU desde el registro, pero quiero hacerlo de una manera más sofisticada y programática. También podría restringir las GPU intencionalmente usando la variable de entorno CUDA_VISIBLE_DEVICES, por lo que no quiero saber una forma de obtener información de la GPU del núcleo del sistema operativo.

En resumen, quiero una función como tf.get_available_gpus() que devolverá ['/gpu:0', '/gpu:1'] si hay dos GPU disponibles en la máquina. ¿Cómo puedo implementar esto?

Author: mrry, 2016-07-25

4 answers

Hay un método indocumentado llamado device_lib.list_local_devices() eso le permite enumerar los dispositivos disponibles en el proceso local. (N.b. Como método no documentado, esto está sujeto a cambios incompatibles hacia atrás.) La función devuelve una lista de DeviceAttributes objetos protocol buffer. Puede extraer una lista de nombres de dispositivo de cadena para los dispositivos GPU de la siguiente manera:

from tensorflow.python.client import device_lib

def get_available_gpus():
    local_device_protos = device_lib.list_local_devices()
    return [x.name for x in local_device_protos if x.device_type == 'GPU']

Tenga en cuenta que (al menos hasta TensorFlow 1.4), llamando a device_lib.list_local_devices() ejecutará algún código de inicialización que, al por defecto, asignará toda la memoria de la GPU en todos los dispositivos ( GitHub issue). Para evitar esto, primero cree una sesión con un per_process_gpu_fraction explícitamente pequeño, o allow_growth=True, para evitar que se asigne toda la memoria. Ver esta pregunta para más detalles.

 128
Author: mrry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-13 14:58:15

Puede verificar toda la lista de dispositivos usando el siguiente código:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()
 55
Author: hyun woo Cho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-19 06:59:13

Aparte de la excelente explicación de Mrry, donde sugirió usar device_lib.list_local_devices(), puedo mostrarle cómo puede verificar la información relacionada con la GPU desde la línea de comandos.

Debido a que actualmente solo las gpu de Nvidia funcionan para frameworks NN, la respuesta solo las cubre. Nvidia tiene una página donde documentan cómo puede usar la interfaz del sistema de archivos /proc para obtener información en tiempo de ejecución sobre el controlador, cualquier tarjeta gráfica NVIDIA instalada y el estado AGP.

/proc/driver/nvidia/gpus/0..N/information

Proporcionar información sobre cada uno de los adaptadores gráficos NVIDIA instalados (nombre del modelo, IRQ, BIOS versión, Tipo Bus). Tenga en cuenta que la versión del BIOS solo está disponible mientras X está corriendo.

Así que puede ejecutar esto desde la línea de comandos cat /proc/driver/nvidia/gpus/0/information y ver información sobre su primera GPU. Es fácil ejecutar esto desde python y también puede comprobar la segunda, tercera, cuarta GPU hasta que falle.

Definitivamente la respuesta de Mrry es más robusta y yo no seguro si mi respuesta funcionará en una máquina que no sea linux, pero la página de Nvidia proporciona otra información interesante, que no mucha gente conoce.

 8
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-29 04:31:12

También hay un método en la prueba util. Así que todo lo que hay que hacer es:

tf.test.is_gpu_available()

Y / o

tf.test.gpu_device_name()

Busque los documentos de Tensorflow en busca de argumentos.

 4
Author: Soham Bhattacharyya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 06:14:08