BentoML ও TorchServe
এই পাঠে যা শিখবেন
- BentoML Service + Runner pattern
- TorchServe handler architecture
- FastAPI/Triton/BentoML/TorchServe trade-offs
- Choose criteria for Bangladesh teams
১ · BentoML overview
BentoML — Python-native ML serving framework. FastAPI-এর বদলে dedicated ML serving abstraction.
- Service decorator + Runner abstraction.
- IO descriptors — input/output schema.
bentoml build— packages model + code + dependencies.- Yatai = BentoML's K8s deployment platform.
২ · BentoML Service example
import bentoml
from bentoml.io import JSON, NumpyNdarray
import numpy as np
from pydantic import BaseModel
# 1. Save model to BentoML store
# bentoml.sklearn.save_model("bangla_sentiment", trained_model)
# 2. Create runner
sentiment_runner = bentoml.sklearn.get("bangla_sentiment:latest").to_runner()
svc = bentoml.Service(
"bangla_sentiment_service",
runners=[sentiment_runner],
)
class ReviewIn(BaseModel):
text: str
@svc.api(input=JSON(pydantic_model=ReviewIn), output=JSON())
async def predict(review: ReviewIn) -> dict:
proba = await sentiment_runner.predict_proba.async_run([review.text])
label_idx = proba[0].argmax()
return {
"label": str(label_idx),
"confidence": float(proba[0][label_idx]),
}
# Run:
# bentoml serve service:svc
# Build:
# bentoml build
# Containerize:
# bentoml containerize bangla_sentiment_service:latest
৩ · BentoML benefits
- Framework agnostic: sklearn, PyTorch, TF, XGBoost, ONNX — all supported uniformly.
- Adaptive batching: dynamic batching with auto-tuning.
- Built-in observability: Prometheus metrics, Grafana dashboards.
- bento format: code + model + config + dependencies — single deployable artifact.
- Yatai: K8s deployment, model registry, Bento store.
৪ · TorchServe overview
TorchServe — PyTorch official model serving. AWS-Meta collaboration (originally).
- Handler-based: BaseHandler subclass — preprocess, inference, postprocess methods.
- Model Archiver (.mar): model + handler + extra files.
- Multi-worker via configuration.
৫ · TorchServe handler example
from ts.torch_handler.base_handler import BaseHandler
import torch
from transformers import AutoTokenizer
class BanglaSentimentHandler(BaseHandler):
def initialize(self, context):
super().initialize(context)
self.tokenizer = AutoTokenizer.from_pretrained("bangla-bert-base")
def preprocess(self, requests):
texts = [req.get("body").get("text") for req in requests]
return self.tokenizer(
texts, padding=True, truncation=True,
max_length=128, return_tensors="pt"
).to(self.device)
def inference(self, model_input):
with torch.no_grad():
outputs = self.model(**model_input)
return outputs.logits
def postprocess(self, inference_output):
probs = torch.softmax(inference_output, dim=-1)
labels = probs.argmax(dim=-1).tolist()
confs = probs.max(dim=-1).values.tolist()
return [
{"label": str(l), "confidence": c}
for l, c in zip(labels, confs)
]
# Package:
# torch-model-archiver --model-name bangla --version 1.0 \
# --serialized-file model.pt --handler bangla_handler.py \
# --extra-files config.json
# Serve:
# torchserve --start --model-store . --models bangla=bangla.mar
৬ · Comparison table
- FastAPI: general Python web; ML-aware via custom. Most flexible, most boilerplate.
- Triton: GPU-optimized, multi-framework, dynamic batching. Best for high-RPS GPU.
- BentoML: Python-native, framework-agnostic, decent DX. Good middle ground.
- TorchServe: PyTorch-deeply-integrated. Official tool, conservative choice.
- KServe: K8s-native serving (CRD-based). Higher-level than all.
ভাবনার প্রশ্ন
প্র ০১"BentoML vs FastAPI — when to switch?"
BentoML extra abstraction; worth pivoting?
Stick with FastAPI when:
- Single, simple model.
- Custom request flow heavy.
- Team Python web-comfortable.
Switch to BentoML when:
- Multiple models share infrastructure.
- "Bento build → docker → deploy" automation valuable.
- Adaptive batching needed (BentoML built-in).
- K8s deploy frequently (Yatai automate).
Migration cost:
- Code rewrite — 1-2 days per service.
- Build/CI rework.
- Team learn Service + Runner pattern.
BD context:
- Most teams stay FastAPI. Switch trigger usually multi-model + DX pain.
মূল উপলব্ধি: BentoML = ML-purpose-built; FastAPI = general. Pivot cost-justified at scale; default FastAPI fine for most.
প্র ০২"TorchServe still relevant in 2025?"
TorchServe — was hot, now seems stagnant.
Still relevant when:
- Pure PyTorch shop, conservative tooling preference.
- AWS Sagemaker workflow (deeply integrated).
- Existing TorchServe stack — don't break what works.
Less relevant due to:
- Triton overlaps + does more (multi-framework, GPU).
- BentoML easier dev UX.
- FastAPI + custom code flexible.
- Slower release cadence than alternatives.
Choose new project when?
- Rarely first choice today.
- SageMaker bring TorchServe automatically — that's main use case.
Future:
- vLLM + TGI (text generation server) for LLM-specific overshadow.
- TorchServe relegated to legacy PyTorch CV-style.
মূল উপলব্ধি: TorchServe — viable but not default 2025. Specialized SageMaker + PyTorch. New projects: Triton, BentoML, FastAPI generally better.
প্র ০৩"vLLM ও TGI — LLM-specific serving কেন?"
LLM serving traditional frameworks-এর gap revealed.
LLM serving challenges:
- Variable output length — fixed batching inefficient.
- KV cache memory dominant.
- Streaming output — token-by-token return needed.
- Quantization (GPTQ, AWQ) integration.
vLLM (UC Berkeley):
- PagedAttention — KV cache memory management innovation.
- Continuous batching — variable-length output efficient.
- OpenAI-compatible API.
- 2-10× throughput vs naive PyTorch.
Hugging Face TGI (Text Generation Inference):
- HF-native LLM server.
- Built-in quantization, flash attention.
- Streaming, batching.
BD relevance:
- Bangla LLM serving (BanglaT5, BanglaGPT) — vLLM appropriate.
- Self-hosted LLaMA/Mistral fine-tunes — vLLM standard.
- GPU cost-conscious — throughput matters.
Triton vs vLLM:
- Triton supports vLLM as backend (TRT-LLM).
- Standalone vLLM simpler if LLM-only use case.
মূল উপলব্ধি: LLM serving = sub-domain own tooling. vLLM/TGI standard for self-hosted LLM 2025. Triton for heterogeneous; vLLM for LLM-focused.
প্র ০৪"KServe — K8s CRD layer add value?"
KServe (formerly KFServing) — K8s-native ML serving CRD layer.
What it does:
- Define
InferenceServiceCRD. - Behind: choose runtime (Triton, TorchServe, sklearn-server, custom).
- K8s autoscale (Knative-based zero-scale).
- Built-in canary, multi-model.
Pros:
- Declarative — minimal YAML, model URL, request CPU/GPU.
- Multi-runtime — same K8s manifest, different backend.
- Scale-to-zero — idle cost zero.
Cons:
- Knative dependency — additional K8s complexity.
- Cold start (zero-scale) painful for ML.
- Abstraction cost — debug deeper sometimes.
Choose KServe when:
- Many models, frequent provisioning.
- K8s expertise strong.
- Multi-team self-service desired.
- Cost optimization (zero-scale) matters.
BD context:
- Mature ML platform team — KServe nice abstraction.
- Smaller team — direct Triton + K8s Deployment simpler.
মূল উপলব্ধি: KServe = ML platform infrastructure layer. Useful at scale; overhead at small scale. Layer over (not replace) Triton/TorchServe.
অনুশীলন
- Try BentoML: sample sklearn model BentoML-এ wrap. Service serve.
pip install bentoml; train + save model; service.py লিখুন;bentoml serve. - Compare: Same model FastAPI ও BentoML — code lines compare.
BentoML সাধারণত ৪০-৫০% less boilerplate. কিন্তু custom logic থাকলে FastAPI flexibility advantageous.
- চিন্তা: Bangladeshi LLM service — vLLM choose করবেন; কেন?
PagedAttention + continuous batching → 5-10× cheaper GPU. Streaming token-level. OpenAI-compatible API → easy client integration.