bentoml

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

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. BentoML 的 service 和 api 分别声明什么?
  2. 为什么要用 HuggingFaceModel 固化权重?
  3. 自适应批处理的前提是什么?
答案
  1. @bentoml.service 声明服务类、资源需求和流量超时;@bentoml.api 把方法暴露为 HTTP 接口,并配置批处理、超时等行为。
  2. 它把模型文件纳入 Bento 构建产物,部署时无需再从外网下载,冷启动更稳定,也避免 Hugging Face 限流和版本漂移。
  3. API 必须接收一批输入并返回一批结果,且方法签名和类型注解清晰。BentoML 会把短时间窗口内的请求合并成批次,再调用一次模型。

相关条目