হোম/Roadmap/Chapter 11.01
Phase 11 · Chapter 11.01

Beginner: ML API Deployment & Model Hosting

তোমার প্রথম production-grade ML project — local notebook থেকে public URL পর্যন্ত যাত্রা।

Project Spec

কী বানাচ্ছ

  • Use case: Loan approval predictor (binary classification)।
  • Model: RandomForest / XGBoost on tabular data।
  • API: POST /predict — JSON in, probability out।
  • Hosting: Docker → Render / Railway / Fly.io (free tier)।
Step 1

Model train + serialize

pythonproduction
# train.py
import pandas as pd, joblib
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

df = pd.read_csv("loans.csv")
X, y = df.drop("approved", axis=1), df["approved"]
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.2, random_state=42)

model = RandomForestClassifier(n_estimators=200, max_depth=8).fit(Xtr, ytr)
print("acc:", model.score(Xte, yte))

joblib.dump({"model": model, "cols": list(X.columns), "version": "1.0"}, "model.pkl")
Step 2

FastAPI wrapper

pythonproduction
# app.py
from fastapi import FastAPI
from pydantic import BaseModel, Field
import joblib, pandas as pd

bundle = joblib.load("model.pkl")
model, cols, version = bundle["model"], bundle["cols"], bundle["version"]

app = FastAPI(title="Loan API", version=version)

class LoanReq(BaseModel):
    income: float = Field(ge=0)
    loan_amount: float = Field(ge=0)
    credit_score: int = Field(ge=300, le=850)
    employment_years: float = Field(ge=0)

@app.get("/health")
def health(): return {"ok": True, "version": version}

@app.post("/predict")
def predict(req: LoanReq):
    X = pd.DataFrame([req.model_dump()])[cols]
    p = float(model.predict_proba(X)[0][1])
    return {"approve_prob": round(p, 4), "decision": p > 0.5, "version": version}
Step 3

Dockerize

dockerfileproduction
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py model.pkl ./
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
textproduction
# requirements.txt
fastapi==0.115.0
uvicorn[standard]==0.30.6
scikit-learn==1.5.2
pandas==2.2.3
joblib==1.4.2
Step 4

Deploy to Render (free)

  1. GitHub repo push করো (app.py, Dockerfile, model.pkl)।
  2. render.com → New → Web Service → Docker → connect repo।
  3. Port 8000 expose, free tier select।
  4. Deploy hলে public URL পাবে: https://loan-api.onrender.com/predict
Test

cURL দিয়ে hit করো

bashproduction
curl -X POST https://loan-api.onrender.com/predict \
  -H "Content-Type: application/json" \
  -d '{"income":75000,"loan_amount":200000,"credit_score":720,"employment_years":5}'

# {"approve_prob": 0.8231, "decision": true, "version": "1.0"}
Bonus

Production polish

  • Swagger UI auto-generated /docs — client testing-এর জন্য।
  • GitHub Actions দিয়ে push-এ auto-deploy।
  • Prometheus /metrics endpoint যোগ করো।
  • Streamlit frontend বানিয়ে demo link share করো।
Pitfalls

যা beginner-রা ভুল করে

  • Notebook column order vs API column order mismatch — silently wrong prediction।
  • Model file Git LFS ছাড়া push — repo size explode।
  • Free tier cold start 30s — health check fail।
  • requirements.txt-এ version pin না করা — production-এ break।
Deliverable

পোর্টফোলিও checklist

  1. GitHub repo (README + architecture diagram)।
  2. Live API URL + Postman collection।
  3. Model card: dataset, metric, limitations।
  4. LinkedIn post: "I deployed my first ML API"।
Takeaway

মূল কথা

একটা সহজ classifier দিয়েও পুরো MLOps stack touch করা যায় — model, API, container, cloud, monitoring। এটাই foundation।

← Roadmap-এ ফিরুন
পরবর্তী: Intermediate: Chatbot & Image APIশীঘ্রই