अगर pytorch GPU का उपयोग कर रहा है तो कैसे जांचें?


160

मैं जानना चाहूंगा कि क्या pytorchमेरे GPU का उपयोग किया जा रहा है। यह पता लगाना संभव है nvidia-smiकि क्या प्रक्रिया के दौरान GPU से कोई गतिविधि है, लेकिन मुझे pythonस्क्रिप्ट में कुछ लिखा जाना चाहिए ।

क्या ऐसा करने का कोई तरीका है?

जवाबों:


259

यह काम करने जा रहा है:

In [1]: import torch

In [2]: torch.cuda.current_device()
Out[2]: 0

In [3]: torch.cuda.device(0)
Out[3]: <torch.cuda.device at 0x7efce0b03be0>

In [4]: torch.cuda.device_count()
Out[4]: 1

In [5]: torch.cuda.get_device_name(0)
Out[5]: 'GeForce GTX 950M'

In [6]: torch.cuda.is_available()
Out[6]: True

यह बताता है कि GPU किसके GeForce GTX 950Mद्वारा उपयोग किया जा रहा है PyTorch


10
मुझे लगता है कि यह सिर्फ दिखाता है कि ये डिवाइस मशीन पर उपलब्ध हैं, लेकिन मुझे यकीन नहीं है कि क्या आप प्राप्त कर सकते हैं कि प्रत्येक जीपीयू से कितनी मेमोरी का उपयोग किया जा रहा है ..
kmario23

4
दौड़ना torch.cuda.current_device()मेरे लिए मददगार था। इससे पता चला कि मेरा जीपीयू दुर्भाग्य से बहुत पुराना है: "पाया गया GPU GPU GeForce GTX 760 जो कि क्यूडा क्षमता 3.0 का है। PyTorch अब इस GPU का समर्थन नहीं करता है क्योंकि यह बहुत पुराना है।"
जॉनीफुन

3
torch.cuda.is_available()
मर्ग्लोम

@ kmario23 इसे इंगित करने के लिए धन्यवाद। क्या कोई फ़ंक्शन कॉल है जो हमें वह जानकारी देता है (प्रत्येक GPU द्वारा कितनी मेमोरी का उपयोग किया जा रहा है)? :)
नाथन

1
@frank हां, बस यह आदेश: $ watch -n 2 nvidia-smiकाम करता है। अधिक जानकारी के लिए, कृपया नीचे मेरा उत्तर देखें
kmario23

75

जैसा कि यहां प्रस्तावित नहीं किया गया है, मैं एक विधि का उपयोग कर रहा हूं torch.device, क्योंकि यह काफी आसान है, जब सही पर टेंसर्स को इनिशियलाइज़ करना भी device

# setting device on GPU if available, else CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)
print()

#Additional Info when using cuda
if device.type == 'cuda':
    print(torch.cuda.get_device_name(0))
    print('Memory Usage:')
    print('Allocated:', round(torch.cuda.memory_allocated(0)/1024**3,1), 'GB')
    print('Cached:   ', round(torch.cuda.memory_cached(0)/1024**3,1), 'GB')

आउटपुट:

Using device: cuda

Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached:    0.6 GB

जैसा कि ऊपर उल्लेख किया गया है, deviceइसका उपयोग करना संभव है :

  • संबंधित से दसियों को स्थानांतरित करने के लिए device:

    torch.rand(10).to(device)
  • करने के लिए बनाने पर सीधे एक टेन्सर device:

    torch.rand(10, device=device)

जो वास्तविक कोड को बदले बिना सीपीयू और जीपीयू के बीच स्विचिंग को आरामदायक बनाता है ।


संपादित करें:

जैसा कि कैश्ड और आवंटित मेमोरी के बारे में कुछ प्रश्न और भ्रम हैं, मैं इसके बारे में कुछ अतिरिक्त जानकारी जोड़ रहा हूं:

  • torch.cuda.max_memory_cached(device=None)

    दिए गए डिवाइस के लिए बाइट्स में कैशिंग एलोकेटर द्वारा प्रबंधित अधिकतम GPU मेमोरी लौटाता है।

  • torch.cuda.memory_allocated(device=None)

    किसी दिए गए डिवाइस के लिए बाइट्स में वर्तमान GPU मेमोरी उपयोग को टोंस द्वारा लौटाता है।


आप deviceपोस्ट में ऊपर बताए अनुसार या तो सीधे हाथ लगा सकते हैं या आप इसे कोई नहीं छोड़ सकते हैं और इसका उपयोग करेंगे current_device()


मैंने आपके कोड की कोशिश की, यह ग्राफिक्स कार्ड को पहचानता है लेकिन आवंटित और कैश किए गए दोनों 0GB हैं। क्या यह सामान्य है या क्या मुझे उन्हें कॉन्फ़िगर करने की आवश्यकता है?
कुब्कि

@ KubiK888 यदि आपने इससे पहले पूरी तरह से सामान्य नहीं किया है। यह भी संभावना नहीं है कि आप PyTorch के भीतर GPU मॉडल का पता लगा सकते हैं, लेकिन इसे एक्सेस नहीं कर सकते। GPU पर कुछ संगणनाएँ करने का प्रयास करें और आपको यह देखना चाहिए कि मान बदलते हैं।
एमबीटी

मैं इस ट्यूटोरियल के आधार पर एक .py स्क्रिप्ट बनाता हूं - analyticsvidhya.com/blog/2018/02/pytorch-tutorial । विशेष रूप से उस सेक्शन को कॉपी / पेस्ट करना ## neural network in pytorch, जिसके साथ मैं अंत में आपका कोड जोड़ता हूं। यह अभी भी डिवाइस का उपयोग करके दिखाता है: कोडा; और 0Gb आवंटित और कैश्ड के लिए। for i in range(epoch):बैक-प्रचार के बाद लूप के अंत में इसे डालने की कोशिश की , फिर भी सभी 0GB
KubiK888

1
@ KubiK888 आपको लगातार रहना होगा, आप उपकरणों पर कार्रवाई नहीं कर सकते। जैसे कोई भी ऑपरेशन my_tensor_on_gpu * my_tensor_on_cpuविफल हो जाएगा।
एमबीटी

2
आपका उत्तर बहुत अच्छा है, लेकिन पहली डिवाइस असाइनमेंट लाइन के लिए, मैं यह बताना चाहूंगा कि सिर्फ इसलिए कि एक क्यूडा डिवाइस उपलब्ध है, इसका मतलब यह नहीं है कि हम इसका उपयोग कर सकते हैं। उदाहरण के लिए, मेरे पास मेरे भरोसेमंद पुराने कंप्यूटर में है: Found GPU0 GeForce GT 750M which is of cuda capability 3.0. PyTorch no longer supports this GPU because it is too old. The minimum cuda capability that we support is 3.5.
hekimgil

44

जब आप ट्रेनिंग लूप चलाना शुरू करते हैं, यदि आप इसे टर्मिनल से मैन्युअल रूप से देखना चाहते हैं कि क्या आपका प्रोग्राम GPU संसाधनों का उपयोग कर रहा है और किस हद तक है, तो आप बस इसमें निम्न का उपयोग कर सकते हैं watch:

$ watch -n 2 nvidia-smi

यह लगातार हर 2 सेकंड के लिए उपयोग के आँकड़े अद्यतन करेगा जब तक आप प्रेस ctrl+c


आप की आवश्यकता हो सकती आप अधिक GPU आँकड़े पर अधिक नियंत्रण की जरूरत है, तो आप उपयोग कर सकते हैं की अधिक परिष्कृत संस्करण nvidia-smiके साथ--query-gpu=... । नीचे इसका एक सरल चित्रण है:

$ watch -n 3 nvidia-smi --query-gpu=index,gpu_name,memory.total,memory.used,memory.free,temperature.gpu,pstate,utilization.gpu,utilization.memory --format=csv

जो आँकड़े कुछ इस तरह उत्पादन होगा:

यहाँ छवि विवरण दर्ज करें

नोट : अल्पविराम से अलग किए गए क्वेरी नामों के बीच कोई स्थान नहीं होना चाहिए --query-gpu=...। उन मानों को अनदेखा कर दिया जाएगा और कोई भी आँकड़े वापस नहीं किए जाएंगे।


इसके अलावा, आप जाँच सकते हैं कि क्या PyTorch की आपकी स्थापना आपके CUDA की स्थापना का सही पता लगाती है या नहीं:

In [13]: import  torch

In [14]: torch.cuda.is_available()
Out[14]: True

Trueस्टेटस का मतलब है कि PyTorch सही तरीके से कॉन्फ़िगर किया गया है और GPU का उपयोग कर रहा है, हालांकि आपको अपने कोड में आवश्यक स्टेटमेंट के साथ टेनर्स को स्थानांतरित / स्थान देना होगा।


यदि आप इसे पायथन कोड के अंदर करना चाहते हैं, तो इस मॉड्यूल को देखें:

https://github.com/jonsafari/nvidia-ml-py या यहाँ pypi में: https://pypi.python.org/pypi/nvidia-ml-py/


2
बस याद रखें कि PyTorch एक कैश्ड GPU मेमोरी एलोकेटर का उपयोग करता है। यदि आप इसका पूरी तरह से उपयोग करते हैं, तो आपको निविडिया-एसएमआई के लिए कम जीपीयू-यूटिल दिखाई दे सकता है।
जकूब बीलान

1
@JakubBielan धन्यवाद! क्या आप इस पर और अधिक पढ़ने के लिए एक संदर्भ प्रदान कर सकते हैं?
किमीरियो

1
यह watchउपयोगी है
javadba

18

कार्यालय की साइट और आरंभ पृष्ठ पर, नीचे के रूप में PyTorch के लिए GPU की जाँच करें:

import torch
torch.cuda.is_available()

संदर्भ: PyTorch | आरंभ करें


15

व्यावहारिक दृष्टिकोण से सिर्फ एक मामूली विषयांतर:

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

यह devअब पता है कि क्या कोडा या सीपीयू।

और एक अंतर है कि आप मॉडल के साथ और दसियों के साथ सौदा करते हैं जब क्यूडा में जाते हैं। यह पहली बार में थोड़ा अजीब है।

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
t1 = torch.randn(1,2)
t2 = torch.randn(1,2).to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]])
print(t2)  # tensor([[ 0.5117, -3.6247]], device='cuda:0')
t1.to(dev) 
print(t1)  # tensor([[-0.2678,  1.9252]]) 
print(t1.is_cuda) # False
t1=t1.to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]], device='cuda:0') 
print(t1.is_cuda) # True

class M(nn.Module):
def __init__(self):        
    super().__init__()        
    self.l1 = nn.Linear(1,2)

def forward(self, x):                      
    x = self.l1(x)
    return x
model = M()   # not on cuda
model.to(dev) # is on cuda (all parameters)
print(next(model.parameters()).is_cuda) #True

यह सब मुश्किल है और इसे एक बार समझने से आपको कम डिबगिंग के साथ तेजी से निपटने में मदद मिलती है।


1
क्या है M()? कहाँ Mपरिभाषित किया गया है?
साइकोरैक्स

1
कुछ वर्ग M के साथ अपडेट किया गया जो nn.Module के उपवर्ग के रूप में परिभाषित किया गया है। पकड़ने के लिए धन्यवाद।
प्रोस्टी जूल

9

यह देखने के लिए कि क्या कोई GPU उपलब्ध है:

torch.cuda.is_available()

यदि उपरोक्त फ़ंक्शन वापस आता है False,

  1. आप या तो कोई GPU है,
  2. या एनवीडिया ड्राइवरों को स्थापित नहीं किया गया है, इसलिए ओएस जीपीयू को नहीं देखता है,
  3. या GPU पर्यावरण चर द्वारा छिपाया जा रहा है CUDA_VISIBLE_DEVICES। जब मान CUDA_VISIBLE_DEVICES-1 है, तो आपके सभी उपकरण छिपे हुए हैं। आप इस लाइन के साथ कोड में उस मान की जाँच कर सकते हैं:os.environ['CUDA_VISIBLE_DEVICES']

यदि उपरोक्त फ़ंक्शन रिटर्न Trueकरता है, तो जरूरी नहीं कि आप GPU का उपयोग कर रहे हैं। Pytorch में आप डिवाइस बनाते समय दसियों को आवंटित कर सकते हैं। डिफ़ॉल्ट रूप से, दसियों को आवंटित किया जाता है cpu। यह जाँचने के लिए कि आपका टेंसर कहाँ आवंटित है:

# assuming that 'a' is a tensor created somewhere else
a.device  # returns the device where the tensor is allocated

ध्यान दें कि आप विभिन्न उपकरणों में आवंटित दसियों पर काम नहीं कर सकते। जीपीयू को एक टेंसर आवंटित करने का तरीका देखने के लिए, यहां देखें: https://pytorch.org/docs/stable/notes/cuda.html


5

लगभग सभी उत्तर यहां संदर्भ हैं torch.cuda.is_available()। हालाँकि, यह सिक्के का केवल एक हिस्सा है। यह आपको बताता है कि क्या GPU (वास्तव में CUDA) उपलब्ध है, न कि यह वास्तव में उपयोग किया जा रहा है या नहीं। एक विशिष्ट सेटअप में, आप अपने डिवाइस को कुछ इस तरह से सेट करेंगे:

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

लेकिन बड़े वातावरण (जैसे अनुसंधान) में उपयोगकर्ता को अधिक विकल्प देना भी आम है, इसलिए इनपुट के आधार पर वे CUDA को अक्षम कर सकते हैं, CUDA ID निर्दिष्ट कर सकते हैं, और इसी तरह। ऐसे में, GPU का उपयोग किया जाए या नहीं यह केवल इस बात पर आधारित नहीं है कि यह उपलब्ध है या नहीं। डिवाइस को टार्च डिवाइस पर सेट किए जाने के बाद, आप typeयह सत्यापित करने के लिए अपनी संपत्ति प्राप्त कर सकते हैं कि यह CUDA है या नहीं।

if device.type == 'cuda':
    # do something

शोधकर्ताओं के लिए अच्छा सुझाव है।
प्रोस्टि

3

बस कमांड प्रॉम्प्ट या लिनक्स वातावरण से निम्न कमांड चलाते हैं।

python -c 'import torch; print(torch.cuda.is_available())'

ऊपर को छापना चाहिए True

python -c 'import torch; print(torch.rand(2,3).cuda())'

यह एक निम्नलिखित मुद्रित करना चाहिए:

tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')

2

यदि आप यहाँ हैं क्योंकि आपका पाइरॉच हमेशा के लिए देता Falseहैtorch.cuda.is_available() संभवत: इसलिए कि आपने GPU समर्थन के बिना अपना पाइरॉच संस्करण स्थापित किया है। (उदा: आपने लैपटॉप में कोडित किया फिर सर्वर पर परीक्षण किया गया)।

इसका उपाय है कि pytorch डाउनलोड पेज से राइट कमांड से pytorch को फिर से अनइंस्टॉल और इंस्टॉल करें । इस pytorch समस्या को भी देखें ।


1
हालांकि आपने जो लिखा है वह सवाल से संबंधित है। सवाल यह है: "कैसे जाँच करें कि क्या पियोरच जीपीयू का उपयोग कर रहा है?" और अगर "PyTorch मेरे GPU का पता नहीं लगाता है तो मैं क्या कर सकता हूं?" इसलिए मैं कहूंगा कि यह जवाब वास्तव में इस सवाल का नहीं है। लेकिन आपको इस विशिष्ट मुद्दे के बारे में एक और सवाल मिल सकता है जहां आप अपना ज्ञान साझा कर सकते हैं। यदि नहीं, तो आप एक प्रश्न भी लिख सकते हैं और स्वयं को उसी मुद्दे के साथ दूसरों की मदद करने के लिए उत्तर दे सकते हैं!
एमबीटी

-4

GPU पर एक टेंसर इस प्रकार बनाएँ:

$ python
>>> import torch
>>> print(torch.rand(3,3).cuda()) 

मत छोड़ो, एक और टर्मिनल खोलें और जांचें कि क्या अजगर प्रक्रिया का उपयोग कर GPU का उपयोग कर रहा है:

$ nvidia-smi

2
मैंने विशेष रूप से एक समाधान के लिए कहा nvidia-smiथा जो कमांड लाइन से शामिल नहीं है
विन्जेई

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