Como obter GPUs atuais disponíveis no fluxo tensor?

165

Tenho um plano para usar o TensorFlow distribuído e vi que o TensorFlow pode usar GPUs para treinamento e teste. Em um ambiente de cluster, cada máquina pode ter 0 ou 1 ou mais GPUs, e eu quero executar meu gráfico do TensorFlow nas GPUs em tantas máquinas quanto possível.

Descobri que, ao executar o tf.Session()TensorFlow, fornece informações sobre a GPU nas mensagens de log, como abaixo:

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)

Minha pergunta é como obtenho informações sobre a GPU atual disponível no TensorFlow? Posso obter informações de GPU carregadas do log, mas quero fazê-lo de uma maneira mais sofisticada e programática. Também pude restringir as GPUs intencionalmente usando a variável de ambiente CUDA_VISIBLE_DEVICES, por isso não quero saber como obter informações da GPU no kernel do SO.

Em resumo, quero uma função como tf.get_available_gpus()essa que retornará ['/gpu:0', '/gpu:1']se houver duas GPUs disponíveis na máquina. Como posso implementar isso?

Sangwon Kim
fonte

Respostas:

244

Existe um método não documentado chamado device_lib.list_local_devices()que permite listar os dispositivos disponíveis no processo local. ( NB Como método não documentado, isso está sujeito a alterações incompatíveis com versões anteriores.) A função retorna uma lista de objetos de DeviceAttributesbuffer de protocolo . Você pode extrair uma lista de nomes de dispositivos de sequência para os dispositivos GPU da seguinte maneira:

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

Observe que (pelo menos até o TensorFlow 1.4), a chamada device_lib.list_local_devices()executará algum código de inicialização que, por padrão, alocará toda a memória da GPU em todos os dispositivos ( problema do GitHub ). Para evitar isso, primeiro crie uma sessão com um valor explicitamente pequeno per_process_gpu_fractionou allow_growth=Truepara impedir que toda a memória seja alocada. Veja esta pergunta para mais detalhes.

mrry
fonte
12
PS, se este método já é movido / renomeado, gostaria de olhar para dentro tensorflow / python / platform / test.py: is_gpu_available desde que está a ser usado um pouco
Yaroslav Bulatov
1
Existe uma maneira de obter os dispositivos livres e memória total? Vejo que há um campo memory_limit nas DeviceAttributes e eu acho que é a memória livre e não totais
aarbelle
2
Lembro-me de que para versões anteriores a 1 tensorflow imprimiria algumas informações sobre o gpus quando importado em python. Essas mensagens foram removidas nas versões mais recentes do tensorflow? (daí a sua sugestão, a única maneira de verificar as coisas da gpu)?
Charlie Parker
@CharlieParker Acredito que ainda imprimimos uma linha de registro por dispositivo GPU na inicialização do TF1.1.
mrry
1
@arbelle - usar o método mencionado acima para retornar todos os atributos inclui um campo Free memorypara mim, usando tensorflow1.1. Em python from tensorflow.python.client import device_libdevice_lib.list_local_devices()
:,
123

Você pode verificar toda a lista de dispositivos usando o seguinte código:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()
hyun woo Cho
fonte
11
@Kulbear porque contém estritamente menos informações do que a resposta existente.
21417 Davidmh
3
Ainda prefiro esta resposta devido à sua simplicidade. Estou usando-o diretamente do bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher 15/10
1
Eu concordo, esta resposta me salvou tempo. Acabei de copiar / colar o código sem precisar ler a resposta oficial mais longa. Eu sei os detalhes, só precisava da linha de código. Ele já não foi escolhido como resposta e isso é suficiente. Não há necessidade de voto negativo.
Steven
1
obtendo errocannot import name 'format_exc' from 'traceback'
Siddharth Das
43

Há também um método no utilitário de teste . Então, tudo o que precisa ser feito é:

tf.test.is_gpu_available()

e / ou

tf.test.gpu_device_name()

Consulte os documentos do Tensorflow para argumentos.

Soham Bhattacharyya
fonte
2
Isso retorna apenas GPU: 0
Trisoloriansunscreen
@ Tal significa que você tem 1 GPU disponível (no slot 0 do PCI). Então tf.test.is_gpu_available(), retornaráTrue
repoleved
4
O OP solicitou um método que retorna uma lista de GPUS disponíveis. Pelo menos na minha configuração de várias GPUs, tf.test.gpu_device_name () retorna apenas o nome do primeiro.
Trisoloriansunscreen
AttributeError: o módulo 'tensorflow' não possui atributo 'test' #
Siddharth Das
27

No TensorFlow 2.0, você pode usar 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 você tiver duas GPUs instaladas, ela gera o seguinte:

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

A partir do 2.1, você pode soltar experimental:

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

Vejo:

MiniQuark
fonte
Comando funcionou muito bem. Eu tive que mudar 'GPU'para 'XLA_GPU'.
Vivek Subramanian
19

A resposta aceita fornece o número de GPUs, mas também aloca toda a memória nessas GPUs. Você pode evitar isso criando uma sessão com memória inferior fixa antes de chamar device_lib.list_local_devices (), que pode ser indesejável para alguns aplicativos.

Acabei usando a nvidia-smi para obter o número de GPUs sem alocar nenhuma memória nelas.

import subprocess

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

Além da excelente explicação de Mrry, onde ele sugeriu o uso device_lib.list_local_devices(), posso mostrar como você pode procurar informações relacionadas à GPU na linha de comando.

Como atualmente apenas os gpus da Nvidia funcionam para estruturas NN, a resposta os cobre apenas. A Nvidia possui uma página na qual documentam como você pode usar a interface do sistema de arquivos / proc para obter informações em tempo de execução sobre o driver, qualquer placa gráfica NVIDIA instalada e o status do AGP.

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

Forneça informações sobre cada um dos adaptadores gráficos NVIDIA instalados (nome do modelo, IRQ, versão do BIOS, tipo de barramento). Observe que a versão do BIOS está disponível apenas enquanto o X está em execução.

Assim, você pode executar isso na linha de comando cat /proc/driver/nvidia/gpus/0/informatione ver informações sobre sua primeira GPU. É fácil executar isso a partir de python e você também pode verificar a segunda, terceira e quarta GPU até que ela falhe.

Definitivamente, a resposta de Mrry é mais robusta e não tenho certeza se minha resposta funcionará em máquinas não-Linux, mas a página da Nvidia fornece outras informações interessantes, das quais poucas pessoas conhecem.

Salvador Dalí
fonte
3

O seguinte funciona no 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)

A partir do 2.1, você pode soltar experimental:

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

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

Mike Gates
fonte
Isso funciona quando eu uso um scaleTier de BASIC_GPU também. Quando eu executar esse código que me dá apenas o CPUs
shivas
Resposta duplicada do MiniQuark (mas com menos detalhes ..)
FluxLemur 04/04/19
1

Eu recebi uma GPU chamada NVIDIA GTX GeForce 1650 Tina minha máquina comtensorflow-gpu==2.2.0

Execute as duas linhas de código a seguir:

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

Resultado:

Num GPUs Available:  1
Hafizur Rahman
fonte
0

Use desta maneira e verifique todas as peças:

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

Verifique se você possui a mais recente GPU TensorFlow 2.x instalada em sua máquina de suporte a GPU, Execute o seguinte código em 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')))

Obterá uma saída semelhante a,

2020-02-07 10: 45: 37.587838: I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] o nó NUMA bem-sucedido lido do SysFS teve valor negativo (-1), mas deve haver pelo menos um nó NUMA, retornando Nó zero da NUMA 2020-02-07 10: 45: 37.588896: I tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Adicionando dispositivos gpu visíveis: 0, 1, 2, 3, 4, 5, 6, 7 Num GPUs disponíveis: 8

lakshmikandan
fonte
1
Esta resposta já foi publicada.
Björn Lindqvist