Tensorflow'da mevcut GPU'ları nasıl alabilirim?


165

Dağıtılmış TensorFlow'u kullanma planım var ve TensorFlow'un eğitim ve test için GPU'ları kullanabileceğini gördüm. Bir küme ortamında, her makinede 0 veya 1 veya daha fazla GPU olabilir ve TensorFlow grafiğimi olabildiğince çok makinede GPU'lara çalıştırmak istiyorum.

tf.Session()TensorFlow çalıştırırken aşağıdaki gibi günlük iletilerinde GPU hakkında bilgi verdiğini buldum :

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)

Benim sorum şu anki mevcut GPU hakkında TensorFlow'dan nasıl bilgi alabilirim? Yüklü GPU bilgilerini günlükten alabilirim, ancak daha sofistike, programlı bir şekilde yapmak istiyorum. Ayrıca CUDA_VISIBLE_DEVICES ortam değişkenini kullanarak GPU'ları kasıtlı olarak kısıtlayabilirim, bu yüzden OS çekirdeğinden GPU bilgisi almanın bir yolunu bilmek istemiyorum.

Kısacası, makinede iki GPU varsa tf.get_available_gpus(), böyle bir fonksiyonun geri dönmesini istiyorum ['/gpu:0', '/gpu:1']. Bunu nasıl uygulayabilirim?

Yanıtlar:


245

device_lib.list_local_devices()Yerel işlemde kullanılabilir aygıtları listelemenizi sağlayan, adlandırılmamış bir yöntem vardır . ( Not : Belgelenmemiş bir yöntem olarak, bu geriye doğru uyumsuz değişikliklere tabidir.) İşlev, DeviceAttributesprotokol arabelleği nesnelerinin listesini döndürür . GPU aygıtları için dize aygıtı adlarının listesini aşağıdaki gibi ayıklayabilirsiniz:

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

(En azından TensorFlow 1.4'e kadar), çağrının device_lib.list_local_devices()varsayılan olarak tüm GPU belleğini tüm cihazlara ayıracağı bazı başlatma kodunu çalıştıracağını unutmayın ( GitHub sorunu ). Bunu önlemek için , öncelikle açıkça küçük bir oturum oluşturun per_process_gpu_fractionveya allow_growth=Truetüm belleğin ayrılmasını önleyin. Daha fazla ayrıntı için bu soruya bakın.


12
PS, bu yöntem hiç taşınmazsa / yeniden adlandırılırsa, tensorflow / python / platform / test.py: is_gpu_available içine bakarsınız çünkü bu biraz kullanılır
Yaroslav Bulatov

1
Cihazları Ücretsiz ve Toplam bellek almanın bir yolu var mı? DeviceAttributes bir memory_limit alanı olduğunu görüyorum ve ben toplam bellek değil, boş hafıza olduğunu düşünüyorum
aarbelle

2
1 tensorflow'dan önceki sürümler için python'a aktarıldığında gpus hakkında bazı bilgiler yazdıracağını hatırlıyorum. Bu mesajlar daha yeni tensorflow sürümlerinde kaldırıldı mı? (bu nedenle öneriniz gpu şeylerini kontrol etmenin tek yolu)?
Charlie Parker

@CharlieParker TF1.1'de başlangıçta hala GPU cihazı başına bir günlük satırı yazdırdığımıza inanıyorum.
mrry

1
@aarbelle - tüm öznitelikleri döndürmek için yukarıda belirtilen yöntemi kullanarak, Free memorybenim için bir alan içerir tensorflow1.1. Python'da: from tensorflow.python.client import device_libsonradevice_lib.list_local_devices()
n1k31t4

123

Aşağıdaki kodu kullanarak tüm cihaz listesini kontrol edebilirsiniz:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()

11
@Kulbear, mevcut cevaptan kesinlikle daha az bilgi içerdiğinden.
Davidmh

3
Sadeliği nedeniyle hala bu cevabı tercih ediyorum. Ben doğrudan bash kullanıyorum:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher 15:18

1
Katılıyorum, bu cevap bana zaman kazandırdı. Daha uzun resmi cevabı okumak zorunda kalmadan kodu kopyaladım / yapıştırdım. Ayrıntıları biliyorum, sadece kod satırına ihtiyacım vardı. Zaten cevap olarak seçilmedi ve bu yeterli. İndirmeye gerek yok.
Steven

1
hata alıyorumcannot import name 'format_exc' from 'traceback'
Siddharth Das

43

Test aracında da bir yöntem vardır . Yani yapılması gereken tek şey:

tf.test.is_gpu_available()

ve / veya

tf.test.gpu_device_name()

Tartışmalar için Tensorflow belgelerine bakın.


2
Bu sadece GPU döndürür: 0
Trisoloriansunscreen

@Tal, 1 GPU'nuz olduğu anlamına gelir (PCI yuva kimliği 0'da). Böylece tf.test.is_gpu_available()geri dönecekTrue
repoleved

4
OP, kullanılabilir GPUS listesini döndüren bir yöntem istedi. En azından çoklu GPU kurulumumda, tf.test.gpu_device_name () yalnızca ilkinin adını döndürür.
Trisoloriansunscreen

AttributeError: 'tensorflow' modülünün 'test' özelliği yok
Siddharth Das

27

TensorFlow 2.0'da şunları kullanabilirsiniz 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)

Yüklü iki GPU'nuz varsa, bunu verir:

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

2.1'den, şunları bırakabilirsiniz experimental:

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

Görmek:


Komuta harika çalıştı. Ben değiştirmek zorunda 'GPU'için 'XLA_GPU'.
Vivek Subramanian

19

Kabul edilen cevap size GPU sayısını verir, ancak bu GPU'lardaki tüm belleği ayırır. Bazı uygulamalar için istenmeyen cihaz_lib.list_local_devices () öğesini çağırmadan önce sabit bellekli bir oturum oluşturarak bunu önleyebilirsiniz.

Nvidia-smi'yi kullanarak onlara bellek ayırmadan GPU sayısını elde ettim.

import subprocess

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

8

Mrry'nin önerdiği mükemmel açıklama device_lib.list_local_devices()dışında, komut satırından GPU ile ilgili bilgileri nasıl kontrol edebileceğinizi gösterebilirim.

Şu anda sadece Nvidia'nın gpusları NN çerçeveleri için çalıştığı için, cevap sadece onları kapsıyor. Nvidia, sürücü, yüklü NVIDIA grafik kartları ve AGP durumu hakkında çalışma zamanı bilgileri elde etmek için / proc dosya sistemi arabirimini nasıl kullanabileceğinizi belgeleyen bir sayfaya sahiptir .

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

Takılı her NVIDIA grafik bağdaştırıcısı (model adı, IRQ, BIOS sürümü, Veri Yolu Türü) hakkında bilgi verin. BIOS sürümünün yalnızca X çalışırken kullanılabilir olduğunu unutmayın.

Böylece bunu komut satırından çalıştırabilir cat /proc/driver/nvidia/gpus/0/informationve ilk GPU'nuz hakkında bilgi görebilirsiniz. Bunu python'dan çalıştırmak kolaydır ve ayrıca başarısız olana kadar ikinci, üçüncü, dördüncü GPU'yu kontrol edebilirsiniz.

Kesinlikle Mrry'nin cevabı daha sağlam ve cevabımın linux olmayan makinelerde işe yarayıp yaramayacağından emin değilim, ancak Nvidia'nın sayfası birçok insanın bilmediği başka ilginç bilgiler sağlıyor.


3

Tensorflow 2'de aşağıdakiler çalışır:

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'den, şunları bırakabilirsiniz experimental:

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

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


Ben de BASIC_GPU bir scaleTier kullandığınızda çalışır. Bu kodu çalıştırdığımda bana sadece CPU'ları
veriyor

MiniQuark'ın yinelenen yanıtı (ancak daha az ayrıntıyla ..)
FluxLemur

1

Aradım bir GPU var NVIDIA GTX GeForce 1650 Tibenim makinedetensorflow-gpu==2.2.0

Aşağıdaki iki kod satırını çalıştırın:

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

Çıktı:

Num GPUs Available:  1

0

Bu şekilde kullanın ve tüm parçaları kontrol edin:

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 destek makinenize en son TensorFlow 2.x GPU'nun kurulu olduğundan emin olun , aşağıdaki kodu python'da yürütün,

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

Bir çıktı alacak gibi görünüyor,

2020-02-07 10: 45: 37.587838: Ben tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] SysFS'den okunan başarılı NUMA düğümü negatif değere (-1) sahipti, ancak en az bir NUMA düğümü olmalı, bu nedenle dönen NUMA düğümü sıfır 2020-02-07 10: 45: 37.588896: Ben tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Görünür gpu aygıtları ekleme: 0, 1, 2, 3, 4, 5, 6, 7 Num Mevcut GPU'lar: 8


1
Bu cevap zaten gönderildi.
Björn Lindqvist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.