
BentoML · 统一模型服务化框架 · 本地调试、打包交付与容器化部署全指南
项目仓库: https://github.com/bentoml/BentoML
开源协议:Apache License 2.0 · 运行语言:Python(README 要求 Python ≥ 3.9,官方快速上手推荐 Python 3.11) · 容器化:由框架自动生成 Docker 镜像 · 默认服务端口:3000 · 生产形态:Docker 容器、Kubernetes 或 BentoCloud · 仓库分支:main(命令、端口与版本以官方文档最新说明为准)
1 项目简介
BentoML 是一个用于构建 AI 应用与模型推理在线服务系统的 Python 库。它把任意开源模型或自定义模型的推理脚本,配合标准 Python 类型提示,封装成可调用的 REST API 服务;同时负责环境与依赖管理、模型版本归档、动态批处理、并行化编排、可观测性以及从本地调试到 Docker 容器、Kubernetes / BentoCloud 生产环境的交付链路。
项目最初由 BentoML 团队开源维护,现归属 Modular 社区体系,官方论坛由 Modular 论坛的 Bento 板块承接。本文只覆盖社区开源框架本身的本地与自托管部署;BentoCloud 商业托管能力的定价与额度以官方站点为准。
非官方声明:本文为基于官方 README、官方文档站与官方示例整理的部署使用指南,不代表 BentoML 官方立场;框架名称与第三方模型、推理引擎名称归各自权利人所有。模型权重、第三方依赖与外部云服务的许可证、计费与数据政策由对应方规定。
1.1 核心信息一览
| 项目项 | 内容 |
|---|---|
| 项目名称 | BentoML |
| 仓库地址 | github.com/bentoml/BentoML |
| 项目定位 | 把任意 AI/ML 模型封装为在线推理 API 与多模型服务系统的 Python 框架 |
| 开源协议 | Apache License 2.0 |
| 运行语言 | Python(README ≥ 3.9;官方快速上手推荐 3.11) |
| 服务单元 | Service:@bentoml.service 装饰的 Python
类;API:@bentoml.api 装饰的方法 |
| 交付物 | Bento:标准化打包产物,包含源码、Python 依赖、模型产物与配置 |
| 本地启动命令 | bentoml serve(默认监听
http://localhost:3000) |
| 默认端口 | 3000(浏览器与 Swagger UI 同端口访问) |
| 容器化 | bentoml build →
bentoml containerize <bento_tag> →
docker run |
| 生产部署 | Docker 容器、Kubernetes;官方 BentoCloud 为商业托管路径 |
| 官方文档 | docs.bentoml.com |
1.2 适用场景
- 已在本地跑通一个模型推理脚本(文本摘要、分类、向量嵌入、图像生成、语音合成、目标检测等),需要把它暴露成稳定的 HTTP API 供其他应用调用。
- 需要统一管理多套模型、依赖版本与模型产物,保证本地开发、测试环境与生产环境可复现,避免“依赖地狱”。
- 希望在不重写业务代码的前提下,获得动态批处理、模型并行、多阶段流水线、多模型推理图编排等性能优化能力。
- 团队需要自建模型推理服务,先在本地与容器环境验证,再平滑迁移到 Kubernetes 或托管平台。
1.3 能力边界(官方口径)
- BentoML 负责服务框架、运行时编排与交付链路;模型权重、推理引擎(如 vLLM、PyTorch、Transformers)与模型本身的能力、上下文长度、显存占用由所选模型与框架决定。
- 框架支持任意 ML 框架、模态与推理运行时的自定义实现;具体某类模型的接入方式需参照官方 Examples 与文档对应章节。
- 匿名使用统计仅上报 BentoML 内部 API
调用,不包含用户代码、模型数据、模型名称或堆栈信息;可通过
--do-not-track或环境变量关闭。 - 官方核心仓库不附带现成的
docker-compose.yml;容器化交付走 Bento 打包与containerize命令,生产集群编排按 Kubernetes / BentoCloud 文档另行配置。
2 功能特性
以下条目来自官方 README 的功能描述与官方文档目录,具体 API 参数以当前版本文档为准。
2.1 任意模型快速构建 API
- 几行代码与标准 Python 类型提示即可把推理脚本转成 REST API 服务。
- Service 类在初始化阶段加载模型,API 方法接收请求并返回结果,输入输出类型由类型提示声明。
2.2 环境与交付物管理
- 用简单配置文件声明运行时环境、依赖与模型版本,框架自动生成 Docker 镜像并保证可复现性。
- 打包产物 Bento 包含预处理、业务逻辑、API 规格、推理代码、后处理、运行时规格、模型加载与配置,以及依赖清单、README 等必备文件。
2.3 性能与编排优化
- 内置动态批处理(Adaptive batching)提升 CPU/GPU 利用率。
- 支持模型并行化、多阶段流水线、多模型推理图编排、异步任务队列。
- 提供 GPU 推理、分布式服务与模型加载 / Model Store 管理能力。
2.4 可观测性与扩展
- 观测能力覆盖监控、日志、指标(Metrics)与链路追踪(Tracing)。
- 支持挂载 ASGI 应用、流式响应(Streaming)、WebSocket 端点,以及用 Gradio 为服务附加 UI。
- 可实现自定义业务逻辑、API 与任务队列,支持自定义错误响应。
2.5 官方示例覆盖的方向
- LLM:基于 vLLM 的 Llama 3.2、Mistral、DeepSeek 蒸馏等示例。
- 图像生成:Stable Diffusion 3 Medium、Stable Video Diffusion、SDXL Turbo、ControlNet、LCM LoRA。
- 嵌入向量:SentenceTransformers、ColPali。
- 音频:ChatTTS、XTTS、WhisperX、Bark。
- 视觉:YOLO、ResNet。
- 高级编排:Function calling、LangGraph、CrewAI 集成。
3 官方界面预览
3.1 内置服务调试界面
开头封面即为官方文档中的 Service APIs 界面:服务启动后访问
http://localhost:3000,页面列出暴露的 HTTP 端点(示例为
POST /summarize),可直接在 Request body 中输入 JSON 并点击
Execute 在线调用,Responses 区域展示返回结果。
3.2 Bento 交付物结构

Bento 在 service.py 中集中组织预处理、业务逻辑、API
规格、推理代码、后处理、运行时规格、模型加载与配置;外部附带
requirements.txt、README.md
与其他必备文件,保证交付环境一致。
4 官方跳转链接汇总
| 类别 | 链接 | 说明 |
|---|---|---|
| 仓库主页 | https://github.com/bentoml/BentoML | 源码、README 与示例 |
| 官方文档 | https://docs.bentoml.com | 教程、服务定义、部署与观测文档 |
| 示例总览 | docs.bentoml.com/en/latest/examples/overview.html | 各模型方向示例代码索引 |
| 打包部署文档 | docs.bentoml.com 打包章节 | Bento 构建、容器化与 Docker 运行 |
| Issues | https://github.com/bentoml/BentoML/issues | 提交 Bug 与功能建议 |
| Releases | https://github.com/bentoml/BentoML/releases | 版本发布与更新日志 |
| 社区论坛 | https://forum.modular.com/c/bento/31 | 官方社区交流板块 |
| 许可证 | LICENSE | Apache License 2.0 |
5 前置要求与服务器配置
5.1 软件前提
- Python:README 要求 ≥ 3.9,官方快速上手推荐 Python 3.11;建议为项目单独创建虚拟环境做依赖隔离。
- BentoML
包:
pip install -U bentoml。 - 模型推理依赖:以所选模型为准,例如本地文本摘要示例需要
torch与transformers。 - Docker:执行
bentoml containerize与运行容器化服务前,需先安装并启动 Docker Engine(含 Compose 插件可选,本框架核心路径不强制要求 Compose)。 - GPU 环境(可选):使用 GPU 推理时,需匹配对应 CUDA 版本的 GPU 驱动与推理框架;具体版本组合参照所选模型与框架文档。
5.2 硬件与系统建议
官方 README 未给出统一的 CPU / 内存 / 显存最低配置表:CPU 推理服务以模型体积与批处理量为准;GPU 推理所需显存由模型规模、上下文长度与并发批量决定。本地开发建议使用独立虚拟环境;生产环境硬件按所选模型的官方推荐口径预留。
5.3 端口分配
| 端口 | 服务 | 默认绑定 | 用途 |
|---|---|---|---|
| 3000 | BentoML HTTP BentoServer | 0.0.0.0(本地回环访问 http://localhost:3000) |
REST API、Swagger UI 在线调试 |
生产部署时如经反向代理对外暴露,应在网关层补充鉴权、限流与 HTTPS;不要在无认证的情况下直接把内部推理端口暴露到公网。
6
方式一:容器化交付(bentoml build + Docker)
适用于要把服务带到任意 Docker 兼容环境运行、以及后续上生产集群的场景。命令来自官方 README 与打包部署文档。
6.1 定义服务与运行环境
在项目根目录编写 service.py,用
@bentoml.service 声明服务,用 image=
参数定义容器内 Python 环境:
import bentoml
my_image = bentoml.images.Image(python_version="3.11") \
.python_packages("torch", "transformers")
@bentoml.service(
image=my_image,
envs=[
{"name": "HF_TOKEN"}, # 仅声明变量名,部署时再赋值
{"name": "DB_HOST", "value": "localhost"},
],
)
class Summarization:
def __init__(self) -> None:
from transformers import pipeline
self.pipeline = pipeline("summarization")
@bentoml.api(batchable=True)
def summarize(self, text: str) -> str:
result = self.pipeline(text)
return result[0]["summary_text"]也可以用 .requirements_file("requirements.txt")
替代逐个声明 Python 包。
6.2 构建 Bento
在 service.py 所在目录执行:
bentoml build- 默认会把当前目录下全部文件打包进
Bento;需要排除特定文件或目录时,在项目根目录维护
.bentoignore文件。 - 构建完成后每个 Bento 会自动分配唯一版本号,用以下命令查看本机已打包的 Bento:
bentoml list6.3 生成 Docker 镜像并运行
确保 Docker 已启动,然后把 Bento 转为 Docker 镜像:
bentoml containerize summarization:latestmacOS Apple Silicon 上,如需为兼容性要求 amd64 的 Python
库指定平台,可加 --platform 参数:
bentoml containerize --platform=linux/amd64 summarization:latest查看生成的镜像:
docker images运行镜像并把容器 3000 端口映射到宿主机:
docker run -it --rm -p 3000:3000 summarization:<bento_tag> serve浏览器访问 http://localhost:3000 即可看到 Service APIs
调试页面。
7 方式二:本地源码 / 虚拟环境运行(开发调试)
适用于本地开发、调试与快速验证模型效果。
7.1 准备虚拟环境并安装依赖
# 创建并激活虚拟环境(以 Python 3.11 为例)
python3 -m venv quickstart
source quickstart/bin/activate # Windows: quickstart\Scripts\activate
# 安装 BentoML 与模型所需依赖
pip install bentoml torch transformers7.2 编写服务文件
参照 6.1 节编写
service.py;服务初始化阶段加载模型,@bentoml.api
装饰的方法即为对外 HTTP 端点。
7.3 本地启动服务
bentoml serve启动成功后控制台输出类似:
[INFO] [cli] Starting production HTTP BentoServer from "service:Summarization" listening on http://localhost:3000 (Press CTRL+C to quit)
[INFO] [entry_service:Summarization:1] Service Summarization initialized7.4 调用本地服务
浏览器直接访问 http://localhost:3000 使用 Swagger
UI;也可以用 Python 客户端调用:
import bentoml
with bentoml.SyncHTTPClient("http://localhost:3000") as client:
result: str = client.summarize(text="在这里填入待摘要的文本")
print(result)8 配置项说明
8.1
运行时镜像配置(bentoml.images.Image)
| 字段 / 方法 | 说明 |
|---|---|
python_version="3.11" |
容器内 Python 版本;不指定时默认使用构建环境的 Python 版本 |
.python_packages("torch", "transformers") |
声明需要安装的 Python 包 |
.requirements_file("requirements.txt") |
以依赖清单文件方式声明依赖,替代逐个写包名 |
8.2 服务环境变量(envs)
在 @bentoml.service 的 envs
参数中声明:
| 写法 | 说明 |
|---|---|
{"name": "HF_TOKEN"} |
仅声明变量名,不在代码中固化密钥,部署 / 运行时再赋值 |
{"name": "DB_HOST", "value": "localhost"} |
同时给出默认值 |
8.3 服务与 API 装饰器常用口径
| 配置 | 说明 |
|---|---|
@bentoml.service(...) |
定义服务类,可携带 image、envs
等运行时配置 |
@bentoml.api(batchable=True) |
标记该端点支持动态批处理;是否启用及批处理参数细节以当前版本文档为准 |
| 类型提示 | 用标准 Python 类型提示声明输入输出,作为 API 规格依据 |
8.4
打包排除文件(.bentoignore)
bentoml build 默认打包当前目录全部文件;在项目根目录创建
.bentoignore,按 .gitignore
类似规则列出不需要进入 Bento
的目录与文件(本地临时产物、测试数据、文档素材等),避免镜像体积不必要膨胀。
8.5 使用统计开关
# 方式一:CLI 命令附加参数关闭匿名统计
bentoml <command> --do-not-track
# 方式二:设置环境变量关闭
export BENTOML_DO_NOT_TRACK=True9 常用运维命令
9.1 BentoML CLI(本地与打包)
# 本地启动服务(默认 http://localhost:3000)
bentoml serve
# 在 service.py 所在目录构建 Bento
bentoml build
# 查看本机已打包的 Bento 列表
bentoml list
# 把指定 Bento 转为 Docker 镜像
bentoml containerize summarization:latest
# 关闭匿名使用统计(附加在对应命令后)
bentoml serve --do-not-track其他子命令(如集群部署、模型仓库管理、观测配置等)的参数与选项以官方 CLI 参考文档为准;本文不臆造未在官方 README / 快速上手中出现的参数。
9.2 Docker 容器运维
# 查看本地镜像
docker images
# 前台运行并映射端口(退出即清理容器)
docker run -it --rm -p 3000:3000 summarization:<tag> serve
# 查看运行中的容器
docker ps
# 查看容器实时日志
docker logs -f <container_name_or_id>
# 停止容器
docker stop <container_name_or_id>
# 查看容器内资源占用
docker stats <container_name_or_id>9.3 备份与升级
- 备份:Bento 产物中已包含代码、依赖、模型产物与配置;模型权重外置存储时,按所选 Model Store 与模型仓库口径备份。
- 升级:更新代码或依赖后重新
bentoml build生成新版本 Bento,再重新containerize与发布镜像;旧版本镜像可在确认无流量后清理。
10 常见故障排查
10.1
containerize 阶段提示 Docker 未运行
- 确认 Docker Engine 已启动(桌面版确认 Docker Desktop 正在运行;Linux
确认
dockerd服务状态)。 - 确认当前用户已加入
docker用户组或具备执行docker命令的权限。
10.2 3000 端口被占用
- 先排查占用进程:
lsof -i :3000(Linux/macOS)或对应 Windows 端口查询命令。 - 停止占用进程,或按官方文档调整服务监听端口后再启动;容器化运行时同步修改
-p端口映射。
10.3 本地能跑、容器内缺依赖或版本不一致
- 检查
image=中python_packages或.requirements_file是否覆盖了本地虚拟环境里的全部依赖。 - 确认
python_version与本地开发 Python 版本不会造成二进制扩展不兼容;Apple Silicon 交叉构建时使用--platform指定目标平台。 - 确认
.bentoignore没有误排除模型配置文件或必要素材。
10.4 模型下载失败或需要授权
- 从 Hugging Face 等平台拉取受门控限制的模型时,在
envs中声明对应令牌变量并在运行环境中赋值,不要把密钥写进代码或提交到仓库。 - 网络受限环境下,按模型平台文档配置镜像源或离线下载后挂载到容器内。
10.5 GPU 服务无法识别显卡
- 确认宿主机 NVIDIA 驱动、CUDA 版本与镜像内
torch/ 推理框架版本匹配。 - Docker 方式运行 GPU 服务时,按官方 GPU 推理文档配置容器运行时与设备参数;纯 CPU 镜像不会自动获得 GPU 加速。
10.6 镜像体积过大
- 用
.bentoignore排除测试数据、数据集与临时产物。 - 核对
python_packages是否引入了未使用的大型依赖;模型权重外置挂载时不要重复打进镜像。
10.7 服务启动后模型初始化报错
- 查看服务日志中的模型加载阶段异常:常见原因是模型路径缺失、权重文件不完整、推理框架版本与模型不匹配。
- 对照官方 Examples 中同类型模型的服务实现逐项核对初始化代码与环境变量。
11 风险与合规说明
- 开源协议:BentoML 框架本体以 Apache License 2.0 发布,允许修改与再分发;二次开发与商用前请阅读许可证全文并保留版权声明。
- 模型与第三方依赖许可:服务中打包的模型权重、推理引擎与 Python 包各自适用独立许可证;部分模型仅限研究或非商用用途,对外提供服务前必须逐一核对其许可条款。
- 数据隐私:在线推理服务会接收用户输入并返回模型结果;生产部署应在网关层补充鉴权、传输加密、访问审计与输入输出合规审查,敏感数据按业务要求脱敏。
- 匿名使用统计:框架默认上报匿名内部调用统计,不含用户代码、模型数据与模型名称;如需完全关闭,使用
--do-not-track或BENTOML_DO_NOT_TRACK=True。 - 生成内容责任:模型输出可能存在错误、偏见或版权瑕疵,重要业务场景须人工复核;因模型输出引发的内容责任由部署方按适用法律与服务条款承担。
- 商业托管边界:BentoCloud 的部署、扩缩容、托管模型仓库等能力属于官方商业服务,与本文覆盖的开源自托管路径不同;具体功能与费用以官方站点为准。