जवाबों:
यह काम करने जा रहा है:
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
।
torch.cuda.current_device()
मेरे लिए मददगार था। इससे पता चला कि मेरा जीपीयू दुर्भाग्य से बहुत पुराना है: "पाया गया GPU GPU GeForce GTX 760 जो कि क्यूडा क्षमता 3.0 का है। PyTorch अब इस GPU का समर्थन नहीं करता है क्योंकि यह बहुत पुराना है।"
torch.cuda.is_available()
$ watch -n 2 nvidia-smi
काम करता है। अधिक जानकारी के लिए, कृपया नीचे मेरा उत्तर देखें ।
जैसा कि यहां प्रस्तावित नहीं किया गया है, मैं एक विधि का उपयोग कर रहा हूं 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()
।
## neural network in pytorch
, जिसके साथ मैं अंत में आपका कोड जोड़ता हूं। यह अभी भी डिवाइस का उपयोग करके दिखाता है: कोडा; और 0Gb आवंटित और कैश्ड के लिए। for i in range(epoch):
बैक-प्रचार के बाद लूप के अंत में इसे डालने की कोशिश की , फिर भी सभी 0GB
my_tensor_on_gpu * my_tensor_on_cpu
विफल हो जाएगा।
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.
जब आप ट्रेनिंग लूप चलाना शुरू करते हैं, यदि आप इसे टर्मिनल से मैन्युअल रूप से देखना चाहते हैं कि क्या आपका प्रोग्राम 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/
watch
उपयोगी है
कार्यालय की साइट और आरंभ पृष्ठ पर, नीचे के रूप में PyTorch के लिए GPU की जाँच करें:
import torch
torch.cuda.is_available()
संदर्भ: PyTorch | आरंभ करें
व्यावहारिक दृष्टिकोण से सिर्फ एक मामूली विषयांतर:
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
यह सब मुश्किल है और इसे एक बार समझने से आपको कम डिबगिंग के साथ तेजी से निपटने में मदद मिलती है।
M()
? कहाँ M
परिभाषित किया गया है?
यह देखने के लिए कि क्या कोई GPU उपलब्ध है:
torch.cuda.is_available()
यदि उपरोक्त फ़ंक्शन वापस आता है False
,
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
लगभग सभी उत्तर यहां संदर्भ हैं 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
बस कमांड प्रॉम्प्ट या लिनक्स वातावरण से निम्न कमांड चलाते हैं।
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')
यदि आप यहाँ हैं क्योंकि आपका पाइरॉच हमेशा के लिए देता False
हैtorch.cuda.is_available()
संभवत: इसलिए कि आपने GPU समर्थन के बिना अपना पाइरॉच संस्करण स्थापित किया है। (उदा: आपने लैपटॉप में कोडित किया फिर सर्वर पर परीक्षण किया गया)।
इसका उपाय है कि pytorch डाउनलोड पेज से राइट कमांड से pytorch को फिर से अनइंस्टॉल और इंस्टॉल करें । इस pytorch समस्या को भी देखें ।
GPU पर एक टेंसर इस प्रकार बनाएँ:
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
मत छोड़ो, एक और टर्मिनल खोलें और जांचें कि क्या अजगर प्रक्रिया का उपयोग कर GPU का उपयोग कर रहा है:
$ nvidia-smi
nvidia-smi
था जो कमांड लाइन से शामिल नहीं है
nvidia-smi
।