Comment obtenir les GPU actuellement disponibles dans Tensorflow?

165

J'ai l'intention d'utiliser TensorFlow distribué et j'ai vu que TensorFlow pouvait utiliser des GPU pour la formation et les tests. Dans un environnement de cluster, chaque machine peut avoir 0 ou 1 ou plusieurs GPU, et je souhaite exécuter mon graphique TensorFlow dans des GPU sur autant de machines que possible.

J'ai constaté que lors de l'exécution de tf.Session()TensorFlow, il donne des informations sur le GPU dans les messages du journal comme ci-dessous:

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)

Ma question est de savoir comment obtenir des informations sur le GPU actuellement disponible auprès de TensorFlow? Je peux obtenir des informations GPU chargées à partir du journal, mais je veux le faire de manière programmatique plus sophistiquée. Je pourrais également restreindre intentionnellement les GPU en utilisant la variable d'environnement CUDA_VISIBLE_DEVICES, donc je ne veux pas connaître un moyen d'obtenir des informations GPU à partir du noyau du système d'exploitation.

En bref, je veux qu'une fonction comme tf.get_available_gpus()celle-ci revienne ['/gpu:0', '/gpu:1']s'il y a deux GPU disponibles dans la machine. Comment puis-je mettre en œuvre cela?

Sangwon Kim
la source

Réponses:

245

Il existe une méthode non documentée appelée device_lib.list_local_devices()qui vous permet de répertorier les périphériques disponibles dans le processus local. ( NB En tant que méthode non documentée, elle est sujette à des modifications incompatibles vers l'arrière.) La fonction renvoie une liste d' objets de DeviceAttributestampon de protocole . Vous pouvez extraire une liste de noms de périphériques de chaîne pour les périphériques GPU comme suit:

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']

Notez que (au moins jusqu'à TensorFlow 1.4), l'appel device_lib.list_local_devices()exécutera un code d'initialisation qui, par défaut, allouera toute la mémoire du GPU sur tous les appareils ( problème GitHub ). Pour éviter cela, créez une session avec un petit explicitement per_process_gpu_fractionou allow_growth=True, pour empêcher toute la mémoire étant alloués. Voir cette question pour plus de détails.

mrry
la source
12
PS, si cette méthode est jamais déplacée / renommée, je regarderais à l'intérieur de tensorflow / python / platform / test.py: is_gpu_available car il est assez souvent utilisé
Yaroslav Bulatov
1
Existe-t-il un moyen d'obtenir la mémoire libre et totale des appareils? Je vois qu'il y a un champ memory_limit dans DeviceAttributes et je pense que c'est la mémoire libre et non totale
aarbelle
2
Je me souviens que pour les versions antérieures, 1 tensorflow imprimait des informations sur gpus lorsqu'il était importé en python. Ces messages ont-ils été supprimés dans les nouvelles versions de tensorflow? (d'où votre suggestion la seule façon de vérifier les trucs gpu)?
Charlie Parker
@CharlieParker Je crois que nous imprimons toujours une ligne de journal par périphérique GPU au démarrage dans TF1.1.
mrry
1
@aarbelle - utiliser la méthode mentionnée ci-dessus pour renvoyer tous les attributs inclut un champ Free memorypour moi, en utilisant tensorflow1.1. En python from tensorflow.python.client import device_libdevice_lib.list_local_devices()
:,
123

Vous pouvez vérifier toutes les listes d'appareils en utilisant le code suivant:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()
hyun woo Cho
la source
11
@Kulbear car il contient strictement moins d'informations que la réponse existante.
Davidmh
3
Préférez toujours cette réponse en raison de sa simplicité. Je l'utilise directement depuis bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher
1
Je suis d'accord, cette réponse m'a fait gagner du temps. Je viens de copier / coller le code sans avoir à lire la réponse officielle plus longue. Je connais les détails, j'avais juste besoin de la ligne de code. Cela n'a déjà pas été choisi comme réponse et c'est suffisant. Pas besoin de voter contre.
Steven
1
obtention d'une erreurcannot import name 'format_exc' from 'traceback'
Siddharth Das
43

Il existe également une méthode dans le test util . Il ne reste donc qu'à:

tf.test.is_gpu_available()

et / ou

tf.test.gpu_device_name()

Recherchez des arguments dans la documentation Tensorflow.

Soham Bhattacharyya
la source
2
Cela ne renvoie que GPU: 0
Trisoloriansunscreen
@Tal cela signifie que vous avez 1 GPU disponible (à l'ID d'emplacement PCI 0). So tf.test.is_gpu_available()will returnTrue
repoleved
4
L'OP a demandé une méthode qui renvoie une liste des GPUS disponibles. Au moins sur ma configuration multi-GPU, tf.test.gpu_device_name () ne renvoie que le nom du premier.
Trisoloriansunscreen
AttributeError: le module 'tensorflow' n'a pas d'attribut 'test'
Siddharth Das
27

Dans TensorFlow 2.0, vous pouvez utiliser tf.config.experimental.list_physical_devices('GPU'):

import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    print("Name:", gpu.name, "  Type:", gpu.device_type)

Si vous avez deux GPU installés, il génère ceci:

Name: /physical_device:GPU:0   Type: GPU
Name: /physical_device:GPU:1   Type: GPU

À partir de la version 2.1, vous pouvez supprimer experimental:

gpus = tf.config.list_physical_devices('GPU')

Voir:

MiniQuark
la source
La commande a très bien fonctionné. J'ai dû changer 'GPU'pour 'XLA_GPU'.
Vivek Subramanian le
19

La réponse acceptée vous donne le nombre de GPU mais elle alloue également toute la mémoire sur ces GPU. Vous pouvez éviter cela en créant une session avec une mémoire inférieure fixe avant d'appeler device_lib.list_local_devices () qui peut être indésirable pour certaines applications.

J'ai fini par utiliser nvidia-smi pour obtenir le nombre de GPU sans leur allouer de mémoire.

import subprocess

n = str(subprocess.check_output(["nvidia-smi", "-L"])).count('UUID')
maman amin
la source
8

Outre l'excellente explication de Mrry, où il a suggéré d'utiliser, device_lib.list_local_devices()je peux vous montrer comment vous pouvez vérifier les informations relatives au GPU à partir de la ligne de commande.

Étant donné qu'actuellement, seuls les gpus de Nvidia fonctionnent pour les frameworks NN, la réponse ne les couvre que. Nvidia a une page où ils documentent comment vous pouvez utiliser l'interface du système de fichiers / proc pour obtenir des informations d'exécution sur le pilote, toutes les cartes graphiques NVIDIA installées et l'état AGP.

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

Fournissez des informations sur chacun des adaptateurs graphiques NVIDIA installés (nom du modèle, IRQ, version du BIOS, type de bus). Notez que la version du BIOS n'est disponible que lorsque X est en cours d'exécution.

Vous pouvez donc l'exécuter à partir de la ligne de commande cat /proc/driver/nvidia/gpus/0/informationet voir des informations sur votre premier GPU. Il est facile d' exécuter cela à partir de python et vous pouvez également vérifier le deuxième, le troisième, le quatrième GPU jusqu'à ce qu'il échoue.

La réponse de Mrry est certainement plus robuste et je ne suis pas sûr que ma réponse fonctionnera sur une machine non Linux, mais cette page de Nvidia fournit d'autres informations intéressantes, que peu de gens connaissent.

Salvador Dali
la source
3

Ce qui suit fonctionne dans tensorflow 2:

import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    print("Name:", gpu.name, "  Type:", gpu.device_type)

À partir de la version 2.1, vous pouvez supprimer experimental:

    gpus = tf.config.list_physical_devices('GPU')

https://www.tensorflow.org/api_docs/python/tf/config/list_physical_devices

Mike Gates
la source
Cela fonctionne-t-il aussi lorsque j'utilise un scaleTier de BASIC_GPU. Quand je lance ce code, il ne me donne que les processeurs
shivas
Réponse en double de MiniQuark (mais avec moins de détails ..)
FluxLemur
1

J'ai un GPU appelé NVIDIA GTX GeForce 1650 Tidans ma machine avectensorflow-gpu==2.2.0

Exécutez les deux lignes de code suivantes:

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

Production:

Num GPUs Available:  1
Hafizur Rahman
la source
0

Utilisez cette méthode et vérifiez toutes les pièces:

from __future__ import absolute_import, division, print_function, unicode_literals

import numpy as np
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_datasets as tfds


version = tf.__version__
executing_eagerly = tf.executing_eagerly()
hub_version = hub.__version__
available = tf.config.experimental.list_physical_devices("GPU")

print("Version: ", version)
print("Eager mode: ", executing_eagerly)
print("Hub Version: ", h_version)
print("GPU is", "available" if avai else "NOT AVAILABLE")
Arash Hatami
la source
0

Assurez-vous que le dernier GPU TensorFlow 2.x est installé sur votre machine prenant en charge le GPU, exécutez le code suivant en python,

from __future__ import absolute_import, division, print_function, unicode_literals

import tensorflow as tf 

print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

Obtiendra une sortie ressemble à,

2020-02-07 10: 45: 37.587838: I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] Le nœud NUMA réussi lu à partir de SysFS avait une valeur négative (-1), mais il doit y avoir au moins un nœud NUMA, donc le retour NUMA node zero 2020-02-07 10: 45: 37.588896: I tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Ajout de périphériques gpu visibles: 0, 1, 2, 3, 4, 5, 6, 7 Num GPU disponibles: 8

lakshmikandan
la source
1
Cette réponse a déjà été publiée.
Björn Lindqvist le