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 ordinateur peut avoir 0, 1 ou plusieurs GPU. Je souhaite exécuter mon graphe TensorFlow dans des GPU sur autant d’ordinateurs que possible.
J'ai constaté que lors de l'exécution de tf.Session()
, TensorFlow donne des informations sur le processeur graphique dans les messages de 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 la suivante: comment puis-je obtenir des informations sur le processeur graphique actuellement disponible de TensorFlow? Je peux obtenir des informations GPU chargées à partir du journal, mais je souhaite le faire de manière plus sophistiquée et par programme. Je pouvais aussi restreindre intentionnellement les GPU à l'aide de la variable d'environnement CUDA_VISIBLE_DEVICES, aussi je ne veux pas savoir comment obtenir des informations sur le GPU à partir du noyau du système d'exploitation.
En bref, je veux une fonction comme tf.get_available_gpus()
qui retournera ['/gpu:0', '/gpu:1']
s'il y a deux GPU disponibles dans la machine. Comment puis-je implémenter cela?
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, cette option est sujette à des modifications incompatibles avec les versions antérieures.) La fonction renvoie une liste de DeviceAttributes
protocole tampon objets. Vous pouvez extraire une liste de noms de périphérique 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 (du 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 processeur graphique à tous les périphériques ( problème avec GitHub ). Pour éviter cela, commencez par créer une session avec un per_process_gpu_fraction
ou allow_growth=True
explicitement petit afin d'empêcher que toute la mémoire ne soit allouée. Voir cette question pour plus de détails.
Vous pouvez vérifier toute la liste des appareils en utilisant le code suivant:
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
Il existe également une méthode dans le test util . Donc, tout ce qui doit être fait est:
tf.test.is_gpu_available()
et/ou
tf.test.gpu_device_name()
Recherchez les arguments de la documentation Tensorflow.
Le réponse acceptée vous donne le nombre de GPU, mais 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 (), ce qui peut être indésirable pour certaines applications.
J'ai fini par utiliser nvidia-smi pour obtenir le nombre de GPU sans y allouer de mémoire.
import subprocess
n = str(subprocess.check_output(["nvidia-smi", "-L"])).count('UUID')
Outre l'excellente explication de Mrry, où il a suggéré d'utiliser device_lib.list_local_devices()
, je peux vous montrer comment vérifier les informations relatives au GPU à partir de la ligne de commande.
Parce que, pour le moment, seuls les gpus de Nvidia fonctionnent pour les frameworks NN, la réponse ne les couvre que. Nvidia a une page où ils expliquent comment utiliser l'interface de système de fichiers/proc pour obtenir des informations d'exécution sur le pilote, les cartes graphiques NVIDIA installées et l'état AGP.
/proc/driver/nvidia/gpus/0..N/information
Fournissez des informations sur chaque carte graphique NVIDIA installée (nom du modèle, IRQ, version du BIOS, type de bus). Notez que la version du BIOS est uniquement disponible 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/information
et voir des informations sur votre premier GPU. Il est facile de lancez ceci à partir de python et vous pouvez aussi vérifier les deuxième, troisième et 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 autre que Linux, mais la page de Nvidia fournit d'autres informations intéressantes, que peu de gens connaissent.
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, cela génère ceci:
Name: /physical_device:GPU:0 Type: GPU
Name: /physical_device:GPU:1 Type: GPU
Vous pouvez en apprendre plus sur cette page de documentation .