PyTorch-এ GPU এবং CUDA ব্যবহার করে মডেলের প্রশিক্ষণ এবং ইনফারেন্স আরও দ্রুত করা যায়। NVIDIA GPU থাকলে এবং CUDA সাপোর্ট ইন্সটল করা থাকলে PyTorch খুব সহজে GPU-তে কাজ করতে পারে। নিচে ধাপে ধাপে GPU এবং CUDA PyTorch-এ ব্যবহার করার উপায় দেখানো হলো।
প্রথমে, আপনার সিস্টেমে CUDA এবং GPU সাপোর্ট আছে কিনা তা চেক করা জরুরি। এটি PyTorch-এ খুব সহজে চেক করা যায়:
import torch
# CUDA উপলব্ধ কিনা চেক করা
print("CUDA Available:", torch.cuda.is_available())
# যদি GPU উপলব্ধ থাকে তবে তার নাম চেক করা
if torch.cuda.is_available():
print("GPU Name:", torch.cuda.get_device_name(0))
PyTorch-এ মডেল এবং টেনসরকে GPU তে স্থানান্তর করতে .to('cuda')
বা .cuda()
ব্যবহার করা হয়। মডেল এবং ইনপুট ডেটা দুটোই GPU তে পাঠানো জরুরি, না হলে তারা CPU তে থেকেই যাবে।
# একটি সাধারণ মডেল ডিফাইন করা
class SimpleLinearModel(nn.Module):
def __init__(self):
super(SimpleLinearModel, self).__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
# মডেল তৈরি এবং GPU তে স্থানান্তর করা
model = SimpleLinearModel().to('cuda')
# ইনপুট ডেটাও GPU তে স্থানান্তর করা
X = torch.tensor([[1.0], [2.0], [3.0], [4.0]]).to('cuda')
Y = torch.tensor([[2.0], [4.0], [6.0], [8.0]]).to('cuda')
import torch.nn as nn
import torch.optim as optim
criterion = nn.MSELoss() # লস ফাংশন
optimizer = optim.SGD(model.parameters(), lr=0.01) # অপটিমাইজার
মডেল ট্রেনিংয়ের সময় ইনপুট, আউটপুট, এবং মডেল সকলকে GPU তে রাখতে হবে। নীচে GPU ব্যবহার করে মডেল ট্রেনিংয়ের একটি উদাহরণ দেওয়া হল:
epochs = 1000
for epoch in range(epochs):
# ইনপুট এবং আউটপুট ডেটা GPU তে স্থানান্তরিত
optimizer.zero_grad() # গ্রেডিয়েন্ট রিসেট
outputs = model(X) # ফরোয়ার্ড পাস (GPU তে)
loss = criterion(outputs, Y) # লস ক্যালকুলেশন
loss.backward() # ব্যাকপ্রোপাগেশন
optimizer.step() # প্যারামিটার আপডেট
if (epoch+1) % 100 == 0:
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}')
মডেল ইভ্যালুয়েশন এবং টেস্টিংয়ের জন্যও ইনপুট ডেটা GPU তে থাকতে হবে। উদাহরণস্বরূপ:
# মডেল ইভ্যালুয়েশন
model.eval()
# টেস্ট ডেটা GPU তে পাঠানো
test_input = torch.tensor([[5.0]]).to('cuda')
# মডেল ইনফারেন্স
with torch.no_grad(): # গ্রেডিয়েন্ট ক্যালকুলেশন বন্ধ
test_output = model(test_input)
print(f'Prediction for input 5.0: {test_output.item()}')
যখন GPU তে মডেল প্রেডিকশন বা লস ক্যালকুলেশন করা হয়, তখন যদি ফলাফল প্রিন্ট করতে চান বা অন্য কাজে ব্যবহার করতে চান, তবে সেটিকে CPU তে স্থানান্তর করা লাগে।
# মডেল আউটপুটকে CPU তে স্থানান্তর করা
cpu_output = test_output.to('cpu')
print(f'Output on CPU: {cpu_output.item()}')
torch.cuda.is_available()
।.to('cuda')
বা .cuda()
।.to('cpu')
ব্যবহার করে।PyTorch-এ CUDA এবং GPU সাপোর্ট ব্যবহার করে মডেল ট্রেনিং এবং ইনফারেন্স অনেক দ্রুত করা যায়, যা বড় ডেটাসেট এবং জটিল মডেল প্রশিক্ষণের জন্য বিশেষভাবে কার্যকর।
GPU (Graphics Processing Unit) মডেল ট্রেনিংকে দ্রুত করার ক্ষেত্রে অত্যন্ত কার্যকর, বিশেষ করে ডিপ লার্নিং মডেল ট্রেনিংয়ের জন্য। GPU মূলত একই ধরনের গণনা একযোগে অনেকবার করতে সক্ষম, যা মডেল ট্রেনিংয়ের পারফরম্যান্স বাড়িয়ে দেয়। নিচে GPU কীভাবে মডেল ট্রেনিং দ্রুত করে, তার কারণ এবং প্রক্রিয়া ব্যাখ্যা করা হলো:
Parallelism (প্যারালেল প্রসেসিং):
Memory Bandwidth (মেমোরি ব্যান্ডউইথ):
প্যারালেলাইজড ম্যাট্রিক্স অপারেশন:
মডেল প্যারামিটার আপডেট:
Batch Processing:
PyTorch-এ GPU ব্যবহার করে মডেল ট্রেনিং করা খুবই সহজ। আপনি একটি মডেল এবং ডেটা টেন্সরকে .to(device)
কমান্ড ব্যবহার করে GPU তে সরাতে পারেন।
প্রথমে GPU আছে কিনা এবং PyTorch GPU সাপোর্ট করছে কিনা তা চেক করতে হবে:
import torch
# GPU পাওয়া যাচ্ছে কিনা চেক করা
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("Using device:", device)
# মডেল তৈরি করা
model = SimpleNN()
# মডেল এবং ডেটা GPU তে সরানো
model = model.to(device)
inputs = inputs.to(device)
targets = targets.to(device)
for epoch in range(num_epochs):
for inputs, targets in train_loader:
inputs, targets = inputs.to(device), targets.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
Batch Size বাড়ানো:
মডেল আর্কিটেকচার অপটিমাইজ করা:
মেমোরি ম্যানেজমেন্ট:
মিক্সড-প্রিসিশন ট্রেনিং:
torch.cuda.amp
মডিউল ব্যবহার করে মিক্সড-প্রিসিশন ট্রেনিং করতে পারেন, যা GPU মেমোরি ব্যবহার অপ্টিমাইজ করে এবং মডেল ট্রেনিং দ্রুত করে।GPU মডেল ট্রেনিং দ্রুত করার মূল কারণ হলো প্যারালেল প্রসেসিং এবং উচ্চ মেমোরি ব্যান্ডউইথ, যা ম্যাট্রিক্স অপারেশন এবং ব্যাকপ্রোপাগেশনের মতো ভারী গণনাগুলি দ্রুত করতে সাহায্য করে। GPU সঠিকভাবে ব্যবহার করলে এবং ট্রেনিং কোড অপ্টিমাইজ করলে মডেলের পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়ানো যায়।
PyTorch-এ CUDA এবং Torch এর ইন্টিগ্রেশন ব্যবহার করে GPU তে মডেল ট্রেনিং এবং ইনফারেন্স করা যায়। PyTorch স্বয়ংক্রিয়ভাবে CUDA ডিভাইস সাপোর্ট করে, এবং যদি GPU উপস্থিত থাকে, তাহলে তা ব্যবহার করা সহজ। নিচে CUDA এবং Torch এর ইন্টিগ্রেশন করার একটি উদাহরণ দেওয়া হয়েছে।
প্রথমে, আপনার সিস্টেমে CUDA ডিভাইস (GPU) আছে কিনা তা চেক করা উচিৎ।
import torch
# CUDA ডিভাইস আছে কিনা তা চেক করা
cuda_available = torch.cuda.is_available()
print(f"CUDA available: {cuda_available}")
torch.cuda.is_available()
: যদি GPU এবং CUDA সাপোর্টেড ড্রাইভার ইনস্টল থাকে, তাহলে এটি True
রিটার্ন করে।GPU তে মডেল এবং ডেটা মুভ করতে .to(device)
বা .cuda()
ব্যবহার করা হয়।
# ডিভাইস সেট করা (CUDA থাকলে GPU, নাহলে CPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# মডেল ইনস্ট্যানশিয়েট করা এবং GPU তে মুভ করা
model = CustomModel().to(device)
# ইনপুট টেন্সর তৈরি করা এবং GPU তে মুভ করা
dummy_input = torch.randn(1, 1, 28, 28).to(device)
# মডেলের মাধ্যমে আউটপুট পাওয়া
output = model(dummy_input)
print(output)
torch.device()
: এটি ডিভাইস (CPU বা GPU) সিলেক্ট করার জন্য ব্যবহার করা হয়।.to(device)
: মডেল এবং টেন্সরকে নির্দিষ্ট ডিভাইসে (GPU বা CPU) মুভ করে।.cuda()
একই কাজ করে, কিন্তু .to(device)
ব্যবহার করা ভালো কারণ এটি ডিভাইস ডাইনামিকভাবে সিলেক্ট করতে দেয়।GPU তে মডেল ট্রেনিং করার জন্য ট্রেনিং লুপেও ডিভাইস সেট করা প্রয়োজন। নিচে একটি উদাহরণ দেওয়া হলো:
# ট্রেনিং লুপ
for epoch in range(num_epochs):
for images, labels in train_loader:
# ইমেজ এবং লেবেলকে ডিভাইসে মুভ করা
images = images.to(device)
labels = labels.to(device)
# ফরওয়ার্ড পাস
outputs = model(images)
loss = criterion(outputs, labels)
# গ্রেডিয়েন্ট রিসেট করা
optimizer.zero_grad()
# ব্যাকওয়ার্ড পাস এবং অপ্টিমাইজেশন
loss.backward()
optimizer.step()
print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")
ডিভাইস সেট করা:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
দ্বারা ডিভাইস সিলেক্ট করা হয়েছে। যদি GPU উপস্থিত থাকে, তাহলে এটি cuda
, নাহলে cpu
সিলেক্ট হবে।ডেটা এবং মডেল মুভ করা:
images.to(device)
এবং labels.to(device)
দ্বারা ডেটা মুভ করা হয়েছে।model.to(device)
দ্বারা GPU তে মুভ করা হয়েছে।ফরওয়ার্ড এবং ব্যাকওয়ার্ড পাস:
DataLoader
-এ num_workers
প্যারামিটার ব্যবহার করতে পারেন।torch.backends.cudnn.benchmark = True
ব্যবহার করলে CUDA অপ্টিমাইজেশন সক্ষম হয়, যা ট্রেনিং পারফরম্যান্স বাড়াতে পারে।এভাবে CUDA এবং Torch ইন্টিগ্রেশন করে GPU তে মডেল ট্রেনিং ও ইনফারেন্স করা যায়, যা মডেল ট্রেনিংকে দ্রুত এবং ইফিশিয়েন্ট করে তোলে।
PyTorch-এ মডেল এবং ডেটা কে GPU তে স্থানান্তর করার জন্য cuda
ডিভাইস ব্যবহার করা হয়। এটি মডেল ট্রেনিং এবং ইনফারেন্সের পারফর্ম্যান্স উল্লেখযোগ্যভাবে বাড়াতে পারে। নিচে GPU তে মডেল এবং ডেটা স্থানান্তরের পদ্ধতি এবং একটি উদাহরণ দেখানো হলো।
PyTorch-এ GPU তে মডেল স্থানান্তর করতে হলে, মডেলের ইনস্ট্যান্সকে .to(device)
অথবা .cuda()
দিয়ে GPU ডিভাইসে স্থানান্তর করতে হয়।
# ডিভাইস চেক করা
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# মডেল তৈরি করা
model = SimpleNN(input_size=2, hidden_size=5, output_size=1)
# মডেলকে GPU তে স্থানান্তর করা
model = model.to(device)
মডেলের মতোই, ইনপুট ডেটাকেও GPU তে স্থানান্তর করতে হবে যাতে মডেল ট্রেনিং বা ইনফারেন্সের সময় ডেটা এবং মডেল একই ডিভাইসে থাকে।
# ইনপুট ডেটা তৈরি করা
input_data = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
# ডেটাকে GPU তে স্থানান্তর করা
input_data = input_data.to(device)
এখানে একটি সম্পূর্ণ উদাহরণ দেখানো হলো যেখানে মডেল এবং ডেটা দুটোই GPU তে স্থানান্তর করা হয়েছে এবং মডেল ট্রেনিং করা হয়েছে।
import torch
import torch.nn as nn
import torch.optim as optim
# একটি সাধারণ নিউরাল নেটওয়ার্ক তৈরি
class SimpleNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleNN, self).__init__()
self.hidden = nn.Linear(input_size, hidden_size)
self.output = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = torch.relu(self.hidden(x))
x = self.output(x)
return x
# ডিভাইস চেক করা
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# মডেল তৈরি এবং GPU তে স্থানান্তর করা
model = SimpleNN(input_size=2, hidden_size=5, output_size=1).to(device)
# Criterion এবং Optimizer ইনিশিয়ালাইজ
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# ডেটাসেট উদাহরণ এবং GPU তে স্থানান্তর করা
train_data = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]]).to(device)
train_target = torch.tensor([[0.5], [1.5], [2.5], [3.5]]).to(device)
# মডেল ট্রেনিং লুপ
for epoch in range(100):
model.train() # মডেলকে ট্রেন মোডে সেট করা
optimizer.zero_grad() # গ্রেডিয়েন্ট রিসেট করা
output = model(train_data) # Forward Pass
loss = criterion(output, train_target) # Loss Calculation
loss.backward() # Backward Pass
optimizer.step() # Optimizer Step
# প্রতিটি ১০ এপক পর পর লস প্রিন্ট করা
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')
torch.cuda.is_available()
দিয়ে চেক করা যায়)।device
নামক ভ্যারিয়েবল ব্যবহার করেন যাতে CPU এবং GPU এর মধ্যে সহজে সুইচ করা যায়। উদাহরণ: model.to(device)
, input_data.to(device)
।এভাবে PyTorch-এ GPU তে মডেল এবং ডেটা স্থানান্তর করা হয় এবং পারফর্ম্যান্স উন্নত করা যায়।
PyTorch-এ GPU ব্যবহার করে মডেল ট্রেনিং করার জন্য NVIDIA-এর CUDA সমর্থিত GPU এবং PyTorch-এ CUDA ইন্টিগ্রেশন থাকা দরকার। GPU ব্যবহার করে মডেল ট্রেনিং করলে মডেলের পারফরমেন্স এবং ট্রেনিং স্পিড অনেক উন্নত হয়। নিচে উদাহরণসহ ব্যাখ্যা করা হয়েছে কীভাবে PyTorch-এ GPU ব্যবহার করে মডেল ট্রেনিং করা যায়।
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
GPU উপলব্ধ আছে কিনা তা যাচাই করতে:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'Using device: {device}')
এখানে, torch.cuda.is_available()
চেক করে GPU উপলব্ধ কিনা। যদি উপলব্ধ হয়, আমরা CUDA ডিভাইস ব্যবহার করবো, অন্যথায় CPU ব্যবহার করবো।
আমরা MNIST ডাটাসেট ব্যবহার করবো, এবং ট্রান্সফর্মেশন অ্যাপ্লাই করবো।
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(28 * 28, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 10)
def forward(self, x):
x = x.view(-1, 28 * 28) # ইনপুট ফ্ল্যাট করা
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# মডেল ইনস্ট্যান্স তৈরি এবং GPU তে স্থানান্তর করা
model = SimpleNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
def train_model(model, train_loader, criterion, optimizer, device):
model.train() # মডেলকে ট্রেনিং মোডে সেট করা
for images, labels in train_loader:
# ইমেজ এবং লেবেলকে GPU তে স্থানান্তর করা
images, labels = images.to(device), labels.to(device)
# ফোরওয়ার্ড পাস
outputs = model(images)
loss = criterion(outputs, labels)
# ব্যাকওয়ার্ড পাস এবং অপ্টিমাইজেশন
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Training completed for one epoch with loss: {loss.item():.4f}')
# ট্রেনিং চালানো
train_model(model, train_loader, criterion, optimizer, device)
torch.save(model.state_dict(), 'simple_nn_model_gpu.pth')
লোড করা মডেলটি GPU তে ব্যবহার করবো:
# মডেলের নতুন ইনস্ট্যান্স তৈরি এবং GPU তে স্থানান্তর করা
loaded_model = SimpleNN().to(device)
loaded_model.load_state_dict(torch.load('simple_nn_model_gpu.pth'))
loaded_model.eval()
# একটি ব্যাচ থেকে একটি ইমেজ এবং লেবেল নেওয়া
images, labels = next(iter(train_loader))
image = images[0].unsqueeze(0).to(device) # একটি ইমেজ নিয়ে এক্সট্রা ব্যাচ ডাইমেনশন যোগ করা
# মডেল দিয়ে প্রেডিকশন করা
with torch.no_grad():
output = loaded_model(image)
_, predicted = torch.max(output, 1)
print(f'Predicted: {predicted.item()}, Actual: {labels[0].item()}')
to(device)
দিয়ে GPU তে স্থানান্তর করা হয়েছে।এভাবে, GPU ব্যবহার করে PyTorch-এ মডেল ট্রেনিং করা হয়, যা মডেলের পারফরমেন্স এবং ট্রেনিং টাইম অনেক উন্নত করে।
Read more