পাইটর্চ জিপিইউ ব্যবহার করছে কিনা তা কীভাবে পরীক্ষা করবেন?


160

pytorchআমার জিপিইউ ব্যবহার করছে কিনা তা জানতে চাই । nvidia-smiপ্রক্রিয়া চলাকালীন জিপিইউ থেকে কোনও ক্রিয়াকলাপ আছে কিনা তা সনাক্ত করা সম্ভব তবে আমি 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

এটি আমাকে জিপিইউ GeForce GTX 950Mদ্বারা ব্যবহৃত হচ্ছে বলে PyTorch


10
আমি মনে করি এটি কেবল এই দেখায় যে এই ডিভাইসগুলি মেশিনে পাওয়া যায় তবে আমি নিশ্চিত না যে আপনি প্রতিটি জিপিইউ বা তার থেকে কতটা মেমরি ব্যবহার করছেন তা পাবেন কিনা
কুমারীও 23

4
দৌড়ানো torch.cuda.current_device()আমার জন্য সহায়ক ছিল। এটি দেখিয়েছে যে আমার জিপিইউ দুর্ভাগ্যক্রমে খুব পুরানো: "জিপিইউ জি জিফোরস জিটিএক্স 760 পাওয়া গেছে যা চুদা সক্ষমতা 3.0.০ এর।
জনিফুন

3
torch.cuda.is_available()
mrgloom

@ কুমারীও 23 এটি দেখানোর জন্য ধন্যবাদ। এমন কোনও ফাংশন কল রয়েছে যা আমাদের সেই তথ্য দেয় (প্রতিটি জিপিইউ দ্বারা কত স্মৃতি ব্যবহৃত হচ্ছে)? :)
নাথান

1
@ ফ্র্যাঙ্ক হ্যাঁ, কেবল এই আদেশটি: $ 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এটি ব্যবহার করা সম্ভব :

  • করার সরাতে নিজ নিজ থেকে tensors device:

    torch.rand(10).to(device)
  • করতে তৈরি উপর সরাসরি একটি টেন্সর device:

    torch.rand(10, device=device)

যা আসল কোড পরিবর্তন না করে সিপিইউ এবং জিপিইউর মধ্যে স্যুইচিংকে আরামদায়ক করে তোলে ।


সম্পাদনা:

ক্যাশেড এবং বরাদ্দ মেমরি সম্পর্কে কিছু প্রশ্ন এবং বিভ্রান্তি রয়েছে বলে আমি এটি সম্পর্কে কিছু অতিরিক্ত তথ্য যুক্ত করছি:

  • torch.cuda.max_memory_cached(device=None)

    প্রদত্ত ডিভাইসের জন্য বাইটে ক্যাচিং বরাদ্দকারী দ্বারা পরিচালিত সর্বাধিক জিপিইউ মেমরি ফিরে আসে।

  • torch.cuda.memory_allocated(device=None)

    প্রদত্ত ডিভাইসটির জন্য বেটারে টেনসরদের দ্বারা বর্তমান GPU মেমরির ব্যবহারটি ফিরিয়ে দেয়।


আপনি হয় deviceপোস্টের উপরে উল্লিখিত হিসাবে সরাসরি কোনও হস্তান্তর করতে পারেন বা আপনি এটিকে কিছুই ছাড়তে পারবেন না এবং এটি ব্যবহার করবে current_device()


আমি আপনার কোডটি চেষ্টা করেছি, এটি গ্রাফিক্স কার্ডকে স্বীকৃতি দেয় তবে বরাদ্দকৃত এবং ক্যাশেড উভয়ই 0 গিগাবাইট। এটি কি স্বাভাবিক বা আমার এগুলি কনফিগার করার দরকার আছে?
KubiK888

@ কুবি কে ৮৮৮ যদি আপনি কোনও গণনা না করেন তবে এটি সম্পূর্ণ স্বাভাবিক। এটি PyTorch এর মধ্যে আপনি GPU মডেলটি সনাক্ত করতে পারবেন তবে এটি অ্যাক্সেস করতে পারবেন না unlikely জিপিইউতে কয়েকটি গণনা করার চেষ্টা করুন এবং আপনার মানগুলি পরিবর্তিত হওয়া উচিত।
এমবিটি

আমি এই টিউটোরিয়ালটির উপর ভিত্তি করে একটি .py স্ক্রিপ্ট তৈরি করি - বিশ্লেষণবিধি / ব্লগ/ 2018/02/pytorch- টিউটোরিয়াল । বিশেষত বিভাগটি শুরু করে অনুলিপি করুন / আটকান ## neural network in pytorch, তারপরে আমি আপনার কোডটি শেষে যুক্ত করব। এটি এখনও ডিভাইস ব্যবহার করে দেখায়: চুদা; বরাদ্দকৃত এবং ক্যাশেডের জন্য 0 জিবি। for i in range(epoch):পিছনে প্রচারের পরে লুপের শেষে এটি সন্নিবেশ করার চেষ্টা করেছেন , এখনও সমস্ত 0 জিবি
KubiK888

1
@ কুবি কে ৮৮৮ আপনার সামঞ্জস্য থাকতে হবে, আপনি ডিভাইসগুলিতে অপারেশন করতে পারবেন না। মত 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.
হেকিমগিল

44

প্রশিক্ষণ লুপটি চালানো শুরু করার পরে, আপনি যদি নিজের প্রোগ্রামটি GPU রিসোর্সগুলি ব্যবহার করছেন এবং কোন পরিমাণে ম্যানুয়ালি এটি টার্মিনাল থেকে দেখতে চান , তবে আপনি কেবল watchহিসাবে হিসাবে ব্যবহার করতে পারেন :

$ watch -n 2 nvidia-smi

আপনি ctrl+ টিপেন না হওয়া পর্যন্ত এটি প্রতি 2 সেকেন্ডের জন্য ব্যবহারের পরিসংখ্যানকে অবিচ্ছিন্নভাবে আপডেট করবেc


আপনার যদি প্রয়োজন আরও বেশি জিপিইউ স্ট্যাটাসের উপর আরও নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনি এর 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 সঠিকভাবে কনফিগার করা এবং যে হয় জিপিইউ ব্যবহার যদিও আপনি স্থানান্তর / আপনার কোডে প্রয়োজনীয় বিবৃতি দিয়ে tensors স্থান আছে।


আপনি যদি পাইথন কোডের ভিতরে এটি করতে চান তবে এই মডিউলটি দেখুন:

https://github.com/jonsafari/nvidia-ml-py বা পাইপিতে এখানে: https://pypi.python.org/pypi/nvidia-ml-py/


2
কেবল মনে রাখবেন যে পাইটর্চ একটি ক্যাশেড জিপিইউ মেমরি বরাদ্দকারী ব্যবহার করে। আপনি নিভিডিয়া-এসএমআই-এর জন্য সম্পূর্ণ জিপিইউ-উটিল দেখতে পাবেন যদিও এটি সম্পূর্ণরূপে ব্যবহৃত হয়।
জাকুব বিয়েলান

1
@ জাকুববিয়ান ধন্যবাদ! আপনি এই আরও পড়ার জন্য একটি রেফারেন্স প্রদান করতে পারেন?
কুমারিও

1
যে watchদরকারী
javadba


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
Nn.Module এর সাবক্লাস হিসাবে সংজ্ঞায়িত কিছু ক্লাস এম দিয়ে আপডেট হয়েছে। ধরার জন্য ধন্যবাদ
8:37

9

কোনও জিপিইউ উপলব্ধ কিনা তা পরীক্ষা করতে:

torch.cuda.is_available()

যদি উপরের ফাংশনটি ফিরে আসে False,

  1. আপনার হয় জিপিইউ নেই,
  2. বা এনভিডিয়া ড্রাইভারগুলি ইনস্টল করা হয়নি যাতে ওএস জিপিইউ না দেখে,
  3. বা জিপিইউ পরিবেশগত পরিবর্তনশীল দ্বারা গোপন করা হচ্ছে CUDA_VISIBLE_DEVICES। যখন মান CUDA_VISIBLE_DEVICES-1 হয়, তখন আপনার সমস্ত ডিভাইস গোপন করা হচ্ছে। আপনি এই লাইনের সাথে কোডটিতে সেই মানটি পরীক্ষা করতে পারেন:os.environ['CUDA_VISIBLE_DEVICES']

যদি উপরের ফাংশনটি প্রত্যাবর্তন Trueকরে তবে এর অর্থ এই নয় যে আপনি জিপিইউ ব্যবহার করছেন। পাইটরঞ্চে আপনি তৈরি করার সময় আপনি ডিভাইসগুলিতে টেনারগুলি বরাদ্দ করতে পারেন। ডিফল্টরূপে, tensors জন্য বরাদ্দ পেতে 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()। তবে এটি মুদ্রার একমাত্র অংশ one এটি আপনাকে জিপিইউ (আসলে সিইউডিএ) উপলব্ধ কিনা তা বাস্তবে ব্যবহৃত হচ্ছে কিনা তা আপনাকে জানায়। সাধারণ সেটআপে আপনি নিজের ডিভাইসটিকে এমন কিছু দিয়ে সেট করবেন:

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

তবে বৃহত্তর পরিবেশে (যেমন গবেষণা) ব্যবহারকারীর আরও বেশি বিকল্প দেওয়াও সাধারণ, সুতরাং ইনপুটের উপর ভিত্তি করে তারা CUDA অক্ষম করতে পারে, CUDA আইডি নির্দিষ্ট করতে পারে ইত্যাদি। এই ক্ষেত্রে, জিপিইউ ব্যবহৃত হবে কি না তা কেবল এটি উপলব্ধ কিনা তা নির্ভর করে। ডিভাইসটি একটি মশাল ডিভাইসে সেট করার পরে, আপনি এটির typeসিআইডিএ কিনা তা যাচাই করার জন্য তার সম্পত্তিটি পেতে পারেন ।

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

আপনি এখানে আছেন যদি আপনার pytorch সবসময় দেয় কারণ Falseজন্য torch.cuda.is_available()যে সম্ভবত কারণ আপনার জিপিইউ সমর্থন ছাড়া আপনার pytorch সংস্করণ ইনস্টল করা নেই। (যেমন: আপনি ল্যাপটপে কোড আপ করে সার্ভারে টেস্ট করেছেন)।

সমাধানটি হ'ল পাইটর্চ ডাউনলোড পৃষ্ঠা থেকে ডান কমান্ডের সাহায্যে পাইটরঞ্চ পুনরায় আনইনস্টল এবং ইনস্টল করা । এই পাইটরঞ্চ ইস্যুটিও উল্লেখ করুন ।


1
যদিও আপনি যা লিখেছেন তা প্রশ্নের সাথে সম্পর্কিত। প্রশ্নটি হ'ল: "পাইটরঞ্চ জিপিইউ ব্যবহার করছে কিনা তা কীভাবে পরীক্ষা করবেন?" এবং না "পাইটর্চ যদি আমার জিপিইউ সনাক্ত না করে তবে আমি কী করব?" সুতরাং আমি বলব যে এই উত্তরটি আসলে এই প্রশ্নের সাথে সম্পর্কিত নয়। তবে আপনি এই নির্দিষ্ট সমস্যাটি সম্পর্কে আরও একটি প্রশ্ন পেতে পারেন যেখানে আপনি নিজের জ্ঞান ভাগ করতে পারেন। তা না হলে আপনি নিজেও একটি প্রশ্ন লিখতে এবং উত্তরটি একই ইস্যুতে অন্যদের সহায়তা করার জন্য করতে পারেন!
এমবিটি

-4

জিপিইউতে নীচে একটি সেন্সর তৈরি করুন:

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

প্রস্থান করবেন না, অন্য টার্মিনালটি খুলুন এবং পাইথন প্রক্রিয়াটি জিপিইউ ব্যবহার করে ব্যবহার করছে কিনা তা পরীক্ষা করুন:

$ nvidia-smi

2
আমি বিশেষভাবে এমন একটি সমাধান চেয়েছিলাম nvidia-smiযা কমান্ড লাইন থেকে জড়িত না
ভিনজি

ভাল, প্রযুক্তিগতভাবে আপনি সর্বদা আউটপুটকে যে কোনও কমান্ড-লাইন সরঞ্জাম সহ পার্স করতে পারেন nvidia-smi
পাস্তাফেরিয়ানবাদী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.