Wie bekomme ich aktuell verfügbare GPUs in Tensorflow?

165

Ich habe vor, verteiltes TensorFlow zu verwenden, und ich habe gesehen, dass TensorFlow GPUs zum Trainieren und Testen verwenden kann. In einer Clusterumgebung kann jeder Computer 0 oder 1 oder mehr GPUs haben, und ich möchte mein TensorFlow-Diagramm auf so vielen Computern wie möglich in GPUs ausführen.

Ich habe festgestellt, dass tf.Session()TensorFlow beim Ausführen von Informationen Informationen zur GPU in den folgenden Protokollmeldungen enthält:

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)

Meine Frage ist, wie ich von TensorFlow Informationen über die aktuell verfügbare GPU erhalte. Ich kann geladene GPU-Informationen aus dem Protokoll abrufen, möchte dies jedoch auf eine komplexere, programmgesteuerte Weise tun. Ich könnte GPUs auch absichtlich mithilfe der Umgebungsvariablen CUDA_VISIBLE_DEVICES einschränken, daher möchte ich nicht wissen, wie GPU-Informationen vom Betriebssystemkernel abgerufen werden können.

Kurz gesagt, ich möchte, dass eine solche Funktion zurückgegeben tf.get_available_gpus()wird, ['/gpu:0', '/gpu:1']wenn zwei GPUs in der Maschine verfügbar sind. Wie kann ich das umsetzen?

Sangwon Kim
quelle

Antworten:

244

Es gibt eine undokumentierte Methode namens device_lib.list_local_devices(), mit der Sie die im lokalen Prozess verfügbaren Geräte auflisten können. ( Hinweis: Als undokumentierte Methode unterliegt dies rückwärts inkompatiblen Änderungen.) Die Funktion gibt eine Liste der DeviceAttributesProtokollpufferobjekte zurück . Sie können eine Liste von String-Gerätenamen für die GPU-Geräte wie folgt extrahieren:

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

Beachten Sie, dass beim Aufruf (mindestens bis zu TensorFlow 1.4) device_lib.list_local_devices()ein Initialisierungscode ausgeführt wird, der standardmäßig den gesamten GPU-Speicher auf allen Geräten zuweist ( GitHub-Problem ). Um dies zu vermeiden, erstellen Sie zunächst eine Sitzung mit einem explizit kleinen per_process_gpu_fractionoder allow_growth=True, um zu verhindern, dass der gesamte Speicher zugewiesen wird. Weitere Informationen finden Sie in dieser Frage .

mrry
quelle
12
PS, wenn diese Methode jemals verschoben / umbenannt wird, würde ich in tensorflow / python / platform / test.py schauen: is_gpu_available, da das ziemlich oft verwendet wird
Yaroslav Bulatov
1
Gibt es eine Möglichkeit, die Geräte frei und vollständig zu speichern? Ich sehe, dass es ein memory_limit-Feld in den DeviceAttributes gibt und ich denke, es ist der freie Speicher und nicht total
aarbelle
2
Ich erinnere mich, dass für frühere Versionen als 1 Tensorflow einige Informationen über GPUS gedruckt wurden, wenn es in Python importiert wurde. Wurden diese Meldungen in den neueren Tensorflow-Versionen entfernt? (daher Ihr Vorschlag der einzige Weg, um GPU-Zeug zu überprüfen)?
Charlie Parker
@CharlieParker Ich glaube, wir drucken beim Start in TF1.1 immer noch eine Protokollzeile pro GPU-Gerät.
mrry
1
@aarbelle - Wenn Sie die oben genannte Methode verwenden, um alle Attribute zurückzugeben, wird Free memoryfür mich ein Feld mit verwendet tensorflow1.1. In Python : from tensorflow.python.client import device_lib, danndevice_lib.list_local_devices()
n1k31t4
123

Sie können alle Gerätelisten mit folgendem Code überprüfen:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()
Hyun woo Cho
quelle
11
@ Kulbear, weil es streng weniger Informationen enthält als die vorhandene Antwort.
Davidmh
3
Ziehen Sie diese Antwort aufgrund ihrer Einfachheit immer noch vor. Ich benutze es direkt von Bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
Aboettcher
1
Ich stimme zu, diese Antwort hat mir Zeit gespart. Ich habe den Code einfach kopiert / eingefügt, ohne die längere offizielle Antwort lesen zu müssen. Ich kenne die Details, brauchte nur die Codezeile. Es wurde bereits nicht als Antwort ausgewählt und das reicht aus. Keine Notwendigkeit, abzustimmen.
Steven
1
Fehler bekommencannot import name 'format_exc' from 'traceback'
Siddharth Das
43

Es gibt auch eine Methode im Test util . Alles was getan werden muss ist:

tf.test.is_gpu_available()

und / oder

tf.test.gpu_device_name()

Suchen Sie in den Tensorflow-Dokumenten nach Argumenten.

Soham Bhattacharyya
quelle
2
Dies gibt nur GPU zurück: 0
Trisoloriansunscreen
@Tal bedeutet, dass 1 GPU verfügbar ist (bei PCI-Steckplatz-ID 0). Also tf.test.is_gpu_available()wird zurückkehrenTrue
repoleved
4
Das OP forderte eine Methode an, die eine Liste der verfügbaren GPUS zurückgibt. Zumindest in meinem Multi-GPU-Setup gibt tf.test.gpu_device_name () nur den Namen des ersten zurück.
Trisoloriansunscreen
AttributeError: Modul 'Tensorflow' hat kein Attribut 'Test'
Siddharth Das
27

In TensorFlow 2.0 können Sie Folgendes verwenden 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)

Wenn Sie zwei GPUs installiert haben, wird Folgendes ausgegeben:

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

Ab 2.1 können Sie fallen lassen experimental :

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

Sehen:

MiniQuark
quelle
Das Kommando hat super funktioniert. Ich musste ändern 'GPU'zu 'XLA_GPU'.
Vivek Subramanian
19

Die akzeptierte Antwort gibt Ihnen die Anzahl der GPUs an, weist aber auch den gesamten Speicher dieser GPUs zu. Sie können dies vermeiden, indem Sie eine Sitzung mit festem, niedrigerem Speicher erstellen, bevor Sie device_lib.list_local_devices () aufrufen, was für einige Anwendungen möglicherweise unerwünscht ist.

Am Ende habe ich nvidia-smi verwendet, um die Anzahl der GPUs zu ermitteln, ohne ihnen Speicher zuzuweisen.

import subprocess

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

Abgesehen von der hervorragenden Erklärung von Mrry, wo er die Verwendung vorgeschlagen hat, device_lib.list_local_devices()kann ich Ihnen zeigen, wie Sie über die Befehlszeile nach GPU-bezogenen Informationen suchen können.

Da derzeit nur Npidias GPus für NN-Frameworks funktioniert, werden nur diese beantwortet. Nvidia verfügt über eine Seite, auf der dokumentiert wird, wie Sie die / proc-Dateisystemschnittstelle verwenden können, um Laufzeitinformationen zum Treiber, zu installierten NVIDIA-Grafikkarten und zum AGP-Status abzurufen.

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

Geben Sie Informationen zu jedem installierten NVIDIA-Grafikadapter an (Modellname, IRQ, BIOS-Version, Bustyp). Beachten Sie, dass die BIOS-Version nur verfügbar ist, während X ausgeführt wird.

Sie können dies also über die Befehlszeile ausführen cat /proc/driver/nvidia/gpus/0/informationund Informationen zu Ihrer ersten GPU anzeigen. Es ist einfach, dies von Python aus auszuführen und Sie können auch die zweite, dritte und vierte GPU überprüfen, bis sie fehlschlägt.

Auf jeden Fall ist Mrrys Antwort robuster und ich bin nicht sicher, ob meine Antwort auf einem Nicht-Linux-Computer funktioniert, aber die Seite von Nvidia enthält andere interessante Informationen, über die nicht viele Menschen Bescheid wissen.

Salvador Dali
quelle
3

Folgendes funktioniert 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)

Ab 2.1 können Sie Folgendes löschenexperimental :

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

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

Mike Gates
quelle
Funktioniert das, wenn ich auch eine scaleTier von BASIC_GPU verwende? Wenn ich diesen Code ausführe, bekomme ich nur die CPUs
Shivas
Doppelte Antwort von MiniQuark (aber mit weniger Details ..)
FluxLemur
1

Ich habe eine GPU NVIDIA GTX GeForce 1650 Tiin meinem Computer mit aufgerufentensorflow-gpu==2.2.0

Führen Sie die folgenden zwei Codezeilen aus:

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

Ausgabe:

Num GPUs Available:  1
Hafizur Rahman
quelle
0

Verwenden Sie diesen Weg und überprüfen Sie alle Teile:

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
quelle
0

Stellen Sie sicher, dass auf Ihrem GPU-unterstützenden Computer die neueste TensorFlow 2.x- GPU installiert ist. Führen Sie den folgenden Code in Python aus:

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

Wird eine Ausgabe bekommen sieht aus wie,

2020-02-07 10: 45: 37.587838: I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] Der erfolgreiche NUMA-Knoten, der aus SysFS gelesen wurde, hatte einen negativen Wert (-1), es muss jedoch mindestens ein NUMA-Knoten vorhanden sein NUMA-Knoten Null 2020-02-07 10: 45: 37.588896: I tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Hinzufügen sichtbarer GPU-Geräte: 0, 1, 2, 3, 4, 5, 6, 7 Num Verfügbare GPUs: 8

Lakshmikandan
quelle
1
Diese Antwort wurde bereits veröffentlicht.
Björn Lindqvist