BentoML 模型服务打包、批处理与容器化部署。
BentoML 把 Python 服务、依赖和模型打包成 Bento,支持 GPU 资源声明、自适应批处理、多服务依赖和容器化。适合把自定义推理逻辑部署到 Docker/Kubernetes 或 BentoCloud。
服务用 @bentoml.service 声明,API 用 @bentoml.api;模型可以通过 bentoml.models.HuggingFaceModel 在构建时固化,避免每次启动下载。
pip install -U bentoml
定义一个 GPU 文本生成服务,并开启批处理接口:
cat > service.py <<'PY'
from __future__ import annotations
import bentoml
@bentoml.service(
resources={"gpu": 1, "gpu_type": "nvidia-l4"},
traffic={"timeout": 300},
)
class LLMService:
def __init__(self) -> None:
from transformers import pipeline
self.pipe = pipeline(
"text-generation",
model="Qwen/Qwen2.5-7B-Instruct",
device_map="auto",
)
@bentoml.api
def generate(self, prompt: str, max_new_tokens: int = 256) -> str:
out = self.pipe(prompt, max_new_tokens=max_new_tokens, do_sample=False)
return out[0]["generated_text"]
@bentoml.api(batchable=True, max_batch_size=16, max_latency_ms=200)
def summarize(self, texts: list[str]) -> list[str]:
results = self.pipe(texts, max_new_tokens=128, do_sample=False)
return [item[0]["generated_text"] for item in results]
PY
bentoml serve service:LLMService --reload --port 3000
调用接口并检查健康状态:
curl -s http://localhost:3000/readyz
curl -X POST http://localhost:3000/generate \
-H 'Content-Type: application/json' \
-d '{"prompt": "用一句话解释 OOMKilled", "max_new_tokens": 64}'
构建 Bento 并打成容器镜像:
bentoml build
bentoml containerize llm_service:latest
docker run --gpus all --rm -p 3000:3000 llm_service:latest
gpu_type 是云端资源标签,自托管环境只认 GPU 数量;不要以为写了型号就会自动调度对应卡。bentoml.models.HuggingFaceModel 在构建阶段固化。--gpus all 不生效,服务会退回 CPU 或直接报错。traffic.timeout、客户端超时和负载均衡超时要一起调;长生成只改一处仍会在中间层断开。bentoml build 时固化,构建环境不干净会把冲突包带进镜像;在干净虚拟环境构建。bentoml serve 适合开发,生产用构建后的 Bento 或镜像;--reload 会额外占用资源。/readyz 和 /livez,指标在 /metrics;Kubernetes 探针不要只做 TCP 检查。bentoml.depends,旧版的 bentoml.Runner 写法不再推荐;升级时检查迁移指南。合上页面,先回答,再展开对照。
@bentoml.service 声明服务类、资源需求和流量超时;@bentoml.api 把方法暴露为 HTTP 接口,并配置批处理、超时等行为。