Jak uzyskać aktualnie dostępne GPU w tensorflow?

165

Mam plan wykorzystania rozproszonego TensorFlow i widziałem, że TensorFlow może używać GPU do szkolenia i testowania. W środowisku klastrowym każda maszyna może mieć 0 lub 1 lub więcej procesorów graficznych i chcę uruchomić mój wykres TensorFlow na procesorach GPU na jak największej liczbie komputerów.

Odkryłem, że podczas uruchamiania tf.Session()TensorFlow podaje informacje o GPU w komunikatach dziennika, jak poniżej:

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)

Moje pytanie brzmi: w jaki sposób mogę uzyskać informacje o aktualnie dostępnym GPU od TensorFlow? Mogę pobrać informacje o GPU z dziennika, ale chcę to zrobić w bardziej wyrafinowany, programistyczny sposób. Mógłbym również celowo ograniczyć GPU za pomocą zmiennej środowiskowej CUDA_VISIBLE_DEVICES, więc nie chcę wiedzieć, w jaki sposób uzyskać informacje o GPU z jądra systemu operacyjnego.

Krótko mówiąc, chcę, aby taka funkcja tf.get_available_gpus()powróciła, ['/gpu:0', '/gpu:1']jeśli w komputerze są dostępne dwa GPU. Jak mogę to zaimplementować?

Sangwon Kim
źródło

Odpowiedzi:

244

Istnieje nieudokumentowana metoda o nazwie, device_lib.list_local_devices()która umożliwia wyświetlenie listy urządzeń dostępnych w procesie lokalnym. ( Uwaga: metoda nieudokumentowana podlega zmianom niekompatybilnym wstecz). Funkcja zwraca listę obiektów DeviceAttributesbufora protokołów . Możesz wyodrębnić listę nazw urządzeń ciągów dla urządzeń GPU w następujący sposób:

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

Zauważ, że (przynajmniej do TensorFlow 1.4), wywołanie device_lib.list_local_devices()spowoduje uruchomienie kodu inicjującego, który domyślnie przydzieli całą pamięć GPU na wszystkich urządzeniach ( problem z GitHub ). Aby tego uniknąć, najpierw utwórz sesję z jawnie małym per_process_gpu_fractionlub allow_growth=True, aby zapobiec przydzieleniu całej pamięci. Zobacz to pytanie, aby uzyskać więcej informacji.

mrry
źródło
12
PS, jeśli ta metoda zostanie kiedykolwiek przeniesiona / zmieniona, zajrzałbym do tensorflow / python / platform / test.py: is_gpu_available, ponieważ jest używana dość często
Jarosław Bulatov
1
Czy istnieje sposób na uzyskanie wolnej i całkowitej pamięci urządzeń? Widzę, że w DeviceAttributes znajduje się pole memory_limit i myślę, że jest to wolna pamięć, a nie całkowita
aarbelle
2
Pamiętam, że we wcześniejszych wersjach niż 1 tensorflow wyświetlał informacje o gpus po zaimportowaniu go do Pythona. Czy te wiadomości zostały usunięte w nowszych wersjach tensorflow? (stąd twoja sugestia to jedyny sposób, aby sprawdzić rzeczy związane z GPU)?
Charlie Parker
@CharlieParker Uważam, że nadal drukujemy jeden wiersz dziennika na urządzenie GPU podczas uruchamiania w TF1.1.
mrry
1
@aarbelle - użycie powyższej metody do zwrócenia wszystkich atrybutów zawiera Free memorydla mnie pole za pomocą tensorflow1.1. W Pythonie from tensorflow.python.client import device_libdevice_lib.list_local_devices()
:,
123

Możesz sprawdzić listę wszystkich urządzeń za pomocą następującego kodu:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()
hyun woo Cho
źródło
11
@Kulbear, ponieważ zawiera ściśle mniej informacji niż istniejąca odpowiedź.
Davidmh,
3
Nadal wolę tę odpowiedź ze względu na jej prostotę. Używam go bezpośrednio z basha:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher
1
Zgadzam się, ta odpowiedź pozwoliła mi zaoszczędzić czas. Po prostu skopiowałem / wkleiłem kod bez konieczności czytania dłuższej oficjalnej odpowiedzi. Znam szczegóły, potrzebowałem tylko linii kodu. To już nie zostało wybrane jako odpowiedź i to wystarczy. Nie ma potrzeby głosowania przeciw.
Steven
1
uzyskiwanie błęducannot import name 'format_exc' from 'traceback'
Siddharth Das
43

W narzędziu testowym znajduje się również metoda . Więc wszystko, co należy zrobić, to:

tf.test.is_gpu_available()

i / lub

tf.test.gpu_device_name()

Poszukaj argumentów w dokumentacji Tensorflow.

Soham Bhattacharyya
źródło
2
Zwraca tylko GPU: 0
Trisoloriansunscreen
@Tal, co oznacza, że ​​masz dostępny 1 GPU (w gnieździe PCI ID 0). Tak tf.test.is_gpu_available()powrócimyTrue
wydano
4
OP zażądał metody, która zwraca listę dostępnych GPUS. Przynajmniej w mojej konfiguracji z wieloma GPU, tf.test.gpu_device_name () zwraca tylko nazwę pierwszego.
Trisoloriansunscreen
AttributeError: moduł „tensorflow” nie ma atrybutu „test”
Siddharth Das
27

W TensorFlow 2.0 możesz użyć 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)

Jeśli masz zainstalowane dwa GPU, wyświetla to:

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

Od 2.1 możesz upuścić experimental:

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

Widzieć:

MiniQuark
źródło
Dowództwo działało świetnie. Musiałem zmienić 'GPU'się 'XLA_GPU'.
Vivek Subramanian
19

Odpowiedź Zaakceptowany daje liczbę procesorów graficznych, ale także przydziela całą pamięć o tych procesorów graficznych. Możesz tego uniknąć, tworząc sesję ze stałą mniejszą ilością pamięci przed wywołaniem device_lib.list_local_devices (), co może być niepożądane dla niektórych aplikacji.

Skończyło się na tym, że użyłem nvidia-smi, aby uzyskać liczbę procesorów graficznych bez przydzielania im pamięci.

import subprocess

n = str(subprocess.check_output(["nvidia-smi", "-L"])).count('UUID')
mamad amin
źródło
8

Oprócz doskonałego wyjaśnienia Mrry'ego, w którym zasugerował użycie device_lib.list_local_devices(), mogę pokazać, jak można sprawdzić informacje związane z GPU z wiersza poleceń.

Ponieważ obecnie tylko procesory graficzne Nvidii działają dla frameworków NN, odpowiedź dotyczy tylko nich. Nvidia ma stronę, na której dokumentują, w jaki sposób można używać interfejsu systemu plików / proc do uzyskiwania informacji o sterowniku, wszelkich zainstalowanych kartach graficznych NVIDIA i statusie AGP w czasie wykonywania.

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

Podaj informacje o każdej z zainstalowanych kart graficznych NVIDIA (nazwa modelu, przerwanie, wersja BIOS, typ magistrali). Zwróć uwagę, że wersja BIOS jest dostępna tylko wtedy, gdy X jest uruchomiony.

Możesz więc uruchomić to z wiersza poleceń cat /proc/driver/nvidia/gpus/0/informationi zobaczyć informacje o swoim pierwszym GPU. Łatwo jest to uruchomić z Pythona, a także możesz sprawdzić drugi, trzeci, czwarty GPU, aż się nie powiedzie.

Zdecydowanie odpowiedź Mrry'ego jest solidniejsza i nie jestem pewien, czy moja odpowiedź będzie działać na komputerze innym niż Linux, ale strona Nvidii zawiera inne interesujące informacje, o których niewiele osób wie.

Salvador Dali
źródło
3

W tensorflow 2 działa:

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

Od 2.1 możesz upuścić experimental:

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

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

Mike Gates
źródło
Czy to działa, gdy używam również scaleTier BASIC_GPU. Po uruchomieniu tego kodu otrzymuję tylko procesory
shivas
Zduplikowana odpowiedź MiniQuark (ale z mniejszą
FluxLemur,
1

Mam GPU wywołane NVIDIA GTX GeForce 1650 Tina mojej maszynie ztensorflow-gpu==2.2.0

Uruchom następujące dwie linie kodu:

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

Wynik:

Num GPUs Available:  1
Hafizur Rahman
źródło
0

Skorzystaj w ten sposób i sprawdź wszystkie części:

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
źródło
0

Upewnij się, że masz zainstalowany najnowszy procesor graficzny TensorFlow 2.x na maszynie obsługującej GPU, wykonaj następujący kod w języku 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')))

Otrzyma wynik w postaci,

2020-02-07 10: 45: 37.587838: I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] pomyślny odczyt węzła NUMA z SysFS miał wartość ujemną (-1), ale musi być przynajmniej jeden węzeł NUMA, więc zwracanie NUMA node zero 2020-02-07 10: 45: 37.588896: I tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Dodawanie widocznych urządzeń GPU: 0, 1, 2, 3, 4, 5, 6, 7 Num Dostępne GPU: 8

lakshmikandan
źródło
1
Ta odpowiedź została już opublikowana.
Björn Lindqvist