Bagaimana cara mendapatkan GPU yang tersedia saat ini di tensorflow?

165

Saya punya rencana untuk menggunakan TensorFlow yang didistribusikan, dan saya melihat TensorFlow dapat menggunakan GPU untuk pelatihan dan pengujian. Dalam lingkungan cluster, setiap mesin dapat memiliki 0 atau 1 atau lebih GPU, dan saya ingin menjalankan grafik TensorFlow saya ke dalam GPU pada sebanyak mungkin mesin.

Saya menemukan bahwa ketika menjalankan tf.Session()TensorFlow memberikan informasi tentang GPU dalam pesan log seperti di bawah ini:

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)

Pertanyaan saya adalah bagaimana cara mendapatkan informasi tentang GPU yang tersedia saat ini dari TensorFlow? Saya dapat memperoleh informasi GPU yang dimuat dari log, tetapi saya ingin melakukannya dengan cara yang lebih canggih dan terprogram. Saya juga dapat membatasi GPU dengan sengaja menggunakan variabel lingkungan CUDA_VISIBLE_DEVICES, jadi saya tidak ingin tahu cara mendapatkan informasi GPU dari kernel OS.

Singkatnya, saya ingin fungsi seperti tf.get_available_gpus()itu akan kembali ['/gpu:0', '/gpu:1']jika ada dua GPU yang tersedia di mesin. Bagaimana saya bisa menerapkan ini?

Sangwon Kim
sumber

Jawaban:

244

Ada metode tidak berdokumen yang disebut device_lib.list_local_devices()yang memungkinkan Anda untuk membuat daftar perangkat yang tersedia dalam proses lokal. ( NB Sebagai metode tidak berdokumen, ini tunduk pada perubahan yang tidak kompatibel ke belakang.) Fungsi mengembalikan daftar objek DeviceAttributesbuffer protokol . Anda dapat mengekstrak daftar nama perangkat string untuk perangkat GPU sebagai berikut:

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

Perhatikan bahwa (setidaknya hingga TensorFlow 1.4), panggilan device_lib.list_local_devices()akan menjalankan beberapa kode inisialisasi yang, secara default, akan mengalokasikan semua memori GPU pada semua perangkat ( masalah GitHub ). Untuk menghindarinya, pertama-tama buat sesi dengan yang secara eksplisit kecil per_process_gpu_fraction, atau allow_growth=True, untuk mencegah semua memori dialokasikan. Lihat pertanyaan ini untuk lebih jelasnya.

Pak
sumber
12
PS, jika metode ini pernah dipindahkan / diganti namanya, saya akan melihat ke dalam tensorflow / python / platform / test.py: is_gpu_available karena itu sedang digunakan sedikit
Yaroslav Bulatov
1
Apakah ada cara untuk mendapatkan perangkat Gratis dan Total memori? Saya melihat bahwa ada bidang memory_limit di DeviceAttributes dan saya pikir itu adalah memori bebas dan tidak total
aarbelle
2
Saya ingat bahwa untuk versi sebelumnya dari 1 tensorflow akan mencetak beberapa info tentang GPU ketika diimpor dengan python. Apakah pesan-pesan itu telah dihapus di versi tensorflow yang lebih baru? (maka saran Anda satu-satunya cara untuk memeriksa barang GPU)?
Charlie Parker
@CharlieParker Saya yakin kami masih mencetak satu baris log per perangkat GPU saat startup di TF1.1.
mrry
1
@ aarbelle - menggunakan metode yang disebutkan di atas untuk mengembalikan semua atribut termasuk bidang Free memoryuntuk saya, menggunakan tensorflow1.1. Dengan python from tensorflow.python.client import device_libdevice_lib.list_local_devices()
:,
123

Anda dapat memeriksa semua daftar perangkat menggunakan kode berikut:

from tensorflow.python.client import device_lib

device_lib.list_local_devices()
hyun woo Cho
sumber
11
@ Kulbear karena mengandung informasi yang lebih sedikit dari jawaban yang ada.
Davidmh
3
Masih lebih suka jawaban ini karena kesederhanaannya. Saya menggunakannya langsung dari bash:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher
1
Saya setuju, jawaban ini menghemat waktu saya. Saya hanya menyalin / menempelkan kode tanpa harus membaca jawaban resmi yang lebih panjang. Saya tahu detailnya, hanya perlu baris kode. Itu sudah tidak dipilih sebagai jawaban dan itu sudah cukup. Tidak perlu downvote.
Steven
1
mendapatkan kesalahancannot import name 'format_exc' from 'traceback'
Siddharth Das
43

Ada juga metode dalam util tes . Jadi yang harus dilakukan adalah:

tf.test.is_gpu_available()

dan / atau

tf.test.gpu_device_name()

Lihatlah dokumen Tensorflow untuk argumen.

Soham Bhattacharyya
sumber
2
Ini hanya mengembalikan GPU: 0
Trisoloriansunscreen
@Tal itu berarti Anda memiliki 1 GPU yang tersedia (pada PCI slot ID 0). Jadi tf.test.is_gpu_available()akan kembaliTrue
dipulihkan
4
OP meminta metode yang mengembalikan daftar GPUS yang tersedia. Setidaknya pada pengaturan multi-GPU saya, tf.test.gpu_device_name () hanya mengembalikan nama yang pertama.
Trisoloriansunscreen
AttributeError: module 'tensorflow' tidak memiliki atribut 'test'
Siddharth Das
27

Di TensorFlow 2.0, Anda dapat menggunakan 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)

Jika Anda memiliki dua GPU yang diinstal, ini menghasilkan ini:

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

Dari 2.1, Anda dapat menjatuhkan experimental:

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

Lihat:

MiniQuark
sumber
Perintah bekerja dengan baik. Saya harus pindah 'GPU'ke 'XLA_GPU'.
Vivek Subramanian
19

The diterima Jawaban memberikan jumlah GPU tetapi juga mengalokasikan semua memori pada orang-orang GPU. Anda dapat menghindari ini dengan membuat sesi dengan memori tetap rendah sebelum memanggil device_lib.list_local_devices () yang mungkin tidak diinginkan untuk beberapa aplikasi.

Saya akhirnya menggunakan nvidia-smi untuk mendapatkan jumlah GPU tanpa mengalokasikan memori apa pun pada mereka.

import subprocess

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

Terlepas dari penjelasan yang sangat baik oleh Mrry, di mana ia menyarankan untuk menggunakan, device_lib.list_local_devices()saya dapat menunjukkan kepada Anda bagaimana Anda dapat memeriksa informasi terkait GPU dari baris perintah.

Karena saat ini hanya GPU Nvidia yang berfungsi untuk kerangka kerja NN, jawabannya hanya mencakup mereka. Nvidia memiliki halaman di mana mereka mendokumentasikan bagaimana Anda dapat menggunakan antarmuka sistem file / proc untuk mendapatkan informasi run-time tentang driver, kartu grafis NVIDIA yang diinstal, dan status AGP.

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

Berikan informasi tentang masing-masing adapter grafis NVIDIA yang diinstal (nama model, IRQ, versi BIOS, Jenis Bus). Perhatikan bahwa versi BIOS hanya tersedia saat X sedang berjalan.

Jadi Anda dapat menjalankan ini dari baris perintah cat /proc/driver/nvidia/gpus/0/informationdan melihat informasi tentang GPU pertama Anda. Sangat mudah untuk menjalankan ini dari python dan Anda juga dapat memeriksa GPU kedua, ketiga, keempat sampai gagal.

Jelas jawaban Mrry lebih kuat dan saya tidak yakin apakah jawaban saya akan bekerja pada mesin non-linux, tetapi halaman Nvidia memberikan informasi menarik lainnya, yang tidak banyak orang ketahui.

Salvador Dali
sumber
3

Karya-karya berikut di 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)

Dari 2.1, Anda dapat menjatuhkan experimental:

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

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

Mike Gates
sumber
Apakah ini berfungsi ketika saya menggunakan scaleTier dari BASIC_GPU juga. Ketika saya menjalankan kode ini itu memberi saya hanya CPU
shivas
Jawaban duplikat dari MiniQuark (tetapi dengan kurang detail ..)
FluxLemur
1

Saya mendapat GPU yang dipanggil NVIDIA GTX GeForce 1650 Tidengan mesin sayatensorflow-gpu==2.2.0

Jalankan dua baris kode berikut:

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

Keluaran:

Num GPUs Available:  1
Hafizur Rahman
sumber
0

Gunakan cara ini dan periksa semua bagian:

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

Pastikan Anda memiliki GPU TensorFlow 2.x terinstal di mesin pendukung GPU Anda, Jalankan kode berikut dalam 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')))

Akan mendapatkan output seperti,

2020-02-07 10: 45: 37.587838: Saya tensorflow / stream_executor / cuda / cuda_gpu_executor.cc: 1006] simpul NUMA yang berhasil dibaca dari SysFS memiliki nilai negatif (-1), tetapi harus ada setidaknya satu simpul NUMA, jadi kembali NUMA simpul nol 2020-02-07 10: 45: 37.588896: Saya tensorflow / core / common_runtime / gpu / gpu_device.cc: 1746] Menambahkan perangkat gpu yang terlihat: 0, 1, 2, 3, 4, 5, 5, 6, 7 GPU Tersedia: 8

lakshmikandan
sumber
1
Jawaban ini sudah diposkan.
Björn Lindqvist