উত্তর:
এটি কাজ করতে যাচ্ছে:
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
।
torch.cuda.current_device()
আমার জন্য সহায়ক ছিল। এটি দেখিয়েছে যে আমার জিপিইউ দুর্ভাগ্যক্রমে খুব পুরানো: "জিপিইউ জি জিফোরস জিটিএক্স 760 পাওয়া গেছে যা চুদা সক্ষমতা 3.0.০ এর।
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
এটি ব্যবহার করা সম্ভব :
করার সরাতে নিজ নিজ থেকে 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()
।
## neural network in pytorch
, তারপরে আমি আপনার কোডটি শেষে যুক্ত করব। এটি এখনও ডিভাইস ব্যবহার করে দেখায়: চুদা; বরাদ্দকৃত এবং ক্যাশেডের জন্য 0 জিবি। for i in range(epoch):
পিছনে প্রচারের পরে লুপের শেষে এটি সন্নিবেশ করার চেষ্টা করেছেন , এখনও সমস্ত 0 জিবি
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
আপনি 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/
watch
দরকারী
অফিস সাইট এবং সূচনা পৃষ্ঠায়, পাইটর্চের জন্য জিপিইউ নীচের মত চেক করুন:
import torch
torch.cuda.is_available()
রেফারেন্স: পাইটর্চ | শুরু করুন
ব্যবহারিক দৃষ্টিকোণ থেকে মাত্র একটি ছোটখাটো ডিগ্রেশন:
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
সংজ্ঞায়িত কোথায় ?
কোনও জিপিইউ উপলব্ধ কিনা তা পরীক্ষা করতে:
torch.cuda.is_available()
যদি উপরের ফাংশনটি ফিরে আসে False
,
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
প্রায় সব উত্তর এখানে রেফারেন্স 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
কেবল কমান্ড প্রম্পট বা লিনাক্স পরিবেশ থেকে নিম্নলিখিত কমান্ডটি চালান।
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')
আপনি এখানে আছেন যদি আপনার pytorch সবসময় দেয় কারণ False
জন্য torch.cuda.is_available()
যে সম্ভবত কারণ আপনার জিপিইউ সমর্থন ছাড়া আপনার pytorch সংস্করণ ইনস্টল করা নেই। (যেমন: আপনি ল্যাপটপে কোড আপ করে সার্ভারে টেস্ট করেছেন)।
সমাধানটি হ'ল পাইটর্চ ডাউনলোড পৃষ্ঠা থেকে ডান কমান্ডের সাহায্যে পাইটরঞ্চ পুনরায় আনইনস্টল এবং ইনস্টল করা । এই পাইটরঞ্চ ইস্যুটিও উল্লেখ করুন ।
জিপিইউতে নীচে একটি সেন্সর তৈরি করুন:
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
প্রস্থান করবেন না, অন্য টার্মিনালটি খুলুন এবং পাইথন প্রক্রিয়াটি জিপিইউ ব্যবহার করে ব্যবহার করছে কিনা তা পরীক্ষা করুন:
$ nvidia-smi
nvidia-smi
যা কমান্ড লাইন থেকে জড়িত না
nvidia-smi
।