Multi-GPU এবং Multi-node Training কনফিগার করা মেশিন লার্নিং বা ডিপ লার্নিং মডেলগুলির প্রশিক্ষণকে দ্রুত এবং স্কেলেবল করার জন্য ব্যবহৃত গুরুত্বপূর্ণ কৌশল। এই কৌশলগুলি ব্যবহার করে আপনি আপনার মডেল ট্রেনিং-এর পারফরম্যান্স উন্নত করতে পারেন এবং বৃহৎ ডেটাসেটের উপর প্রশিক্ষণ চালানোর সময় ক্যালকুলেশন সময় কমাতে পারেন।
1. Multi-GPU Training
Multi-GPU Training এর মাধ্যমে একটি সিঙ্গেল সিস্টেমে একাধিক GPU ব্যবহার করে ট্রেনিং প্রক্রিয়া সম্পন্ন করা হয়। এতে মডেলের বিভিন্ন অংশ একাধিক GPU তে ভাগ করা হয়, যা প্রশিক্ষণ সময় অনেক কমিয়ে দেয়।
1.1. TensorFlow এ Multi-GPU Training
TensorFlow তে Multi-GPU প্রশিক্ষণ সহজেই করা যায়। tf.distribute.Strategy API ব্যবহৃত হয়, বিশেষত MirroredStrategy।
MirroredStrategy:
- এটি একটি অন্যতম জনপ্রিয় কৌশল, যা সমস্ত GPU এর মধ্যে গ্র্যাডিয়েন্ট এবং ওয়েট আপডেটগুলি সিঙ্ক্রোনাইজ করে।
- এটি GPU এর মধ্যে ডেটা ভাগ করে এবং প্রতিটি GPU তে সমান কাজ দিয়ে পারফরম্যান্স বৃদ্ধি করে।
উদাহরণ:
import tensorflow as tf
# MirroredStrategy ব্যবহার করা
strategy = tf.distribute.MirroredStrategy()
# মডেল সংজ্ঞায়িত করা
with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# মডেল প্রশিক্ষণ
model.fit(x_train, y_train, epochs=5)
এখানে, MirroredStrategy ব্যবহার করে আমরা একাধিক GPU তে প্রশিক্ষণ চালিয়েছি। strategy.scope() এর মধ্যে মডেল তৈরি এবং প্রশিক্ষণ করা হয়।
1.2. PyTorch এ Multi-GPU Training
PyTorch এ Multi-GPU প্রশিক্ষণ করতে torch.nn.DataParallel বা torch.nn.parallel.DistributedDataParallel ব্যবহার করা হয়।
DataParallel:
- এটি একাধিক GPU তে ডেটা ভাগ করে এবং গ্র্যাডিয়েন্ট আপডেটগুলি সিঙ্ক্রোনাইজ করে।
উদাহরণ:
import torch
import torch.nn as nn
import torch.optim as optim
# মডেল সংজ্ঞায়িত করা
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# মডেল তৈরি এবং DataParallel এর মাধ্যমে Multi-GPU কনফিগার করা
model = SimpleModel()
if torch.cuda.device_count() > 1:
model = nn.DataParallel(model) # DataParallel দিয়ে একাধিক GPU তে কাজ করবে
model = model.cuda() # মডেলকে GPU তে স্থানান্তরিত করা
optimizer = optim.Adam(model.parameters(), lr=0.001)
loss_fn = nn.CrossEntropyLoss()
# প্রশিক্ষণ লুপ
for epoch in range(5):
# প্রশিক্ষণ কোড এখানে হবে
optimizer.zero_grad()
output = model(x_train) # মডেল প্রশিক্ষণ
loss = loss_fn(output, y_train)
loss.backward()
optimizer.step()
এখানে DataParallel ব্যবহার করা হয়েছে, যা স্বয়ংক্রিয়ভাবে একাধিক GPU তে প্রশিক্ষণ প্রক্রিয়া ভাগ করে নেয়।
2. Multi-node Training
Multi-node Training তে একাধিক সার্ভার বা মেশিনে প্রশিক্ষণ চালানো হয়। এটি সেই ক্ষেত্রে উপকারী যখন আপনার মডেল বা ডেটাসেট এত বড় হয়ে যায় যে একক মেশিনে ট্রেনিং করা সম্ভব হয় না। এই কৌশলটি গ্রিড বা ক্লাস্টার পরিবেশে একাধিক নোডের মধ্যে কাজ ভাগ করে দেয়।
2.1. TensorFlow এ Multi-node Training
TensorFlow তে Multi-node প্রশিক্ষণের জন্য tf.distribute.experimental.MultiWorkerMirroredStrategy ব্যবহার করা হয়। এটি একটি স্ট্র্যাটেজি যা একাধিক নোডের মধ্যে ডেটা ভাগ করে এবং সমস্ত নোডে সিঙ্ক্রোনাইজড গ্র্যাডিয়েন্ট আপডেট করে।
উদাহরণ:
import tensorflow as tf
# MultiWorkerMirroredStrategy ব্যবহার করা
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
# মডেল সংজ্ঞায়িত করা
with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# প্রশিক্ষণ
model.fit(x_train, y_train, epochs=5)
কনফিগারেশন:
- TensorFlow এর
TF_CONFIGপরিবেশ ভেরিয়েবল ব্যবহার করে ক্লাস্টারে প্রশিক্ষণ চালানো হয়। - প্রতিটি নোডের জন্য আলাদা IP অ্যাড্রেস এবং পোর্ট কনফিগারেশন দরকার।
2.2. PyTorch এ Multi-node Training
PyTorch তে Multi-node প্রশিক্ষণের জন্য DistributedDataParallel (DDP) ব্যবহৃত হয়। DDP পুরো প্রশিক্ষণ প্রক্রিয়াকে একাধিক মেশিনের মধ্যে সমানভাবে ভাগ করে এবং সিঙ্ক্রোনাইজ করে।
উদাহরণ:
import torch
import torch.nn as nn
import torch.optim as optim
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
def setup(rank, world_size):
dist.init_process_group("nccl", rank=rank, world_size=world_size)
torch.cuda.set_device(rank)
def cleanup():
dist.destroy_process_group()
# মডেল সংজ্ঞায়িত করা
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
def main(rank, world_size):
setup(rank, world_size)
model = SimpleModel().to(rank)
model = DDP(model, device_ids=[rank])
optimizer = optim.Adam(model.parameters(), lr=0.001)
loss_fn = nn.CrossEntropyLoss()
for epoch in range(5):
optimizer.zero_grad()
output = model(x_train) # মডেল প্রশিক্ষণ
loss = loss_fn(output, y_train)
loss.backward()
optimizer.step()
cleanup()
# Multi-node কনফিগারেশন: প্রশিক্ষণ চলাকালীন একাধিক মেশিনের মধ্যে কোড চালানো
কনফিগারেশন:
- world_size: ক্লাস্টারে মোট নোড সংখ্যা।
- rank: প্রতিটি নোডের অবস্থান।
- device_ids: ব্যবহার করা GPU এর সংখ্যা।
3. সারাংশ:
- Multi-GPU Training একাধিক GPU তে প্রশিক্ষণ চালানোর জন্য ব্যবহৃত হয় এবং এর মাধ্যমে প্রশিক্ষণ সময় অনেক কমানো সম্ভব।
- Multi-node Training একাধিক সার্ভার বা মেশিনের মধ্যে প্রশিক্ষণ চলানোর জন্য ব্যবহৃত হয়, বিশেষ করে বড় মডেল বা ডেটাসেটের জন্য।
- TensorFlow এবং PyTorch উভয়েই Multi-GPU এবং Multi-node প্রশিক্ষণ সমর্থন করে এবং এটি
tf.distribute.Strategyবাtorch.nn.parallel.DistributedDataParallelএর মাধ্যমে পরিচালনা করা যায়। - Multi-GPU তে একাধিক GPU তে একই কাজ ভাগ করে, এবং Multi-node তে একাধিক সার্ভারের মধ্যে কাজ ভাগ করে প্রশিক্ষণকে দ্রুত এবং স্কেলেবেল করা হয়।
Read more