টেনসরফ্লোতে কীভাবে বর্তমান উপলব্ধ জিপিইউ পাবেন?


165

আমার বিতরণকৃত টেনসরফ্লো ব্যবহার করার পরিকল্পনা রয়েছে এবং আমি দেখেছিলাম টেনসরফ্লো প্রশিক্ষণ এবং পরীক্ষার জন্য জিপিইউ ব্যবহার করতে পারে। একটি ক্লাস্টারের পরিবেশে, প্রতিটি মেশিনের 0 বা 1 বা তার বেশি জিপিইউ থাকতে পারে এবং আমি আমার টেনসরফ্লো গ্রাফটি যতটা সম্ভব মেশিনে জিপিইউতে চালাতে চাই।

আমি দেখেছি যে tf.Session()টেনসরফ্লো চালানোর সময় নীচের মতো লগ বার্তাগুলিতে জিপিইউ সম্পর্কিত তথ্য দেয়:

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)

আমার প্রশ্নটি হল টেনসরফ্লো থেকে আমি কীভাবে বর্তমান উপলব্ধ জিপিইউ সম্পর্কে তথ্য পাব? আমি লগ থেকে জিপিইউ লোড করা তথ্য পেতে পারি, তবে আমি এটি আরও পরিশীলিত, প্রোগ্রামিক পদ্ধতিতে করতে চাই want আমি জিপিইউগুলি ইচ্ছাকৃতভাবে CUDA_VISIBLE_DEVICES এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে বাধা দিতে পারি, তাই আমি ওএস কার্নেল থেকে জিপিইউ তথ্য পাওয়ার কোনও উপায় জানতে চাই না।

সংক্ষেপে, আমি মেশিনে দুটি জিপিইউ উপলব্ধ থাকলে সেটির মতো একটি ফাংশনটি tf.get_available_gpus()ফিরে আসতে চাই ['/gpu:0', '/gpu:1']। আমি কীভাবে এটি বাস্তবায়ন করতে পারি?

উত্তর:


244

একটি অননুমোদিত পদ্ধতি বলা হয়েছে 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']

নোট করুন (কমপক্ষে টেনসরফ্লো 1.4 অবধি), কলিং device_lib.list_local_devices()কিছু সূচনা কোড চালিত করবে যা ডিফল্টরূপে সমস্ত ডিভাইসে ( জিটহাব ইস্যু ) জিপিইউ মেমরির সমস্ত বরাদ্দ করে । এটি এড়াতে, প্রথমে একটি স্পষ্টতই ছোট একটি সেশন তৈরি করুন per_process_gpu_fractionবা allow_growth=Trueসমস্ত মেমরির বরাদ্দ রোধ করতে। আরও তথ্যের জন্য এই প্রশ্নটি দেখুন ।


12
পিএস, এই পদ্ধতিটি যদি কখনও সরানো / পুনরায় নামকরণ হয় তবে আমি টেনস্রোফ্লো / পাইথন / প্ল্যাটফর্ম / টেস্ট.পিটির ভিতরে দেখতে চাই: যেহেতু বেশ খানিকটা ব্যবহৃত হচ্ছে
ইয়ারস্লাভ বুলাটোভ

1
ডিভাইসগুলি ফ্রি এবং টোটাল মেমরি পাওয়ার কী কোনও উপায় আছে? আমি দেখতে পাচ্ছি যে ডিভাইসঅ্যাট্রিবিউটে একটি মেমরি_লিট ফিল্ড রয়েছে এবং আমি মনে করি এটি নিখরচায় মেমরি এবং মোট নয়
আরবেলে

2
আমার মনে আছে যে পূর্ববর্তী সংস্করণগুলির জন্য 1 টিস্যু প্রবাহটি পাইপনে আমদানি করার সময় জিপাস সম্পর্কে কিছু তথ্য মুদ্রণ করবে। এই বার্তাগুলি কি নতুন টেনসরফ্লো সংস্করণে সরানো হয়েছে? (সুতরাং আপনার পরামর্শটি জিপিইউ স্টাফ চেক করার একমাত্র উপায়)?
চার্লি পার্কার 21

@ চর্লিপার্কার আমি বিশ্বাস করি যে আমরা এখনও জিপিইউ ডিভাইসটিতে টিএফ 1.1-তে প্রারম্ভকালে একটি লগ লাইন প্রিন্ট করি।
মিপ্রি

1
@ অ্যারবেলে - সমস্ত বৈশিষ্ট্য ফিরিয়ে দিতে উল্লিখিত পদ্ধতিটি 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
তবুও সরলতার কারণে এই উত্তরটি পছন্দ করুন। আমি এটি সরাসরি বাশ থেকে ব্যবহার করছি:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
অ্যাবোটেটর

1
আমি সম্মত, এই উত্তরটি আমার সময় সাশ্রয় করেছে। আমি আর সরকারী উত্তর না পড়েই কোডটি অনুলিপি / পেস্ট করেছি। আমি বিশদ জানি, শুধু কোড লাইন প্রয়োজন। এটি ইতিমধ্যে উত্তর হিসাবে নেওয়া হয়নি এবং এটি যথেষ্ট। ডাউনভোট করার দরকার নেই।
স্টিভেন

1
ত্রুটি পাচ্ছেcannot import name 'format_exc' from 'traceback'
সিদ্ধার্থ দাস

43

পরীক্ষার ব্যবহারে একটি পদ্ধতিও রয়েছে । সুতরাং যা করতে হবে তা হ'ল:

tf.test.is_gpu_available()

এবং / অথবা

tf.test.gpu_device_name()

আর্গুমেন্টগুলির জন্য টেনসরফ্লো ডক্সগুলি সন্ধান করুন।


2
এটি কেবল জিপিইউ: 0
ট্রাইসোলরিয়ান্সস্ক্রিন

@ টালের অর্থ হল আপনার 1 জিপিইউ উপলব্ধ রয়েছে (পিসিআই স্লট আইডি 0 তে)। তাই tf.test.is_gpu_available()ফিরে আসবেTrue
repoleved

4
ওপি এমন একটি পদ্ধতির অনুরোধ করেছে যা উপলভ্য জিপিএসের তালিকা ফিরিয়ে দেয়। কমপক্ষে আমার মাল্টি-জিপিইউ সেটআপে, tf.test.gpu_device_name () কেবল প্রথমটির নাম দেয়।
ট্রাইসোলরিয়ানসস্ক্রিন

অ্যাট্রিবিউটআরার: মডিউল 'টেনসরফ্লো'র কোনও' টেস্ট 'বৈশিষ্ট্য নেই
সিদ্ধার্থ দাস

27

টেনসরফ্লো ২.০ এ আপনি ব্যবহার করতে পারেন 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

২.১ থেকে আপনি ড্রপ করতে পারেন experimental:

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

দেখা:


কমান্ড দুর্দান্ত কাজ করেছে। আমি পরিবর্তন করতে হয়েছিল 'GPU'করার 'XLA_GPU'
বিবেক সুব্রহ্মণিয়ামিয়

19

গৃহীত উত্তর আপনি জিপিইউ সংখ্যা দেয় কিন্তু এটি সেই জিপিইউ সব মেমরি বরাদ্দ। ডিভাইস_লিব.লিস্ট_লোকাল_দেবস () কে কল করার আগে নির্দিষ্ট লোয়ার মেমোরি দিয়ে একটি সেশন তৈরি করে আপনি এড়াতে পারেন যা কিছু অ্যাপ্লিকেশনের জন্য অযাচিত হতে পারে।

আমি তাদের কোনও স্মৃতি বরাদ্দ না করে জিপিইউ সংখ্যা পেতে এনভিডিয়া-এসএমআই ব্যবহার করে শেষ করেছি।

import subprocess

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

8

মিঃরির দুর্দান্ত ব্যাখ্যা ছাড়াও যেখানে তিনি ব্যবহারের পরামর্শ দিয়েছিলেন device_lib.list_local_devices()আমি কীভাবে কমান্ড লাইন থেকে জিপিইউ সম্পর্কিত তথ্য পরীক্ষা করতে পারি তা আপনাকে দেখাতে পারি।

কারণ বর্তমানে কেবল এনভিডিয়া জিপিএস এনএন ফ্রেমওয়ার্কগুলির জন্য কাজ করে, উত্তরটি কেবল তাদের কভার করে। এনভিডিয়াতে একটি পৃষ্ঠা রয়েছে যেখানে তারা চালক, কোনও ইনস্টলড এনভিআইডিআইএ গ্রাফিক্স কার্ড এবং এজিপি স্থিতি সম্পর্কে রান-টাইম তথ্য পেতে / প্রো ফাইল ফাইল সিস্টেম ইন্টারফেসটি কীভাবে ব্যবহার করতে পারবেন তা নথিভুক্ত করে।

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

ইনস্টল হওয়া প্রতিটি এনভিআইডিআইএ গ্রাফিক্স অ্যাডাপ্টার (মডেলের নাম, আইআরকিউ, বিআইওএস সংস্করণ, বাসের ধরণ) সম্পর্কে তথ্য সরবরাহ করুন। মনে রাখবেন যে বিআইওএস সংস্করণটি কেবল এক্স চলমান অবস্থায় উপলব্ধ।

সুতরাং আপনি এটি কমান্ড লাইন থেকে চালাতে পারেন cat /proc/driver/nvidia/gpus/0/informationএবং আপনার প্রথম জিপিইউ সম্পর্কিত তথ্য দেখতে পারেন। অজগর থেকে এটি চালানো সহজ এবং এটি ব্যর্থ হওয়া অবধি আপনি দ্বিতীয়, তৃতীয়, চতুর্থ জিপিইউ পরীক্ষা করতে পারেন।

অবশ্যই ম্রির উত্তরটি আরও দৃust় এবং আমার উত্তরটি নন-লিনাক্স মেশিনে কাজ করবে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে এনভিডিয়া পৃষ্ঠায় অন্যান্য আকর্ষণীয় তথ্য সরবরাহ করা হয়েছে, যা সম্পর্কে অনেকেই জানেন না।


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)

২.১ থেকে আপনি ড্রপ করতে পারেন experimental:

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

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


যখন আমি খুব বেসিক_জিপিইউ এর স্কেল টায়ার ব্যবহার করি তখন কি এটি কাজ করে? আমি যখন এই কোডটি চালাই তখন এটি আমাকে কেবল সিপিইউ দেয়
শিভাস

MiniQuark এর সদৃশ উত্তর (তবে কম বিশদ সহ ..)
ফ্লাক্স লেমুর

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 সমর্থনকারী মেশিনে সর্বশেষতম টেনসরফ্লো ২.x জিপিইউ ইনস্টল করেছেন তা নিশ্চিত করুন , পাইথনে নিম্নলিখিত কোডটি কার্যকর করুন,

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: আমি সেন্সরফ্লো / স্ট্রিম_এক্সিকিউটর / চুদা / চুদা_জিপু_এক্সেকিউটার.সি: 1006] সাইকএসএফ থেকে পঠিত সফল NUMA নোডের নেতিবাচক মান ছিল (-1), তবে কমপক্ষে একটি NUMA নোড থাকতে হবে, তাই ফিরে NUMA নোড শূন্য 2020-02-07 10: 45: 37.588896: আমি টেনস্রোফ্লো / কোর / কমন_রুনটাইম / জিপিইউ / জিপিইউ_ডভাইস.সি: 1746] দৃশ্যমান জিপিইউ ডিভাইসগুলি যুক্ত করা হচ্ছে: 0, 1, 2, 3, 4, 5, 6, 7 সংখ্যা জিপিইউ উপলব্ধ: 8


1
এই উত্তর ইতিমধ্যে পোস্ট করা হয়েছে।
Björn Lindqvist
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.