Как получить текущие доступные графические процессоры в tenorflow?

165

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

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

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, поэтому я не хочу знать способ получения информации о графических процессорах из ядра ОС.

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

Сангвон Ким
источник

Ответы:

245

Существует недокументированный метод, device_lib.list_local_devices()который позволяет вам перечислить устройства, доступные в локальном процессе. ( Примечание: как недокументированный метод, он подвержен несовместимым изменениям.) Функция возвращает список DeviceAttributesбуферов протокола. объектов . Вы можете извлечь список имен строковых устройств для устройств с графическим процессором следующим образом:

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()будет запускаться некоторый код инициализации, который по умолчанию будет распределять всю память графического процессора на всех устройствах ( проблема GitHub ). Чтобы избежать этого, сначала создайте сеанс с явно небольшим per_process_gpu_fractionили allow_growth=True, чтобы предотвратить выделение всей памяти. Смотрите этот вопрос для более подробной информации.

mrry
источник
12
PS, если этот метод когда-либо будет перемещен / переименован, я бы заглянул внутрь tenorflow / python / platform / test.py: is_gpu_available, поскольку он используется довольно редко
Ярослав Булатов,
1
Есть ли способ получить устройства Free и Total memory? Я вижу, что в DeviceAttributes есть поле memory_limit, и я думаю, что это свободная память, а не полная
aarbelle
2
Я помню, что для более ранних версий, чем 1 tenorflow печатал некоторую информацию о gpus, когда он был импортирован в python. Были ли эти сообщения удалены в более новых версиях tenorflow? (следовательно, ваше предложение - единственный способ проверить работу графического процессора)?
Чарли Паркер
@CharlieParker Я полагаю, что при запуске в TF1.1 мы все еще печатаем по одной строке журнала на устройство GPU.
17
1
@aarbelle - использование вышеупомянутого метода для возврата всех атрибутов включает в себя поле Free memoryдля меня, используя tensorflow1.1. В from tensorflow.python.client import device_libdevice_lib.list_local_devices()
питоне
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'
Сиддхарт Дас
43

В утилите test также есть метод . Так что все, что нужно сделать, это:

tf.test.is_gpu_available()

и / или

tf.test.gpu_device_name()

Посмотрите документы Tensorflow для аргументов.

Сохам Бхаттачарья
источник
2
Это возвращает только GPU: 0
Trisoloriansunscreen
@Tal означает, что у вас есть 1 графический процессор (с идентификатором слота PCI 0). Так tf.test.is_gpu_available()что вернусьTrue
перезаписано
4
ОП запросил метод, который возвращает список доступных GPUS. По крайней мере, в моей настройке с несколькими GPU, tf.test.gpu_device_name () возвращает только имя первого.
Trisoloriansunscreen
AttributeError: у модуля tenorsflow нет атрибута test
Сиддхарт Дас
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')

Видеть:

MiniQuark
источник
Команда отлично сработала. Я должен был измениться 'GPU'на 'XLA_GPU'.
Вивек Субраманян
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, из командной строки.

Поскольку в настоящее время только Gvus от 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, пока он не выйдет из строя.

Определенно, ответ Mrry более надежный, и я не уверен, будет ли мой ответ работать на машине, отличной от Linux, но на странице Nvidia есть другая интересная информация, о которой мало кто знает.

Сальвадор Дали
источник
3

В тензор потока 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 тоже. Когда я запускаю этот код, он дает мне только процессоры
Шивас
Двойной ответ MiniQuark (но с меньшим количеством деталей ..)
FluxLemur
1

Я получил графический процессор под названием NVIDIA GTX GeForce 1650 Ti в моей машине сtensorflow-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

Убедитесь, что на вашем компьютере, поддерживающем GPU, установлена последняя версия TensorFlow 2.x GPU. Выполните следующий код на 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 tenorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому возвращается NUMA node zero 2020-02-07 10: 45: 37.588896: I tenorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Добавление видимых устройств GPU: 0, 1, 2, 3, 4, 5, 6, 7 Num Доступные графические процессоры: 8

lakshmikandan
источник
1
Этот ответ уже был опубликован.
Бьорн Линдквист