DeepSpeed এবং Mixed Precision Training
DeepSpeed হলো মাইক্রোসফটের একটি ওপেন সোর্স লাইব্রেরি যা বড় মডেল Training এবং ইনফারেন্সকে দ্রুততর এবং কার্যকরী করার জন্য তৈরি করা হয়েছে। এই লাইব্রেরির একটি গুরুত্বপূর্ণ ফিচার হলো Mixed Precision Training, যা Training প্রক্রিয়াকে দ্রুত এবং মেমোরি ব্যবস্থাপনাকে উন্নত করতে সাহায্য করে। নিচে DeepSpeed এবং Mixed Precision Training-এর সংযোগ, সুবিধা এবং কাজের পদ্ধতি আলোচনা করা হলো।
Mixed Precision Training
Mixed Precision Training হল একটি টেকনিক যেখানে Training-এর সময় ফ্লোট ১৬ (FP16) এবং ফ্লোট ৩২ (FP32) ডেটা টাইপের মিশ্রণ ব্যবহার করা হয়। এটি মডেল Training করার সময় মেমোরি ব্যবস্থাপনা উন্নত করে এবং Training স্পিড বৃদ্ধি করে।
কীভাবে কাজ করে:
- FP16: মডেলের কিছু অংশ FP16 প্রেসিশনে Training হয়, যা মেমোরি খরচ কমায়।
- FP32: কিছু অংশ FP32 প্রেসিশনে রাখা হয়, বিশেষত যখন উচ্চ প্রেসিশন প্রয়োজন হয়, যেমন গ্রেডিয়েন্ট আপডেটের সময়।
- গ্রেডিয়েন্ট স্কেলিং: FP16 প্রেসিশনের কারণে গ্রেডিয়েন্টের মান ছোট হতে পারে, তাই গ্রেডিয়েন্ট স্কেলিং ব্যবহার করা হয়, যা Training-এর সময় Stability নিশ্চিত করে।
সুবিধা:
- মেমোরি সাশ্রয়: FP16 ব্যবহার করে Training-এর সময় মেমোরি খরচ উল্লেখযোগ্যভাবে কমে যায়।
- Training স্পিড বৃদ্ধি: কম প্রেসিশনের কারণে কম্পিউটেশনাল কার্যকলাপ দ্রুত হয়, যা Training স্পিড বাড়ায়।
- GPU ব্যবহার: Modern GPUs, যেমন NVIDIA V100 এবং A100, FP16-এর সাথে দ্রুততর কার্যকলাপ নিশ্চিত করে।
DeepSpeed এর Mixed Precision Training
DeepSpeed Mixed Precision Training এর সাথে সমন্বিতভাবে কাজ করে, যাতে Training প্রক্রিয়ায় সর্বাধিক মেমোরি ব্যবস্থাপনা এবং গতি বৃদ্ধি পায়।
DeepSpeed-এর Mixed Precision Training-এর বৈশিষ্ট্য:
- স্বয়ংক্রিয় স্কেলিং: DeepSpeed মডেলের Training সময় FP16 এবং FP32 প্রেসিশনের মধ্যে সঠিকভাবে ভারসাম্য রক্ষা করে।
- গ্রেডিয়েন্ট স্কেলিং: DeepSpeed গ্রেডিয়েন্ট স্কেলিং-এর মাধ্যমে FP16 গ্রেডিয়েন্টের স্থিতিশীলতা নিশ্চিত করে।
- মেমোরি অপ্টিমাইজেশন: DeepSpeed Mixed Precision Training-কে মডেলের মেমোরি ব্যবস্থাপনার জন্য আরও কার্যকরী করে তোলে।
উদাহরণ:
নিচে PyTorch এবং DeepSpeed ব্যবহার করে Mixed Precision Training কিভাবে বাস্তবায়ন করা হয় তার একটি উদাহরণ দেওয়া হলো:
import torch
import torch.nn as nn
import deepspeed
from torch.cuda.amp import autocast, GradScaler
# সিম্পল নিউরাল নেটওয়ার্ক তৈরি
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(10, 50)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(50, 2)
def forward(self, x):
x = self.relu(self.fc1(x))
return self.fc2(x)
# মডেল তৈরি এবং DeepSpeed ইনিশিয়ালাইজেশন
model = SimpleNN()
model_engine, optimizer, _, _ = deepspeed.initialize(model=model)
# গ্রেডিয়েন্ট স্কেলার তৈরি করা
scaler = GradScaler()
# Training ডেটা তৈরি
data = torch.randn(100, 10).to('cuda')
labels = torch.randint(0, 2, (100,)).to('cuda')
# Training Loop
for epoch in range(10): # 10 Epochs
optimizer.zero_grad() # গ্রেডিয়েন্ট শূন্য করা
with autocast(): # Mixed Precision Context
outputs = model_engine(data) # মডেলের পূর্বাভাস
loss = nn.CrossEntropyLoss()(outputs, labels) # লস গণনা
scaler.scale(loss).backward() # গ্রেডিয়েন্ট স্কেল করা
scaler.step(optimizer) # অপ্টিমাইজারের স্টেপ
scaler.update() # স্কেলার আপডেট
print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')
কোডের ব্যাখ্যা:
- autocast(): FP16 প্রেসিশনে Training চালানোর জন্য Mixed Precision Context সক্রিয় করে।
- GradScaler: FP16 গ্রেডিয়েন্টের স্থিতিশীলতা নিশ্চিত করতে ব্যবহার করা হয়।
- Training Loop: Training Loop-এ FP16 প্রেসিশন ব্যবহার করা হচ্ছে, যা মেমোরি খরচ কমায় এবং Training স্পিড বাড়ায়।
সারসংক্ষেপ
- DeepSpeed: বড় মডেল Training-এর জন্য একটি শক্তিশালী ফ্রেমওয়ার্ক যা Mixed Precision Training সমর্থন করে।
- Mixed Precision Training: FP16 এবং FP32 প্রেসিশনের মিশ্রণ ব্যবহার করে Training-এর সময় মেমোরি খরচ কমায় এবং স্পিড বাড়ায়।
- DeepSpeed-এর সুবিধা: মডেলের Training সময় GPU মেমোরি ব্যবস্থাপনা এবং Training স্পিড উল্লেখযোগ্যভাবে উন্নত করে।
DeepSpeed Mixed Precision Training-এর মাধ্যমে বড় মডেল Training এর সময় কার্যকারিতা এবং মেমোরি দক্ষতা বৃদ্ধি পায়, যা AI এবং ডিপ লার্নিং প্রকল্পের সফলতার জন্য অত্যন্ত গুরুত্বপূর্ণ
Mixed Precision Training হলো একটি ডীপ লার্নিং কৌশল, যা training প্রক্রিয়ায় বিভিন্ন precision (যেমন FP16 এবং FP32) ব্যবহার করে। এটি মূলত GPU (Graphics Processing Unit) এর computational capabilities বৃদ্ধি এবং memory efficiency বাড়াতে ব্যবহৃত হয়। Mixed precision training মডেলকে FP16 (half precision) এবং FP32 (single precision) এর সংমিশ্রণে train করে, যা computational overhead কমায় এবং training speed বৃদ্ধি করে।
Mixed Precision Training এর উদ্দেশ্য
Memory Efficiency:
- FP16 precision ব্যবহারের মাধ্যমে memory utilization প্রায় ৫০% কমানো যায়, যা বড় মডেল এবং ডেটাসেটগুলোর জন্য খুবই গুরুত্বপূর্ণ। এটি GPU memory constraints কমায় এবং বড় মডেল সহজে train করা সম্ভব করে।
Faster Computation:
- FP16 calculations FP32 এর তুলনায় দ্রুত হয়, কারণ FP16 এর জন্য কম bits প্রয়োজন হয়। এটি উচ্চ throughput এবং দ্রুত training সময় নিশ্চিত করে।
Increased Throughput:
- Mixed precision training এর মাধ্যমে একসাথে বেশি batch size ব্যবহার করা সম্ভব, যা training throughput বৃদ্ধি করে।
Reduced Training Time:
- GPU তে FP16 computation সুবিধা পেলে training সময় উল্লেখযোগ্যভাবে কমে যায়।
Mixed Precision Training এর উপকারিতা
| সুবিধা | বর্ণনা |
|---|---|
| Memory Efficiency | FP16 precision ব্যবহার করে memory utilization ৫০% পর্যন্ত কমানো যায়। |
| Faster Computation | FP16 calculations FP32 এর তুলনায় দ্রুততর হয়, যা computational speed বাড়ায়। |
| Increased Batch Size | Mixed Precision Training এর মাধ্যমে বড় batch size ব্যবহার করা সম্ভব। |
| Cost Reduction | কম memory consumption এবং দ্রুত training এর ফলে training cost কমে যায়। |
| Real-time Inference | Quantization সহ Mixed Precision Training বাস্তব সময়ের inference এর জন্য উপকারী। |
Mixed Precision Training এর প্রয়োজনীয়তা
Large Model Training:
- বড় মডেল যেমন BERT, GPT, এবং Vision Transformers এর জন্য memory constraint সাধারণত একটি বড় সমস্যা। Mixed Precision Training এর মাধ্যমে GPU memory কম ব্যবহার করা সম্ভব।
Resource-Constrained Environments:
- যখন computational resources সীমিত থাকে, তখন Mixed Precision Training ব্যবহার করে মডেলকে দক্ষতার সাথে train করা যায়।
Faster Prototyping:
- Mixed Precision Training দ্রুত iteration এর সুযোগ দেয়, যার ফলে নতুন architectures পরীক্ষা করা এবং দ্রুত ফলাফল পাওয়া যায়।
Training Stability:
- Proper loss scaling ব্যবহার করে, Mixed Precision Training গতি বাড়ায় এবং convergence কে উন্নত করে, যা training stability বাড়ায়।
Mixed Precision Training কিভাবে কাজ করে
Mixed Precision Training সাধারণত FP16 এবং FP32 এর মধ্যে সুইচ করে কাজ করে:
Model Weights and Gradients:
- মডেলের weights এবং gradients FP32 এ সংরক্ষণ করা হয়, যা numerical stability এবং precision বজায় রাখে।
Forward Pass:
- Forward pass FP16 এ সম্পন্ন হয়, যা computational speed বাড়ায়।
Loss Scaling:
- Gradient values FP16 এ ছোট হতে পারে, যা underflow এর সম্ভাবনা বাড়ায়। তাই, loss scaling ব্যবহার করে loss value গুলোকে scale করা হয়, যা gradient calculation এর সময় numerical stability নিশ্চিত করে।
Backward Pass:
- Backward pass এর সময় gradients গুলোকে FP32 এ আপডেট করা হয়।
উদাহরণ: Mixed Precision Training in PyTorch
import torch
import torch.nn as nn
import torch.optim as optim
from torch.cuda.amp import autocast, GradScaler
# Model তৈরি করা
model = MyModel().to("cuda")
optimizer = optim.Adam(model.parameters(), lr=0.001)
scaler = GradScaler() # Gradient scaler তৈরি করা
# Training Loop
for epoch in range(num_epochs):
for inputs, labels in dataloader:
inputs, labels = inputs.to("cuda"), labels.to("cuda")
optimizer.zero_grad()
with autocast(): # FP16 computation
outputs = model(inputs)
loss = criterion(outputs, labels)
# Scale এবং Backpropagation
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
উপসংহার
Mixed Precision Training একটি গুরুত্বপূর্ণ কৌশল যা মডেল training এর সময় memory efficiency এবং computational speed বাড়ায়। এটি বড় মডেলগুলোর জন্য প্রয়োজনীয়, যেখানে GPU memory constraints এবং computational power চ্যালেঞ্জ হয়ে দাঁড়ায়। Proper implementation এবং tuning এর মাধ্যমে Mixed Precision Training ডীপ লার্নিং এ দ্রুত ফলাফল এবং উন্নত performance নিশ্চিত করতে সক্ষম।
Float16 এবং Float32 Precision ব্যবহার
Floating point precision হলো কম্পিউটারে সংখ্যা ধারণের একটি পদ্ধতি, যা সংখ্যার গুণগত মান এবং অ্যাকুরেসি নির্ধারণ করে। ডিপ লার্নিংয়ে, Floating point precision-এর ব্যবহার Training এবং ইনফারেন্সের সময় মেমোরি ব্যবস্থাপনা এবং গতি উন্নত করতে সহায়ক। এখানে Float16 (FP16) এবং Float32 (FP32) precision-এর সুবিধা, ব্যবহার এবং উভয়ের মধ্যে তুলনা করা হবে।
১. Float32 Precision (FP32)
Float32 বা Single Precision হলো সংখ্যা ধারণের একটি পদ্ধতি যেখানে প্রতিটি সংখ্যা 32-বিট ব্যবহার করে। এটি সাধারণত ডিপ লার্নিংয়ে ব্যবহৃত হয় কারণ এটি উচ্চতর গুণগত মান এবং অ্যাকুরেসি প্রদান করে।
বৈশিষ্ট্য:
- বিট সংখ্যা: 32-বিট (1-বিট সাইন, 8-বিট এক্সপোনেন্ট, 23-বিট ম্যানটিসা)
- ব্যাপ্তি: প্রায় 3.4 × 10<sup>38</sup> (ধনাত্মক এবং ঋণাত্মক)
- গুণগত মান: FP32 সাধারণত গুণগত মানে যথেষ্ট উচ্চ এবং ছোট মানগুলি সঠিকভাবে ধারণ করতে সক্ষম।
ব্যবহার:
- FP32 সাধারণত ডিপ লার্নিংয়ে, বিশেষ করে Training এবং গ্রেডিয়েন্ট গণনায় ব্যবহৃত হয়, যেখানে উচ্চ অ্যাকুরেসি প্রয়োজন হয়।
- FP32 অনেক নিউরাল নেটওয়ার্ক মডেলে ব্যবহার করা হয় যেমন CNN, RNN, এবং Transformer মডেল।
২. Float16 Precision (FP16)
Float16 বা Half Precision হলো একটি সংখ্যা ধারণের পদ্ধতি যেখানে প্রতিটি সংখ্যা 16-বিট ব্যবহার করে। এটি কম্পিউটেশনে কম মেমোরি ব্যবহার এবং দ্রুত গতি নিশ্চিত করে, তবে এর গুণগত মান FP32 এর তুলনায় কম।
বৈশিষ্ট্য:
- বিট সংখ্যা: 16-বিট (1-বিট সাইন, 5-বিট এক্সপোনেন্ট, 10-বিট ম্যানটিসা)
- ব্যাপ্তি: প্রায় 6.1 × 10<sup>4</sup> (ধনাত্মক এবং ঋণাত্মক)
- গুণগত মান: FP16 গুণগত মানে কিছুটা কম হতে পারে, এবং এই কারণে বিশেষভাবে উচ্চ মানের গাণিতিক গণনার জন্য সাবধানতা অবলম্বন করতে হয়।
ব্যবহার:
- FP16 সাধারণত Mixed Precision Training-এ ব্যবহৃত হয়, যেখানে Training-এর সময় মেমোরি ব্যবহারের সাশ্রয় নিশ্চিত করতে এবং Training স্পিড বাড়াতে সাহায্য করে।
- FP16-এর সাথে মডেল Training করার সময় গুণগত মান বজায় রাখতে গ্রেডিয়েন্ট স্কেলিং ব্যবহার করা হয়।
৩. FP16 এবং FP32 এর মধ্যে তুলনা
| বৈশিষ্ট্য | Float32 (FP32) | Float16 (FP16) |
|---|---|---|
| বিট সংখ্যা | 32-বিট | 16-বিট |
| ব্যাপ্তি | ±3.4 × 10<sup>38</sup> | ±6.1 × 10<sup>4</sup> |
| গুণগত মান | উচ্চ | মাঝারি |
| মেমোরি খরচ | বেশি | কম |
| গতি | ধীর | দ্রুত |
| ব্যবহার | Training এবং ইনফারেন্স | Mixed Precision Training |
৪. Mixed Precision Training
Mixed Precision Training FP16 এবং FP32 এর সম্মিলিত ব্যবহারে Training স্পিড বৃদ্ধি ও মেমোরি ব্যবস্থাপনা উন্নত করে।
উপকারিতা:
- মেমোরি ব্যবস্থাপনা: FP16 ব্যবহার করে মেমোরি খরচ কমানো সম্ভব হয়।
- গতি বৃদ্ধি: FP16 ক্যালকুলেশন FP32 এর তুলনায় দ্রুত হতে পারে।
- GPU এর সম্পূর্ণ ব্যবহার: Modern GPUs (যেমন NVIDIA V100, A100) FP16 এর সাথে অপ্টিমাইজ করা, যা Training গতি বাড়ায়।
উদাহরণ কোড:
import torch
from torch.cuda.amp import autocast, GradScaler
# সিম্পল নিউরাল নেটওয়ার্ক তৈরি
model = SimpleNN()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# গ্রেডিয়েন্ট স্কেলার তৈরি
scaler = GradScaler()
for data, labels in train_loader:
optimizer.zero_grad()
with autocast(): # Mixed Precision Context
outputs = model(data)
loss = criterion(outputs, labels)
scaler.scale(loss).backward() # গ্রেডিয়েন্ট স্কেল করা
scaler.step(optimizer) # অপ্টিমাইজারের স্টেপ
scaler.update() # স্কেলার আপডেট
সারসংক্ষেপ
- Float32: উচ্চ গুণগত মানের জন্য আদর্শ, তবে মেমোরি খরচ বেশি।
- Float16: মেমোরি সাশ্রয় করে এবং Training গতি বাড়ায়, তবে কিছুক্ষেত্রে গুণগত মান কমে যেতে পারে।
- Mixed Precision Training: FP16 এবং FP32 এর মধ্যে সঠিক ভারসাম্য রক্ষা করে Training স্পিড বৃদ্ধি এবং মেমোরি ব্যবস্থাপনা উন্নত করে।
এভাবে, FP16 এবং FP32-এর সঠিক ব্যবহার মডেল Training এবং ইনফারেন্সের সময় কার্যকারিতা ও গতি বৃদ্ধিতে সহায়ক হয়, যা বড় ডিপ লার্নিং মডেল তৈরিতে বিশেষ ভূমিকা পালন করে।
Model Efficiency এবং Memory Utilization বৃদ্ধি করা ডীপ লার্নিং এ একটি অত্যন্ত গুরুত্বপূর্ণ লক্ষ্য, বিশেষ করে যখন বড় মডেল এবং ডেটাসেট ব্যবহৃত হয়। এই দুটি ধারণা সমন্বিতভাবে কাজ করে, যাতে প্রশিক্ষণ এবং inference উভয় ক্ষেত্রেই কার্যকর এবং কার্যকরী সমাধান পাওয়া যায়।
Model Efficiency
Model Efficiency হলো মডেলের কার্যকারিতা এবং এর দ্রুততা। এটি মডেলের সঠিকতা (accuracy), গতিশীলতা (throughput), এবং latency এর সাথে সম্পর্কিত। মডেলকে দক্ষ করে তুলতে নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করা যেতে পারে:
Model Architecture Optimization:
- Lightweight Architectures: EfficientNet, MobileNet, এবং SqueezeNet এর মতো lightweight architectures ব্যবহার করে model efficiency বাড়ানো যায়। এই ধরনের architectures কম computational resources এবং memory প্রয়োজন।
- Pruning: Model pruning techniques ব্যবহার করে মডেলের অপ্রয়োজনীয় weights এবং connections বাদ দেওয়া যায়, যা computation এবং memory cost কমায়।
Quantization:
- Quantization techniques ব্যবহার করে model weights এবং activations কে lower precision (যেমন FP16 বা INT8) এ পরিবর্তন করা হয়। এর ফলে মডেলের আকার এবং inference speed বাড়ে।
Knowledge Distillation:
- Knowledge distillation একটি প্রক্রিয়া যেখানে একটি বড় model (teacher) এর জ্ঞান একটি ছোট model (student) এ স্থানান্তরিত করা হয়। এটি ছোট এবং দ্রুত model তৈরি করতে সহায়ক হয়, যা efficiency বাড়ায়।
Regularization Techniques:
- Dropout, batch normalization, এবং weight decay এর মতো techniques ব্যবহার করে model efficiency উন্নত করা যায়, যা overfitting কমায় এবং model robustness বৃদ্ধি করে।
Memory Utilization
Memory Utilization হলো মেমোরি ব্যবহারের দক্ষতা। মেমোরি utilization বৃদ্ধি করা মানে হল model training এবং inference এর সময় memory ব্যবহারের উন্নতি করা। নিচে কয়েকটি পদ্ধতি দেওয়া হলো যা memory utilization বাড়াতে সাহায্য করে:
Mixed Precision Training:
- FP16 (half precision) এবং FP32 (single precision) এর সংমিশ্রণে training করার মাধ্যমে memory utilization কমানো যায়। Mixed precision training GPU memory ব্যবহারে ৫০% পর্যন্ত সাশ্রয় করতে পারে।
Activation Checkpointing:
- Activation checkpointing techniques ব্যবহার করে intermediate activations পুনরায় গণনা করা হয়, যা memory ব্যবহার কমায়। এটি বড় মডেল training এ বিশেষভাবে কার্যকর।
Gradient Accumulation:
- Gradient accumulation techniques ব্যবহার করে ছোট batch size নিয়ে training করা যায়। এতে একটি বড় batch size এর সমান gradients তৈরি করা সম্ভব হয়, যা GPU memory ব্যবহারকে কার্যকর করে।
Memory Offloading:
- DeepSpeed এর মতো libraries CPU বা NVMe storage এ কিছু computation offload করে GPU memory ব্যবহার কমাতে সাহায্য করে। এই প্রযুক্তি বড় মডেল training এ GPU memory limitation সমস্যা সমাধান করে।
উদাহরণ: Model Efficiency এবং Memory Utilization বৃদ্ধি করা
নিচে একটি উদাহরণ দেওয়া হলো, যেখানে Mixed Precision Training এবং Gradient Accumulation এর মাধ্যমে memory utilization এবং model efficiency বৃদ্ধি করা হয়েছে।
import torch
import torch.nn as nn
import torch.optim as optim
from torch.cuda.amp import autocast, GradScaler
# মডেল তৈরি করা
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.fc = nn.Linear(1024, 512)
def forward(self, x):
return self.fc(x)
model = MyModel().to("cuda")
optimizer = optim.Adam(model.parameters(), lr=0.001)
scaler = GradScaler() # Gradient scaler তৈরি করা
# Gradient accumulation steps
gradient_accumulation_steps = 4
for epoch in range(5):
for step, (inputs, labels) in enumerate(train_loader):
inputs, labels = inputs.to("cuda"), labels.to("cuda")
optimizer.zero_grad()
with autocast(): # Mixed precision computation
outputs = model(inputs)
loss = criterion(outputs, labels) / gradient_accumulation_steps # Scale loss
# Gradient accumulation
scaler.scale(loss).backward()
if (step + 1) % gradient_accumulation_steps == 0:
scaler.step(optimizer)
scaler.update() # Update the scaler
optimizer.zero_grad()
উপসংহার
Model Efficiency এবং Memory Utilization বৃদ্ধি করা ডীপ লার্নিং মডেল training এর জন্য অত্যন্ত গুরুত্বপূর্ণ। Mixed Precision Training, Activation Checkpointing, Gradient Accumulation, এবং Model Pruning এর মতো বিভিন্ন পদ্ধতি ব্যবহার করে মডেলকে কার্যকরী ও memory-efficient করা সম্ভব। এই কৌশলগুলো বড় মডেল training ও inference এর ক্ষেত্রে GPU resources এর সর্বোচ্চ ব্যবহার নিশ্চিত করে এবং performance উন্নত করে।
Mixed Precision Training একটি টেকনিক যা ডিপ লার্নিং মডেলের Training-এর সময় FP16 (Float16) এবং FP32 (Float32) প্রেসিশন ব্যবহার করে। এই পদ্ধতি Training স্পিড বাড়াতে এবং মেমোরি ব্যবস্থাপনা উন্নত করতে সহায়ক। নিচে PyTorch ব্যবহার করে Mixed Precision Training প্রয়োগের একটি উদাহরণ দেয়া হলো।
Mixed Precision Training উদাহরণ
এখানে আমরা একটি সাধারণ নিউরাল নেটওয়ার্ক তৈরি করব এবং Mixed Precision Training কিভাবে ব্যবহার করতে হয় তা দেখাব।
১. প্রয়োজনীয় লাইব্রেরি ইমপোর্ট করা
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from torch.cuda.amp import autocast, GradScaler
২. সিম্পল নিউরাল নেটওয়ার্ক তৈরি করা
# সিম্পল নিউরাল নেটওয়ার্ক মডেল তৈরি
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(10, 50)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(50, 2)
def forward(self, x):
x = self.relu(self.fc1(x))
return self.fc2(x)
৩. ডেটা তৈরি এবং ডেটা লোডার তৈরি করা
# উদাহরণ ডেটা তৈরি
data = torch.randn(1000, 10) # 1000 উদাহরণ, 10 ফিচার
labels = torch.randint(0, 2, (1000,)) # 0 অথবা 1 লেবেল
# ডেটাসেট এবং ডেটা লোডার তৈরি
train_dataset = TensorDataset(data, labels)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
৪. মডেল এবং অপ্টিমাইজার প্রস্তুত করা
# মডেল তৈরি
model = SimpleNN().to('cuda') # GPU তে মডেল স্থানান্তর
# অপ্টিমাইজার তৈরি
optimizer = optim.Adam(model.parameters(), lr=0.001)
# গ্রেডিয়েন্ট স্কেলার তৈরি
scaler = GradScaler()
৫. Training Loop বাস্তবায়ন করা
# Training Loop
for epoch in range(10): # 10 Epochs
for batch_data, batch_labels in train_loader:
batch_data = batch_data.to('cuda') # GPU তে পাঠানো
batch_labels = batch_labels.to('cuda')
optimizer.zero_grad() # গ্রেডিয়েন্ট শূন্য করা
with autocast(): # Mixed Precision Context
outputs = model(batch_data) # মডেলের পূর্বাভাস
loss = nn.CrossEntropyLoss()(outputs, batch_labels) # লস গণনা
scaler.scale(loss).backward() # গ্রেডিয়েন্ট স্কেল করা
scaler.step(optimizer) # অপ্টিমাইজারের স্টেপ
scaler.update() # স্কেলার আপডেট
print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')
কোডের ব্যাখ্যা
- মডেল তৈরি:
SimpleNNক্লাস দিয়ে একটি সিম্পল নিউরাল নেটওয়ার্ক তৈরি করা হয়েছে। - ডেটা প্রস্তুতি: উদাহরণস্বরূপ সিম্পল ডেটাসেট তৈরি করা হয়েছে এবং DataLoader তৈরি করা হয়েছে।
- Mixed Precision Context:
autocast()ফাংশনের মাধ্যমে FP16 এবং FP32 মিশ্রণে Training করা হয়। এটি Training সময় স্বয়ংক্রিয়ভাবে FP16-এ গ্রেডিয়েন্ট এবং লসের হিসাব করে। - গ্রেডিয়েন্ট স্কেলিং:
GradScalerক্লাস গ্রেডিয়েন্টের স্কেলিং নিশ্চিত করে, যাতে FP16-এ Training করার সময় স্থিতিশীলতা বজায় থাকে।
Mixed Precision Training এর সুবিধা
- মেমোরি সাশ্রয়: FP16 প্রেসিশন ব্যবহার করে মেমোরি খরচ উল্লেখযোগ্যভাবে কমে যায়।
- গতি বৃদ্ধি: FP16 ব্যবহার Training স্পিড বাড়াতে সাহায্য করে।
- GPU কার্যকারিতা: আধুনিক GPUs FP16-এর সাথে অপ্টিমাইজ করা, যা Training কার্যকরী করে।
সারসংক্ষেপ
Mixed Precision Training একটি কার্যকর টেকনিক যা ডিপ লার্নিং মডেল Training-এর সময় FP16 এবং FP32 প্রেসিশন ব্যবহার করে। এটি Training স্পিড এবং মেমোরি ব্যবস্থাপনা উন্নত করে। PyTorch এবং DeepSpeed ব্যবহার করে Mixed Precision Training বাস্তবায়ন করা সহজ এবং ফলপ্রসূ।
Read more