Come ottenere le GPU attualmente disponibili in tensorflow?


165

Ho un piano per usare TensorFlow distribuito e ho visto che TensorFlow può usare GPU per addestramento e test. In un ambiente cluster, ogni macchina può avere 0 o 1 o più GPU e voglio eseguire il mio grafico TensorFlow in GPU su quante più macchine possibile.

Ho scoperto che quando si esegue tf.Session()TensorFlow fornisce informazioni sulla GPU nei messaggi di registro come di seguito:

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)

La mia domanda è: come posso ottenere informazioni sull'attuale GPU disponibile da TensorFlow? Posso ottenere informazioni sulla GPU caricate dal registro, ma voglio farlo in un modo più sofisticato e programmatico. Potrei anche limitare intenzionalmente le GPU usando la variabile d'ambiente CUDA_VISIBLE_DEVICES, quindi non voglio sapere un modo per ottenere informazioni sulla GPU dal kernel del sistema operativo.

In breve, voglio una funzione del genere tf.get_available_gpus()che ritorni ['/gpu:0', '/gpu:1']se ci sono due GPU disponibili nella macchina. Come posso implementarlo?

Risposte:


245

Esiste un metodo non documentato chiamato device_lib.list_local_devices()che consente di elencare i dispositivi disponibili nel processo locale. ( NB Come metodo non documentato, questo è soggetto a modifiche incompatibili all'indietro.) La funzione restituisce un elenco di oggetti DeviceAttributesbuffer di protocollo . È possibile estrarre un elenco di nomi di dispositivi stringa per i dispositivi GPU come segue:

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

Si noti che (almeno fino a TensorFlow 1.4), la chiamata device_lib.list_local_devices()eseguirà un codice di inizializzazione che, per impostazione predefinita, assegnerà tutta la memoria della GPU su tutti i dispositivi ( problema GitHub ). Per evitare ciò, creare prima una sessione con un valore esplicitamente piccolo per_process_gpu_fractiono allow_growth=True, per impedire che tutta la memoria venga allocata. Vedi questa domanda per maggiori dettagli.


12
PS, se questo metodo dovesse mai essere spostato / rinominato, guarderei dentro tensorflow / python / platform / test.py: is_gpu_available dato che viene usato un po '
Yaroslav Bulatov

1
C'è un modo per ottenere i dispositivi di memoria libera e totale? Vedo che c'è un campo memory_limit in DeviceAttributes e penso che sia la memoria libera e non totale
aarbelle,

2
Ricordo che per le versioni precedenti di 1 tensorflow avrebbe stampato alcune informazioni su gpus quando veniva importato in Python. Questi messaggi sono stati rimossi nelle versioni più recenti di tensorflow? (quindi il tuo suggerimento è l'unico modo per controllare le cose della gpu)?
Charlie Parker,

@CharlieParker Credo che continueremo a stampare una riga di registro per dispositivo GPU all'avvio in TF1.1.
mrry,

1
@aarbelle - usando il metodo sopra menzionato per restituire tutti gli attributi include un campo Free memoryper me, usando tensorflow1.1. In python from tensorflow.python.client import device_libdevice_lib.list_local_devices()
:,

123

Puoi controllare tutto l'elenco dei dispositivi usando il seguente codice:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()

11
@Kulbear perché contiene meno informazioni rispetto alla risposta esistente.
Davidmh,

3
Preferisco ancora questa risposta per la sua semplicità. Lo sto usando direttamente da bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher il

1
Sono d'accordo, questa risposta mi ha fatto risparmiare tempo. Ho appena copiato / incollato il codice senza dover leggere la risposta ufficiale più lunga. Conosco i dettagli, avevo solo bisogno della riga di codice. Non è già stato scelto come risposta ed è sufficiente. Non è necessario effettuare il downgrade.
Steven

1
ottenere errorecannot import name 'format_exc' from 'traceback'
Siddharth Das,

43

C'è anche un metodo nell'utilità di test . Quindi tutto ciò che deve essere fatto è:

tf.test.is_gpu_available()

e / o

tf.test.gpu_device_name()

Cerca gli argomenti di Tensorflow per gli argomenti.


2
Questo restituisce solo GPU: 0
Trisoloriansunscreen il

@Tal significa che hai 1 GPU disponibile (allo slot PCI ID 0). Così tf.test.is_gpu_available()torneràTrue
riconsegnato il

4
L'OP ha richiesto un metodo che restituisce un elenco di GPUS disponibili. Almeno sulla mia configurazione multi-GPU, tf.test.gpu_device_name () restituisce solo il nome del primo.
Trisoloriansunscreen

AttributeError: il modulo 'tensorflow' non ha attributo 'test'
Siddharth Das

27

In TensorFlow 2.0, è possibile utilizzare 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)

Se hai installato due GPU, genera questo:

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

Da 2.1, puoi eliminare experimental:

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

Vedere:


Il comando ha funzionato alla grande. Ho dovuto cambiare 'GPU'in 'XLA_GPU'.
Vivek Subramanian il

19

La risposta accettata fornisce il numero di GPU ma alloca anche tutta la memoria su quelle GPU. È possibile evitare ciò creando una sessione con memoria inferiore fissa prima di chiamare device_lib.list_local_devices () che potrebbe non essere desiderato per alcune applicazioni.

Ho finito per usare nvidia-smi per ottenere il numero di GPU senza allocare memoria su di esse.

import subprocess

n = str(subprocess.check_output(["nvidia-smi", "-L"])).count('UUID')

8

Oltre all'eccellente spiegazione di Mrry, in cui ha suggerito di usare, device_lib.list_local_devices()posso mostrarti come è possibile verificare le informazioni relative alla GPU dalla riga di comando.

Poiché attualmente solo il gpus di Nvidia funziona per i framework NN, la risposta copre solo questi. Nvidia ha una pagina in cui documentano come è possibile utilizzare l'interfaccia del filesystem / proc per ottenere informazioni di runtime sul driver, su eventuali schede grafiche NVIDIA installate e sullo stato AGP.

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

Fornire informazioni su ciascuno degli adattatori grafici NVIDIA installati (nome del modello, IRQ, versione BIOS, tipo di bus). Nota che la versione del BIOS è disponibile solo mentre X è in esecuzione.

Quindi puoi eseguirlo dalla riga di comando cat /proc/driver/nvidia/gpus/0/informatione vedere informazioni sulla tua prima GPU. È facile eseguirlo da Python e puoi anche controllare la seconda, terza, quarta GPU fino a quando non fallirà.

Sicuramente la risposta di Mrry è più solida e non sono sicuro che la mia risposta funzionerà su una macchina non Linux, ma che la pagina di Nvidia fornisce altre informazioni interessanti, di cui non molte persone conoscono.


3

I seguenti lavori in 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)

Da 2.1, puoi eliminare experimental:

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

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


Funziona quando uso anche un scaleTier di BASIC_GPU. Quando
eseguo

Duplica risposta di MiniQuark (ma con meno dettagli ..)
FluxLemur

1

Ho chiamato una GPU NVIDIA GTX GeForce 1650 Ti nella mia macchina contensorflow-gpu==2.2.0

Esegui le seguenti due righe di codice:

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

Produzione:

Num GPUs Available:  1

0

Utilizzare in questo modo e controllare tutte le parti:

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")

0

Assicurati di avere l'ultima GPU TensorFlow 2.x installata nella tua macchina di supporto GPU, esegui il seguente codice in 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')))

Otterrà un output simile a,

2020-02-07 10: 45: 37.587838: I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] il nodo NUMA riuscito letto da SysFS aveva un valore negativo (-1), ma deve esserci almeno un nodo NUMA, quindi tornare Nodo NUMA zero 2020-02-07 10: 45: 37.588896: I tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Aggiunta di dispositivi gpu visibili: 0, 1, 2, 3, 4, 5, 6, 7 Num GPU disponibili: 8


1
Questa risposta è già stata pubblicata.
Björn Lindqvist il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.