REST API (Representational State Transfer) হল একটি জনপ্রিয় আর্কিটেকচারাল স্টাইল যা ওয়েব সার্ভিস তৈরি করার জন্য ব্যবহৃত হয়। REST API-এর মাধ্যমে মডেল সার্ভ করার মাধ্যমে, আপনি আপনার ডিপ লার্নিং বা মেশিন লার্নিং মডেলকে একটি সার্ভারে হোস্ট করতে পারেন এবং অন্য অ্যাপ্লিকেশন বা সিস্টেম থেকে HTTP রিকুয়েস্টের মাধ্যমে মডেলটির পূর্বাভাস (prediction) নিতে পারেন।
এখানে আমরা Flask বা FastAPI ব্যবহার করে PyTorch মডেল সার্ভ করার একটি সাধারণ উদাহরণ দেখব। Flask একটি লাইটওয়েট ওয়েব ফ্রেমওয়ার্ক, যা REST API তৈরি করতে ব্যবহৃত হয় এবং FastAPI একটি আরো দ্রুত এবং আধুনিক ফ্রেমওয়ার্ক যা মডেল সার্ভিংয়ের জন্য জনপ্রিয় হয়ে উঠেছে।
১. Flask দিয়ে REST API তৈরি করে মডেল সার্ভ করা
প্রয়োজনীয় লাইব্রেরি ইনস্টলেশন:
প্রথমে Flask এবং PyTorch ইনস্টল করতে হবে:
pip install flask torch torchvision
মডেল ট্রেনিং বা লোডিং:
এখানে, একটি সরল PyTorch মডেল (যেমন, pretrained ResNet50) ব্যবহার করা হবে। তবে, আপনি নিজের ট্রেনিং করা মডেলও লোড করতে পারেন।
import torch
import torchvision.models as models
# লোড করা pretrained মডেল
model = models.resnet50(pretrained=True)
model.eval() # মডেলটি evaluation মোডে আনুন
Flask API তৈরি করা:
from flask import Flask, request, jsonify
import torch
from torchvision import transforms
from PIL import Image
import io
# Flask অ্যাপ তৈরি
app = Flask(__name__)
# Pretrained ResNet50 মডেল লোড করা
model = models.resnet50(pretrained=True)
model.eval()
# ইনপুট ছবি ট্রান্সফর্মেশন সেটআপ
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# REST API রুট: মডেলকে ছবি পাঠানো এবং প্রেডিকশন নেওয়া
@app.route('/predict', methods=['POST'])
def predict():
if 'file' not in request.files:
return jsonify({'error': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': 'No selected file'}), 400
try:
# ইমেজ লোড করা এবং প্রিপ্রসেসিং
img = Image.open(io.BytesIO(file.read()))
img = transform(img).unsqueeze(0) # ব্যাচ সাইজ 1 এর জন্য আউটপুট তৈরি
# মডেলে প্রেডিকশন করা
with torch.no_grad():
output = model(img)
# প্রেডিকশন থেকে কেবল সবচেয়ে সম্ভাব্য ক্লাস
_, predicted = torch.max(output, 1)
return jsonify({'prediction': predicted.item()})
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)
কিভাবে কাজ করে:
- Flask অ্যাপ তৈরি: Flask অ্যাপটি তৈরি করা হয়েছে যেখানে
/predictরুটে POST রিকুয়েস্ট পেতে হবে। - ইমেজ আপলোড:
request.filesথেকে ছবি গ্রহণ করা হয়। - ইমেজ প্রিপ্রসেসিং: ইমেজটি রিসাইজ এবং ট্রান্সফর্ম করা হয় যাতে মডেল গ্রহণ করতে পারে।
- মডেল প্রেডিকশন: PyTorch মডেল থেকে প্রেডিকশন করা হয় এবং আউটপুট রিটার্ন করা হয়।
- প্রেডিকশন রিটার্ন: JSON ফরম্যাটে প্রেডিকশন রিটার্ন করা হয়।
API কল করার উদাহরণ:
একবার Flask অ্যাপটি চালু হলে, আপনি POST রিকুয়েস্ট পাঠিয়ে মডেল থেকে প্রেডিকশন নিতে পারেন। উদাহরণস্বরূপ, Postman বা cURL ব্যবহার করে API কল করতে পারেন।
cURL উদাহরণ:
curl -X POST -F "file=@/path/to/your/image.jpg" http://127.0.0.1:5000/predict
এটি /predict রুটে ছবি পাঠাবে এবং মডেল থেকে প্রেডিকশন রিটার্ন করবে।
২. FastAPI দিয়ে REST API তৈরি করে মডেল সার্ভ করা
FastAPI হল একটি আধুনিক, দ্রুত এবং অ্যাসিঙ্ক্রোনাস ওয়েব ফ্রেমওয়ার্ক যা দ্রুত REST API তৈরি করতে ব্যবহৃত হয়। এটি Flask এর তুলনায় দ্রুত এবং আরো অনেক সুবিধা দেয়।
প্রয়োজনীয় লাইব্রেরি ইনস্টলেশন:
pip install fastapi uvicorn torch torchvision
FastAPI অ্যাপ তৈরি করা:
from fastapi import FastAPI, File, UploadFile
import torch
from torchvision import models, transforms
from PIL import Image
import io
# FastAPI অ্যাপ তৈরি
app = FastAPI()
# Pretrained ResNet50 মডেল লোড করা
model = models.resnet50(pretrained=True)
model.eval()
# ইনপুট ছবি ট্রান্সফর্মেশন
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# REST API রুট: মডেলকে ছবি পাঠানো এবং প্রেডিকশন নেওয়া
@app.post("/predict")
async def predict(file: UploadFile = File(...)):
try:
# ফাইল থেকে ছবি লোড করা
image = Image.open(io.BytesIO(await file.read()))
image = transform(image).unsqueeze(0) # ব্যাচ সাইজ 1 এর জন্য আউটপুট তৈরি
# মডেলে প্রেডিকশন করা
with torch.no_grad():
output = model(image)
# প্রেডিকশন থেকে সবচেয়ে সম্ভাব্য ক্লাস বের করা
_, predicted = torch.max(output, 1)
return {"prediction": predicted.item()}
except Exception as e:
return {"error": str(e)}
কিভাবে কাজ করে:
- FastAPI অ্যাপ তৈরি: FastAPI দিয়ে অ্যাপ তৈরি করা হয়েছে এবং
/predictরুটেPOSTরিকুয়েস্টের মাধ্যমে ছবি পাঠানো হয়। - ফাইল আপলোড:
UploadFileক্লাস ব্যবহার করে ছবি গ্রহণ করা হয়। - ইমেজ প্রিপ্রসেসিং: ছবিটি
transformফাংশন ব্যবহার করে প্রিপ্রসেস করা হয়। - মডেল প্রেডিকশন: PyTorch মডেল ব্যবহার করে প্রেডিকশন করা হয়।
- JSON রেসপন্স: প্রেডিকশনটি JSON ফরম্যাটে রিটার্ন করা হয়।
FastAPI সার্ভার চালানো:
uvicorn your_script_name:app --reload
এটি FastAPI সার্ভার চালু করবে এবং আপনি http://127.0.0.1:8000 থেকে API অ্যাক্সেস করতে পারবেন।
API কল করার উদাহরণ (cURL):
curl -X 'POST' 'http://127.0.0.1:8000/predict' -F 'file=@/path/to/your/image.jpg'
এটি FastAPI সার্ভারে ছবি পাঠাবে এবং প্রেডিকশন রিটার্ন করবে।
সারাংশ
- Flask এবং FastAPI উভয়ই REST API তৈরি করার জন্য জনপ্রিয় ফ্রেমওয়ার্ক।
- Flask সহজ এবং লাইটওয়েট হলেও, FastAPI দ্রুত এবং আধুনিক ফিচার প্রদান করে (যেমন, অ্যাসিঙ্ক্রোনাস ফিচার এবং টাইপ হিন্টিং)।
- Pretrained মডেল যেমন VGG, ResNet, বা Inception ব্যবহার করে REST API মাধ্যমে মডেল সার্ভ করা যেতে পারে, যা বিভিন্ন অ্যাপ্লিকেশন থেকে HTTP রিকুয়েস্টে প্রেডিকশন পেতে সহায়ক।
এটি মডেল হোস্টিং এবং ডিপ লার্নিং মডেলগুলি অন্যান্য সিস্টেম বা অ্যাপ্লিকেশনগুলোতে ইন্টিগ্রেট করতে একটি শক্তিশালী সমাধান।
Read more