टेंसरफ्लो में वर्तमान में उपलब्ध जीपीयू कैसे प्राप्त करें?


165

मेरे पास वितरित TensorFlow का उपयोग करने की योजना है, और मैंने देखा कि TensorFlow प्रशिक्षण और परीक्षण के लिए GPU का उपयोग कर सकता है। क्लस्टर वातावरण में, प्रत्येक मशीन में 0 या 1 या अधिक GPU हो सकते हैं, और मैं यथासंभव अधिक मशीनों पर अपने 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 के बारे में जानकारी कैसे मिलेगी? मैं लॉग से भरी हुई GPU जानकारी प्राप्त कर सकता हूं, लेकिन मैं इसे अधिक परिष्कृत, प्रोग्रामेटिक तरीके से करना चाहता हूं। मैं जानबूझकर CUDA_VISIBLE_DEVICES पर्यावरण चर का उपयोग करके GPU को प्रतिबंधित कर सकता हूं, इसलिए मैं OS कर्नेल से GPU जानकारी प्राप्त करने का एक तरीका नहीं जानना चाहता।

संक्षेप में, मैं एक फ़ंक्शन चाहता हूं जैसे tf.get_available_gpus()कि ['/gpu:0', '/gpu:1']मशीन में दो जीपीयू उपलब्ध होने पर वापस आ जाएगा । मैं इसे कैसे लागू कर सकता हूं?

जवाबों:


244

एक अनकंफर्टेबल मेथड 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()कुछ आरंभीकरण कोड चलाएगी, जो डिफ़ॉल्ट रूप से, सभी डिवाइसों ( GitHub समस्या ) पर सभी GPU मेमोरी को आवंटित करेगा । इससे बचने के लिए, पहले स्पष्ट रूप से छोटे के साथ एक सत्र बनाएं per_process_gpu_fraction, या allow_growth=True, सभी स्मृति को आवंटित करने से रोकने के लिए। देखें इस सवाल का अधिक जानकारी के लिए।


12
पुनश्च, यदि यह विधि कभी भी स्थानांतरित हो जाती है / नाम बदल जाती है, तो मैं टेंसोफ़्लो / पायथन / प्लेटफ़ॉर्म / टेस्टोस्टेरोन के अंदर देखूंगा: is_gpu_available जब से काफी उपयोग किया जा रहा है
यारोस्लाव बुलटोव

1
क्या उपकरणों को मुफ्त और कुल मेमोरी प्राप्त करने का एक तरीका है? मैं देख रहा हूँ कि DeviceAttributes में एक memory_limit फ़ील्ड है और मुझे लगता है कि यह मुफ़्त मेमोरी है और कुल नहीं है
aarbelle

2
मुझे याद है कि 1 टेंसरफ्लो से पहले के संस्करणों के लिए जीपीयू के बारे में कुछ जानकारी छपी होगी जब इसे अजगर में आयात किया गया था। क्या उन संदेशों को नए टेंसोफ़्लो संस्करणों में हटा दिया गया है? (इसलिए आपका सुझाव gpu सामान की जाँच करने का एकमात्र तरीका है)?
चार्ली पार्कर

@CharlieParker मुझे विश्वास है कि हम अभी भी TF1.1 में स्टार्टअप पर एक लॉग लाइन प्रति जीपीयू डिवाइस प्रिंट करते हैं।
mrry

1
@ARbelle - सभी विशेषताओं को वापस करने के लिए उपर्युक्त विधि का Free memoryउपयोग करते हुए, मेरे लिए फ़ील्ड का उपयोग करना शामिल है tensorflow1.1। अजगर में: 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
@ कूलबियर क्योंकि इसमें मौजूदा उत्तर की तुलना में कड़ाई से कम जानकारी है।
डेविड मम

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

परीक्षण उपयोग में एक विधि भी है । इतना सब करना है:

tf.test.is_gpu_available()

और / या

tf.test.gpu_device_name()

तर्कों के लिए Tensorflow डॉक्स को देखें।


2
यह सिर्फ GPU देता है: 0
Trisoloriansunscreen

@ ताल यानि आपके पास 1 जीपीयू उपलब्ध है (पीसीआई स्लॉट आईडी 0 पर)। तो tf.test.is_gpu_available()वापस आ जाएगाTrue
repolved

4
ओपी ने एक विधि का अनुरोध किया जो उपलब्ध GPUS की सूची लौटाता है। कम से कम मेरे मल्टी-जीपीयू सेटअप पर, tf.test.gpu_device_name () केवल पहले वाले का नाम देता है।
Trisoloriansunscreen

विशेषता: मॉड्यूल 'टेंसोरफ़्लो' की कोई विशेषता 'परीक्षण' नहीं है
सिद्धार्थ दास

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)

यदि आपके पास दो GPU स्थापित हैं, तो यह इसका आउटपुट देता है:

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'
विवेक सुब्रमण्यन

19

स्वीकार किए जाते हैं जवाब आप GPUs की संख्या देता है लेकिन यह भी उन GPUs पर सभी स्मृति आवंटित करता है। Device_lib.list_local_devices () जो कुछ अनुप्रयोगों के लिए अवांछित हो सकता है को कॉल करने से पहले निश्चित निचली मेमोरी के साथ एक सत्र बनाकर आप इससे बच सकते हैं।

मैंने उन पर कोई मेमोरी आवंटित किए बिना GPU की संख्या प्राप्त करने के लिए nvidia-smi का उपयोग करके समाप्त किया।

import subprocess

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

8

श्रीमती द्वारा उत्कृष्ट व्याख्या के अलावा, जहां उन्होंने उपयोग करने का सुझाव दिया था device_lib.list_local_devices()मैं आपको दिखा सकता हूं कि आप कमांड लाइन से जीपीयू से संबंधित जानकारी की जांच कैसे कर सकते हैं।

क्योंकि वर्तमान में केवल एनवीडिया के एनएन फ्रेमवर्क के लिए एनवीडिया का काम होता है, इसलिए उत्तर केवल उन्हें कवर करता है। एनवीडिया के पास एक पृष्ठ है जहां वे दस्तावेज़ करते हैं कि आप ड्राइवर के बारे में रन-टाइम जानकारी प्राप्त करने के लिए / खरीद फाइलसिस्टम इंटरफ़ेस का उपयोग कैसे कर सकते हैं, किसी भी स्थापित NVIDIA ग्राफिक्स कार्ड, और एजीपी स्थिति।

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

प्रत्येक स्थापित NVIDIA ग्राफिक्स एडेप्टर (मॉडल नाम, आईआरक्यू, BIOS संस्करण, बस प्रकार) के बारे में जानकारी प्रदान करें। ध्यान दें कि BIOS संस्करण एक्स उपलब्ध होने के दौरान ही उपलब्ध है।

तो आप इसे कमांड लाइन से चला सकते हैं cat /proc/driver/nvidia/gpus/0/informationऔर अपने पहले जीपीयू के बारे में जानकारी देख सकते हैं। अजगर से इसे चलाना आसान है और जब तक आप असफल नहीं होंगे तब तक आप दूसरे, तीसरे, चौथे जीपीयू की जांच कर सकते हैं।

निश्चित रूप से मिरी का जवाब अधिक मजबूत है और मुझे यकीन नहीं है कि मेरा जवाब नॉन-लाइनक्स मशीन पर काम करेगा, लेकिन यह कि एनवीडिया का पेज अन्य रोचक जानकारी प्रदान करता है, जिसके बारे में बहुत कम लोगों को जानकारी नहीं है।


3

दहाई में निम्नलिखित काम करता है:

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


क्या यह काम तब होता है जब मैं BASIC_GPU के एक पैमाने का उपयोग करता हूं। जब मैं इस कोड को चलाता हूं तो यह मुझे सिर्फ सीपीयू देता है
शिवरात्रि

मिनीक्वार का डुप्लिकेट उत्तर (लेकिन कम विवरण के साथ ..)
फ्लक्सलेमर

1

मुझे NVIDIA GTX GeForce 1650 Tiअपनी मशीन में एक GPU मिला है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 स्थापित है, निम्न कोड को पाइटथन में निष्पादित करें,

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 टेंसोफ़्लो / स्ट्रीम_एक्सलेटर / कोडा / cuda_gpu_executor.cc: 1006] SysFS से पढ़े गए NUMA नोड का नकारात्मक मान था (-1), लेकिन इसमें कम से कम एक NUMA नोड होना चाहिए, इसलिए वापस लौटना NUMA नोड शून्य 2020-02-07 10: 45: 37.588896: I टेंसोफ़्लो / कोर / सामान्य_प्रत्यय / gpu / gpu_device.cc: 1746] दृश्यमान gpu उपकरणों को जोड़ना: 0, 1, 2, 3, 4, 5, 6, 7 Num जीपीयू उपलब्ध: 8


1
यह उत्तर पहले ही पोस्ट किया जा चुका है।
ब्योर्न लिंडक्विस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.