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.2Step 4
Deploy to Render (free)
- GitHub repo push করো (app.py, Dockerfile, model.pkl)।
- render.com → New → Web Service → Docker → connect repo।
- Port 8000 expose, free tier select।
- 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
- GitHub repo (README + architecture diagram)।
- Live API URL + Postman collection।
- Model card: dataset, metric, limitations।
- LinkedIn post: "I deployed my first ML API"।
Takeaway
মূল কথা
একটা সহজ classifier দিয়েও পুরো MLOps stack touch করা যায় — model, API, container, cloud, monitoring। এটাই foundation।
← Roadmap-এ ফিরুন
পরবর্তী: Intermediate: Chatbot & Image APIশীঘ্রই