Як отримати наявні наявні графічні процесори в tensorflow?


165

У мене є план використовувати розподілений TensorFlow, і я побачив, що TensorFlow може використовувати GPU для навчання та тестування. У кластерному середовищі кожна машина може мати 0 або 1 або більше графічних процесорів, і я хочу запустити свій графік TensorFlow в GPU на якомога більше машин.

Я виявив, що під час запуску tf.Session()TensorFlow надає інформацію про GPU в повідомленнях журналу, як показано нижче:

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)

Моє запитання - як я можу отримати інформацію про поточний доступний графічний процесор від TensorFlow? Я можу завантажити інформацію про графічний процесор із журналу, але хочу це зробити більш складним, програмним способом. Я також міг би навмисно обмежувати GPU, використовуючи змінну середовища CUDA_VISIBLE_DEVICES, тому я не хочу знати спосіб отримання інформації про GPU з ядра ОС.

Коротше кажучи, я хочу, щоб така функція tf.get_available_gpus()поверталася, ['/gpu:0', '/gpu:1']якщо в машині є два GPU. Як я можу це здійснити?

Відповіді:


245

Існує метод без документації, який називається, device_lib.list_local_devices()що дозволяє перелічити пристрої, доступні в локальному процесі. ( Примітка. Як незадокументований метод, це підлягає назад несумісним змінам.) Функція повертає список об'єктів DeviceAttributesбуфера протоколу . Ви можете витягнути список назв рядкових пристроїв для GPU-пристроїв наступним чином:

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

Зауважте, що (принаймні до TensorFlow 1.4) виклик device_lib.list_local_devices()запустить якийсь код ініціалізації, який за замовчуванням виділить усю пам'ять GPU на всіх пристроях ( випуск GitHub ). Щоб уникнути цього, спершу створіть сеанс із явно малим per_process_gpu_fractionабо allow_growth=True, щоб запобігти виділенню всієї пам'яті. Дивіться це питання для більш детальної інформації.


12
PS, якщо цей метод коли-небудь буде переміщений / перейменований, я би заглянув всередину tensorflow / python / platform / test.py: is_gpu_available, оскільки він використовується досить небагато
Ярослав Булатов,

1
Чи є спосіб отримати у пристроїв вільну та загальну пам'ять? Я бачу, що в DeviceAttributes є поле memory_limit, і я думаю, що це вільна пам'ять, а не загальна
aarbelle

2
Я пам'ятаю, що для більш ранніх версій, ніж 1 tensorflow друкував би інформацію про gpus, коли він був імпортований у python. Чи видалено ці повідомлення в нових версіях тензорфлоу? (отже, ваша пропозиція - єдиний спосіб перевірити речі gpu)?
Чарлі Паркер

@CharlieParker Я вважаю, що ми все ще друкуємо одну лінію журналу на кожен пристрій GPU при запуску в TF1.1.
mrry

1
@aarbelle - використання вищезазначеного методу для повернення всіх атрибутів включає поле Free memoryдля мене, використовуючи tensorflow1.1. У python:, from tensorflow.python.client import device_libтодіdevice_lib.list_local_devices()
n1k31t4

123

Ви можете перевірити весь список пристроїв, використовуючи наступний код:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()

11
@Kulbear, оскільки містить суворо менше інформації, ніж наявна відповідь.
Davidmh

3
Все ж віддайте перевагу цій відповіді через її простоту. Я використовую його безпосередньо з bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher

1
Я згоден, ця відповідь заощадила мені час. Я просто копіюю / вставляю код без необхідності читати довшу офіційну відповідь. Я знаю деталі, просто знадобився рядок коду. Це вже не було обрано як відповідь, і цього достатньо. Не потрібно брати участь у голосуванні.
Стівен

1
помилкаcannot import name 'format_exc' from 'traceback'
Siddharth Das

43

Існує також метод у тест-утиліті . Отже, все, що потрібно зробити, це:

tf.test.is_gpu_available()

та / або

tf.test.gpu_device_name()

Шукайте документи Tensorflow для аргументів.


2
Це повертає просто GPU: 0
Trisoloriansunscreen

@Tal, це означає, що у вас є 1 GPU (за ідентифікатором слота PCI 0). Тож tf.test.is_gpu_available()повернемосьTrue
перенесено

4
ОП запитав метод, який повертає список доступних GPUS. Принаймні, у моїй налаштуваннях багатопроцесорного процесора tf.test.gpu_device_name () повертає лише ім'я першого.
Trisoloriansunscreen

AttributeError: модуль 'tensorflow' не має атрибута 'test'
Siddharth Das

27

У TensorFlow 2.0 ви можете використовувати 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)

Якщо у вас встановлено два графічних процесора, він виводить це:

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

З 2.1 ви можете скинути experimental:

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

Побачити:


Командування працювало чудово. Я повинен був змінити 'GPU'до 'XLA_GPU'.
Vivek Subramanian

19

Загальноприйнятий відповідь дає кількість графічних процесорів , але він також виділяє всю пам'ять на цих чіпах. Ви можете уникнути цього, створивши сеанс із фіксованою нижньою пам’яттю перед тим, як викликати device_lib.list_local_devices (), який може бути небажаним для деяких програм.

Я в кінцевому підсумку використовував nvidia-smi, щоб отримати кількість графічних процесорів, не виділяючи на них ніякої пам'яті.

import subprocess

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

8

Окрім відмінного пояснення Мрі, де він запропонував використати, device_lib.list_local_devices()я можу показати вам, як ви можете перевірити інформацію щодо GPU з командного рядка.

Оскільки в даний час лише gpus Nvidia працює для NN-фреймів, відповідь охоплює лише їх. У Nvidia є сторінка, де вони документують, як можна використовувати інтерфейс файлової системи / proc для отримання інформації про час роботи драйвера, будь-яких встановлених відеокарт NVIDIA та статусу AGP.

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

Надайте інформацію про кожен із встановлених графічних адаптерів NVIDIA (назва моделі, IRQ, версія BIOS, тип шини). Зауважте, що версія BIOS доступна лише під час роботи X.

Таким чином, ви можете запустити це з командного рядка cat /proc/driver/nvidia/gpus/0/informationі побачити інформацію про свій перший графічний процесор. Це легко запустити з python, а також ви можете перевірити другий, третій, четвертий GPU, поки він не вийде з ладу.

Безумовно, відповідь Мрі є більш надійною, і я не впевнений, чи вдасться моя відповідь на нелінукс-машині, але на сторінці Nvidia надається інша цікава інформація, про яку мало хто знає.


3

Наступні роботи в 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)

З 2.1 ви можете скинути experimental:

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

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


Чи працює це, коли я також використовую scaleTier BASIC_GPU. Коли я запускаю цей код, він дає мені лише процесори
shivas

Дублююча відповідь MiniQuark (але з меншими деталями ..)
FluxLemur

1

У мене в NVIDIA GTX GeForce 1650 Tiмашині викликається GPUtensorflow-gpu==2.2.0

Виконайте наступні два рядки коду:

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

Вихід:

Num GPUs Available:  1

0

Скористайтеся цим способом і перевірте всі частини:

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

Переконайтеся, що у вас на останньому графічному комп'ютері встановлено останню графічну технологію TensorFlow 2.x. Виконайте наступний код у 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')))

Отримає вихід схожий,

2020-02-07 10: 45: 37.587838: I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] успішний вузол NUMA, прочитаний з SysFS, мав негативне значення (-1), але повинен бути принаймні один вузол NUMA, тому повернення NUMA node zero 2020-02-07 10: 45: 37.588896: I tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Додавання видимих ​​пристроїв gpu: 0, 1, 2, 3, 4, 5, 6, 7 Num Доступні графічні процесори: 8


1
Ця відповідь уже розміщена.
Бьорн Ліндквіст
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.