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
ধাপ ২: CUDA ডিভাইস চেক করা
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)
ধাপ ৪: মডেল তৈরি করা এবং GPU তে স্থানান্তর করা
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)
ধাপ ৬: GPU ব্যবহার করে মডেল ট্রেনিং
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()}')
কোডের ব্যাখ্যা
- ডিভাইস চেক করা: আমরা চেক করেছি GPU উপলব্ধ আছে কিনা, এবং সে অনুযায়ী ডিভাইস সিলেক্ট করেছি।
- ডেটাসেট লোড করা: ডেটাসেট ট্রান্সফর্ম এবং ডেটালোডার ব্যবহার করে লোড করা হয়েছে।
- মডেল তৈরি: মডেল তৈরি করে
to(device)দিয়ে GPU তে স্থানান্তর করা হয়েছে। - ট্রেনিং লুপ: প্রতিটি ব্যাচের ডেটা এবং লেবেল GPU তে স্থানান্তর করে মডেল ট্রেনিং করা হয়েছে।
- মডেল সেভ এবং লোড: GPU তে সংরক্ষিত মডেল পুনরায় লোড করে ইনফারেন্স করা হয়েছে।
এভাবে, GPU ব্যবহার করে PyTorch-এ মডেল ট্রেনিং করা হয়, যা মডেলের পারফরমেন্স এবং ট্রেনিং টাইম অনেক উন্নত করে।
Read more