- 模型推理服务
- 人工智能
- 后端
- 大模型
- MLOps
- LLMOps
【免费下载链接】BentoML
The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!
Bento 构建选项(Build Options)是 BentoML 中定义项目运行时规格、将源码工程打包为可部署 Bento 的一整套配置体系,你可以通过pyproject.toml的[tool.bentoml.build]段或 YAML 配置文件(通常命名为bentofile.yaml)来声明。读完本文你将掌握service、models、python、conda、docker、envs等全部核心字段的语义与用法,理解 include/exclude 打包规则、PyPI 依赖锁定机制,并学会在大型多模块代码库中使用自定义build_ctx完成 Bento 构建。
注意:自 v1.3.20 起,BentoML 引入了新的 Python SDK 来定义运行时环境,提供了一种比
pyproject.toml/bentofile.yaml更具编程性的替代方案。BentoML 会持续兼容这些配置文件,但官方建议在新项目中优先使用 Python SDK 定义运行时环境。
配置文件的两张面孔:pyproject.toml与bentofile.yaml
构建选项既可以写在pyproject.toml的[tool.bentoml.build]段,也可以写在独立的 YAML 文件(如bentofile.yaml)中。BentoML 的构建器会优先在构建上下文中寻找这两类文件(源码中定义为DEFAULT_BENTO_BUILD_FILES = ("bentofile.yaml", "pyproject.toml"),见 src/bentoml/_internal/bento/bento.py),并分别通过from_pyproject(基于tomllib/tomli解析)和from_yaml(基于yaml.safe_load解析)加载为同一个BentoBuildConfig模型(见 src/bentoml/_internal/bento/build_config.py)。
下面各节将同时给出两种格式的等价写法。
核心字段逐一解析
service:必填字段,指定 Service 入口
service是构建 Bento 时必须提供的字段,它指向一个@bentoml.service装饰的 Service 对象所在的位置,通常写作service: "service:class-name"的形式:
service:Python 模块名,即service.py文件;class-name:在service.py中定义、由@bentoml.service装饰的类名。若service.py中存在多个 Service,可以在此指定接收用户请求的主 Service,其余 Service 会随主 Service 一同启动。
# pyproject.toml [tool.bentoml.build] service = "service:MyService"# bentofile.yaml service: "service:MyService"在构建过程中,BentoML 会实际导入该 Service 以校验其可加载性(svc = load(build_config.service, working_dir=build_ctx, ...),见 src/bentoml/_internal/bento/bento.py);如果配置中没有写service字段,BentoML 会自动从构建上下文中推导出 Service 的导入字符串。
description:为 Bento 添加文档说明
description允许你为 Bento 附加相关说明文档,支持纯文本或 Markdown 格式,既可以内联提供,也可以引用外部文件:
# pyproject.toml [tool.bentoml.build] service = "service:svc" description = "This is an inline description for the Service. BentoML is awesome!"# pyproject.toml [tool.bentoml.build] service = "service:svc" description = "file: ./README.md"# bentofile.yaml service: "service:svc" description: | ## Description For My Bento 🍱 Use **any markdown syntax** here! > BentoML is awesome!# bentofile.yaml service: "service:svc" description: "file: ./README.md"对于来自外部文件的描述,可以使用绝对路径或相对路径,并确保执行bentoml build时文件真实存在。相对路径的参考点是build_ctx(默认是执行bentoml build的当前目录)。从源码实现看,当描述以file:开头时,BentoML 会解析并复制该文件到 Bento 的readme.md;当描述为空但构建上下文存在readme.md时也会自动带上(见 src/bentoml/_internal/bento/bento.py)。
labels:给 Bento 与模型打标签
labels是与对象关联的键值对。在 BentoML 中,Bento 和模型都可以附加标签,用于在 BentoCloud 中识别、分类 Bento 和模型,且可随时添加或修改。
# pyproject.toml [tool.bentoml.build.labels] owner = "bentoml-team" stage = "not-ready"# bentofile.yaml labels: owner: bentoml-team stage: not-ready从源码可以看出,Service 自身定义的labels也会与配置中的labels合并(build_config.labels.update(svc.labels),见 src/bentoml/_internal/bento/bento.py)。此外,若 Service 暴露了 OpenAI 兼容的/chat/completions端点,构建时还会自动写入openai_endpoint标签(见 src/bentoml/_internal/bento/bento.py)。
args:为模板参数动态赋值
在通过bentoml.use_arguments定义了 Service 的模板参数后,可以使用args字段在构建配置中动态设置对应值。例如:
# service.py from pydantic import BaseModel import bentoml class BentoArgs(BaseModel): model_name: str gpu: int = 8 gpu_type: str = "nvidia-h200-141gb" args = bentoml.use_arguments(BentoArgs) @bentoml.service( resources={ "gpu": args.gpu, "gpu_type": args.gpu_type } ) class LLM: model = bentoml.models.HuggingFaceModel(args.model_name)然后在构建配置中提供这些参数的值:
# pyproject.toml [tool.bentoml.build.args] model_name = deepseek-ai/DeepSeek-V3 gpu = 4# bentofile.yaml args: model_name: deepseek-ai/DeepSeek-V3 gpu: 4从源码实现看,use_arguments会接收 pydantic 模型并完成校验(return model(**arguments)),校验失败时会抛出InvalidArgument提示通过--arg提供正确参数;而set_arguments(arguments, override=False)会将配置文件中的args与命令行传入的参数合并,且命令行参数优先(见 src/bentoml/_internal/utils/args.py 与 src/bentoml/_internal/bento/build_config.py)。
include与exclude:精确控制打包文件
include用于指定构建 Bento 时要打包的特定文件,支持通配符与目录模式匹配。例如设为*.py表示将build_ctx下所有 Python 文件打包进 Bento:
# pyproject.toml [tool.bentoml.build] include = ["data/", "**/*.py", "config/*.json", "path/to/a/file.csv"]# bentofile.yaml include: - "data/" - "**/*.py" - "config/*.json" - "path/to/a/file.csv"如果未指定include,BentoML 默认包含build_ctx下的所有文件(源码中默认值为["*"],见 src/bentoml/_internal/bento/build_config.py),仅排除exclude字段中显式声明的文件。
exclude用于排除特定文件,在目录文件较多时非常实用——你只需列出要忽略的文件。该字段指定相对于build_ctx目录的文件路径模式(类似于.gitignore):
# pyproject.toml [tool.bentoml.build] include = ["data/", "**/*.py"] exclude = ["tests/", "secrets.key"]# bentofile.yaml include: - "data/" - "**/*.py" exclude: - "tests/" - "secrets.key"
include和exclude均支持 gitignore 风格的模式匹配。
另一种方式是直接在build_ctx目录下创建.bentoignore文件:
# .bentoignore __pycache__/ *.py[cod] *$py.class .ipynb_checkpoints/ training_data/执行顺序:
exclude总是在include之后应用。
从源码实现看(BentoPathSpec,见 src/bentoml/_internal/bento/build_config.py),文件是否被打包由以下规则共同决定:必须同时命中include、不命中exclude、且不在内置忽略清单(.git/、.venv/、venv/、__pycache__/、.DS_Store)内,同时还会递归读取各子目录中的.bentoignore。打包时超过 10MiB 的文件会输出告警(见 src/bentoml/_internal/bento/bento.py)。此外,路径不能以../开头——超出构建上下文的文件无法直接包含,需要使用符号链接或手动复制。
models:指定 Bento 关联的模型
可以使用字符串模型标签(Model Tag)或字典来指定构建 Bento 时使用的模型。如果不在配置中定义models,则使用 Service 中引用的模型来构建 Bento。
# pyproject.toml [tool.bentoml.build] models = [ "summarization-model:latest", { tag = "summarization-model:version1", filter = "label:staging", alias = "summarization-model_v1" } ]# bentofile.yaml models: - "summarization-model:latest" # A string model tag - tag: "summarization-model:version1" # A dictionary filter: "label:staging" alias: "summarization-model_v1"各字段含义:
tag:模型名称与版本,用冒号分隔;filter:该字段使用与 BentoCloud 相同的过滤语法,用于筛选特定模型(例如筛选具有相同标签的模型),可以为一个模型添加多个以逗号分隔的过滤器;alias:模型别名。指定后可直接在代码中使用,如bentoml.models.BentoModel(alias)。
在源码中,字符串或字典都会被归一化为ModelSpec(tag, filter, alias)(见 src/bentoml/_internal/bento/build_config.py),构建时通过BentoModel(model_spec.tag)拉取并写入 Bento 的模型清单,同时将别名注册到BentoMLContainer.model_aliases(见 src/bentoml/_internal/bento/bento.py)。
Python 包管理:python字段全解
声明依赖包(packages)
使用python.packages字段声明 Bento 所需的 Python 包。BentoML 允许指定期望版本,也可以从自定义 PyPI 源或 GitHub 仓库安装。若某个包未指定版本,BentoML 在构建时会为当前平台与 Python 版本锁定所有 Python 包的版本。
在pyproject.toml中,可以通过project.dependencies声明依赖:
# pyproject.toml [project] dependencies = [ "numpy", "matplotlib==3.5.1", "package>=0.2,<0.3", "torchvision==0.9.2", "git+https://github.com/username/mylib.git@main", ]这与使用python.packages等价:
# pyproject.toml [tool.bentoml.build.python] packages = [ "numpy", "matplotlib==3.5.1", "package>=0.2,<0.3", "torchvision==0.9.2", "git+https://github.com/username/mylib.git@main" ]# bentofile.yaml python: packages: - "numpy" - "matplotlib==3.5.1" - "package>=0.2,<0.3" - "torchvision==0.9.2" - "git+https://github.com/username/mylib.git@main"如果同时指定project.dependencies和tool.bentoml.build.python.packages,两部分依赖会被合并(源码中通过python_packages.extend(dependencies)实现,见 src/bentoml/_internal/bento/build_config.py)。
不需要在此字段中显式声明
bentoml依赖——当前版本的 BentoML 默认会被加入依赖列表;如需覆盖,可以指定不同的 BentoML 版本。源码实现中,BentoML 会检查requirements.txt/packages中是否已含 bentoml 声明,若没有则自动追加(见 src/bentoml/_internal/bento/build_config.py)。
直接引用 requirements.txt
如果项目已有requirements.txt文件,也可以直接提供其路径:
# pyproject.toml [tool.bentoml.build.python] requirements_txt = "./project-a/ml-requirements.txt"# bentofile.yaml python: requirements_txt: "./project-a/ml-requirements.txt"注意:当同时指定
requirements_txt与packages时,源码会给出警告并忽略packages(见 src/bentoml/_internal/bento/build_config.py)。
从 GitHub 仓库安装包
使用 pip requirements 文件格式从 GitHub 仓库引入包,可以指定仓库 URL、分支、标签或提交哈希,以及当 Python 包不在仓库根目录时的子目录:
# pyproject.toml [tool.bentoml.build.python] packages = [ "git+https://github.com/username/repository.git@branch_name", "git+https://github.com/username/repository.git@v1.0.0", "git+https://github.com/username/repository.git@abcdef1234567890abcdef1234567890abcdef12", "git+https://github.com/username/repository.git@branch_name#subdirectory=package_dir", ]# bentofile.yaml python: packages: - "git+https://github.com/username/repository.git@branch_name" - "git+https://github.com/username/repository.git@v1.0.0" - "git+https://github.com/username/repository.git@abcdef1234567890abcdef1234567890abcdef12" - "git+https://github.com/username/repository.git@branch_name#subdirectory=package_dir"pack_git_packages选项(默认为true)控制这些 GitHub 包是否在构建过程中被克隆并打包进 Bento。这对于标准 PyPI 源中不可用的依赖、或需要锁定 Git 仓库特定版本(如 tag、commit)的依赖非常有用:
# pyproject.toml [tool.bentoml.build.python] pack_git_packages = true packages = ["git+https://github.com/username/repository.git@abcdef1234567890abcdef1234567890abcdef12"]# bentofile.yaml python: pack_git_packages: true # Enable packaging of Git-based packages packages: - "git+https://github.com/username/repository.git@abcdef1234567890abcdef1234567890abcdef12"需要留意lock_packages与pack_git_packages的联动:lock_packages控制是否在构建 Bento 时固定所有依赖(不仅仅是 Git 依赖)的版本。禁用pack_git_packages也会禁用包锁定(lock_packages),除非显式设置(源码中默认值推导逻辑为lock_packages = pack_git_packages is not False,见 src/bentoml/_internal/bento/build_config.py)。
平台锁定说明:BentoML 总是尝试针对 Linux x86_64 平台锁定包版本以匹配部署目标。如果 Bento 包含带环境标记(environment markers)的依赖或传递依赖,它们将按 Linux x86_64 平台解析。例如,若 Bento 依赖torch,即使nvidia-*系列包仅对 Linux x86_64 平台必需,也会被纳入最终锁定结果。如果要为其他平台构建 Bento,可以给bentoml build传入--platform选项:
$ bentoml build --platform macos使用私有 GitHub 仓库
要使用私有 GitHub 仓库,按以下步骤操作:
- 通过 SSH 引入仓库中的 Python 包,并确保运行 BentoML 的环境已配置相应的 SSH 密钥(且这些密钥已添加到 GitHub):
# pyproject.toml [tool.bentoml.build.python] packages = [ "git+ssh://git@github.com/username/repository.git@branch_name" # The SSH URL for the repository ]# bentofile.yaml python: packages: - "git+ssh://git@github.com/username/repository.git@branch_name" # The SSH URL for the repository- 确保启用
pack_git_packages,这样私有包才能用于构建; - 设置环境变量
BENTOML_ENABLE_FEATURES=no_image。
Pip 安装选项(pip install options)
可以在python字段中提供额外的pip install参数,这些参数将应用于python.packages中定义的所有包以及requirements_txt文件:
# pyproject.toml [tool.bentoml.build.python] requirements_txt = "./requirements.txt" index_url = "https://my.mirror.com/simple" no_index = false trusted_host = ["pypi.python.org", "my.mirror.com"] find_links = ["https://download.pytorch.org/whl/cu80/stable.html"] extra_index_url = [ "https://<other api token>:@my.mirror.com/pypi/simple", "https://pypi.python.org/simple" ] pip_args = "--pre -U --force-reinstall"# bentofile.yaml python: requirements_txt: "./requirements.txt" index_url: "https://my.mirror.com/simple" no_index: false trusted_host: - "pypi.python.org" - "my.mirror.com" find_links: - "https://download.pytorch.org/whl/cu80/stable.html" extra_index_url: - "https://<other api token>:@my.mirror.com/pypi/simple" - "https://pypi.python.org/simple" pip_args: "--pre -U --force-reinstall"默认情况下,BentoML 会在所有本地镜像构建之间缓存 pip 产物以加速构建。若要强制重新下载而不是使用缓存,可以在
bentofile.yaml中指定pip_args: "--no-cache-dir",或在bentoml containerize命令中使用--no-cache选项:
$ bentoml containerize my_bento:latest --no-cache从源码实现看,index_url、trusted_host、find_links、extra_index_url会被转换为uv pip compile的兼容参数,no_index追加--no-index,pip_args则按空白分词后追加到最终install.sh的命令行中(见 src/bentoml/_internal/bento/build_config.py)。此外,当no_index=true时会忽略index_url与extra_index_url(见 src/bentoml/_internal/bento/build_config.py)。
PyPI 包锁定机制(package locking)
默认情况下,BentoML 会自动锁定所有包的版本以及它们依赖图中的所有包,生成包含全部包及精确版本的requirements.txt(实际为requirements.lock.txt)。该过程底层使用uv pip compile。
如果已经为每个包指定了版本,或希望跳过此过程,可将lock_packages设为false:
# pyproject.toml [tool.bentoml.build.python] requirements_txt = "./requirements.txt" lock_packages = false# bentofile.yaml python: requirements_txt: "./requirements.txt" lock_packages: false从源码实现看,锁定流程会调用uv pip compile,并附带--allow-unsafe(为pyfilesystem2保留setuptools)、--emit-index-url、--emit-find-links、--no-annotate等参数,同时按目标平台传入--python-platform(见 src/bentoml/_internal/bento/build_config.py);Git 依赖随后会被替换为本地克隆打包的 wheel 路径(fix_dep_urls,见 src/bentoml/_internal/bento/build_config.py)。
python字段配置总表
| 字段 | 说明 |
|---|---|
requirements_txt | 自定义requirements.txt文件的路径 |
packages | 要包含进该 Bento 的包列表 |
lock_packages | 是否锁定包版本 |
index_url | --index-urlpip 参数的输入 |
no_index | 是否包含--no-indexpip 参数 |
trusted_host | 可信主机列表,作为--trusted-hostpip 参数的输入 |
find_links | 链接列表,作为--find-linkspip 参数的输入 |
extra_index_url | 额外索引 URL 列表,作为--extra-index-urlpip 参数的输入 |
pip_args | 安装包时要添加的任何额外 pip 参数 |
wheels | 要包含进 Bento 的 wheel 文件路径列表 |
环境变量:envs
环境变量对于以安全、灵活的方式管理配置和密钥非常重要。它们让你无需硬编码敏感信息(如 API 密钥、数据库凭据),也无需硬编码在不同环境之间可能变化的可配置参数。
在bentofile.yaml中通过envs键设置环境变量,每个环境变量以name和value键定义:
# pyproject.toml [tool.bentoml.build] envs = [ { name = "VAR_NAME", value = "value" }, { name = "API_KEY", value = "your_api_key_here" } ]# bentofile.yaml envs: - name: "VAR_NAME" value: "value" - name: "API_KEY" value: "your_api_key_here"这些环境变量会被注入到 Bento 容器中。从源码看,每个环境变量还可以带有stage字段(取值为all、build、runtime之一,默认为all),用于控制变量在构建阶段、运行阶段还是全部阶段生效(见 src/bentoml/_internal/bento/build_config.py)。
如果部署在 BentoCloud 上,既可以通过配置中的
envs设置环境变量,也可以在bentoml deploy时使用--env标志。配置部署中环境变量一节有详细介绍。
Conda 依赖:conda
Conda 依赖可以在conda字段下指定:
# pyproject.toml [tool.bentoml.build.conda] channels = ["default"] dependencies = ["h2o"] pip = ["scikit-learn==1.2.0"]# bentofile.yaml conda: channels: - default dependencies: - h2o pip: - "scikit-learn==1.2.0"channels:自定义的 conda channel。如果未指定,BentoML 默认使用社区维护的conda-forgechannel(源码中默认值填充逻辑见 src/bentoml/_internal/bento/build_config.py);dependencies:要包含进环境的自定义 conda 依赖;pip:要包含的特定 pip conda 依赖。
可选地,可以将已有 conda 环境的所有依赖导出到environment.yml文件,并在pyproject.toml或bentofile.yaml中提供该文件。如果指定了该文件,它将覆盖其他任何附加选项(源码中会给出警告并忽略channels/dependencies/pip,见 src/bentoml/_internal/bento/build_config.py)。
导出 conda 环境:
conda env export > environment.yml在配置中添加:
# pyproject.toml [tool.bentoml.build.conda] environment_yml = "./environment.yml"# bentofile.yaml conda: environment_yml: "./environment.yml"与 Python 包不同,BentoML 不支持自动锁定 conda 包版本,建议在配置文件中显式指定版本。
另请参阅:当提供
conda选项时,BentoML 会在生成的 Dockerfile 中选择预装 Miniconda 的 Docker 基础镜像。注意只有debian和alpine发行版支持conda,详见下文docker一节。源码中对此有显式校验:如果distro不在支持 Miniconda 的发行版列表内会直接抛出异常(见 src/bentoml/_internal/bento/build_config.py)。另外,conda与 CUDA 版本不能同时使用,若同时需要两者,请使用自定义基础镜像或dockerfile_template(见 src/bentoml/_internal/bento/build_config.py)。
Docker 镜像定制:docker
BentoML 让把 Bento 部署到 Docker 容器变得简单,并提供一组选项来自定义从 Bento 生成的 Docker 镜像。
以下docker字段包含一些基础 Docker 配置:
# pyproject.toml [tool.bentoml.build.docker] distro = "debian" python_version = "3.11" system_packages = ["libblas-dev", "liblapack-dev", "gfortran"]# bentofile.yaml docker: distro: debian python_version: "3.11" system_packages: - libblas-dev - liblapack-dev - gfortranBentoML 使用 BuildKit(缓存高效的构建工具包)来容器化 Bento。BuildKit 随 Docker 18.09 一起提供,因此如果你通过 Docker Desktop 使用 Docker,BuildKit 默认可用;如果使用独立版 Docker,可按照对应说明安装 BuildKit。
支持的 OS 发行版(distro)
BentoML 目前支持以下 OS 发行版:
debian:默认值,与 Ubuntu 类似;alpine:基于 Alpine Linux 的最小化 Docker 镜像;ubi8:Red Hat Universal Base Image;amazonlinux:Amazon Linux 2。
源码中(CONTAINER_METADATA,见 src/bentoml/_internal/container/frontend/dockerfile/init.py)记录了每个发行版支持的 Python 版本(3.9–3.14)、CUDA 版本(11.2.2–12.8.1)、架构(amd64、arm64、ppc64le、s390x)以及基础镜像与安装命令。需要注意的是:alpine与amazonlinux不支持 CUDA;amazonlinux仅支持 Python 3.8;debian/alpine额外支持 Miniconda。
Setup 脚本(setup_script)
对于更高级的 Docker 定制,还可以使用setup_script字段在镜像构建过程中注入任意脚本。例如,对于 NLP 项目,可以在镜像中预先下载 NLTK 数据:
# pyproject.toml [tool.bentoml.build.python] packages = ["nltk"] [tool.bentoml.build.docker] setup_script = "./setup.sh"# bentofile.yaml python: packages: - "nltk" docker: setup_script: "./setup.sh"在setup.sh文件中:
#!/bin/bash set -euxo pipefail echo "Downloading NLTK data.." python -m nltk.downloader all构建新的 Bento 后运行bentoml containerize MY_BENTO --progress plain查看 Docker 镜像构建进度。新构建的 Docker 镜像将包含预下载的 NLTK 数据集。
提示:处理 bash 脚本时,建议在开头添加
set -euxo pipefail。尤其是缺少set -e时,脚本会在bentoml containerize期间静默失败而不抛出异常。
也可以提供 Python 脚本来初始化 Docker 镜像:
# pyproject.toml [tool.bentoml.build.python] packages = ["nltk"] [tool.bentoml.build.docker] setup_script = "./setup.py"# bentofile.yaml python: packages: - "nltk" docker: setup_script: "./setup.py"在setup.py文件中:
#!/usr/bin/env python import nltk print("Downloading NLTK data..") nltk.download('treebank')注意上面示例脚本第一行的
#!/bin/bash与#!/usr/bin/env python(Shebang),提供给 BentoML 的 setup 脚本必须带有 Shebang。此外脚本必须可执行——源码中会检查os.access(setup_script, os.X_OK),非可执行文件在非 Windows 平台会直接报错(见 src/bentoml/_internal/bento/build_config.py)。
Setup 脚本总是在指定的 Python 包、conda 依赖和系统包安装完成后执行,因此可以在初始化脚本中导入并使用这些库。
docker字段配置总表
| 字段 | 说明 |
|---|---|
distro | Docker 镜像上的 OS 发行版,默认为debian |
python_version | Docker 镜像上的 Python 版本,默认为构建环境中的 Python 版本 |
cuda_version | 已弃用。用于在 Docker 镜像上运行需要 GPU 的模型。使用 PyTorch 或 TensorFlow 在 GPU 上运行模型时,建议直接用pip安装它们及其对应的 CUDA 依赖,无需单独配置cuda_version。参见 GPU 推理 |
system_packages | 将在容器中安装的系统包 |
setup_script | 在 Docker 构建过程中执行的 Python 或 Shell 脚本 |
base_image | 用户提供的 Docker 基础镜像,将覆盖镜像的所有其他自定义属性 |
dockerfile_template | 通过提供扩展默认 Dockerfile 的 Jinja2 模板来自定义生成的 Dockerfile |
关于python_version,从源码看 BentoML 只取主次版本(如3.11),并安装该大版本下最新的 Python;若需精确版本,应使用自定义 Docker 基础镜像(见 src/bentoml/_internal/bento/build_config.py)。base_image一旦指定,distro、python_version、cuda_version、system_packages等选项都会被忽略(见 src/bentoml/_internal/bento/build_config.py)。CUDA 版本参数支持缩写(如12、12.6),会自动映射到具体版本号(如12→12.8.1,见 src/bentoml/_internal/container/frontend/dockerfile/init.py)。
自定义构建上下文(Custom build context)
对于属于更大代码库、需要与其他本地 Python 模块交互的项目,或包含多个 Bento/Service 的项目,可能无法将所有 Service 定义代码和pyproject.toml(或bentofile.yaml)放在项目根目录。
BentoML 允许将 Service 定义和pyproject.toml(或bentofile.yaml)放在项目目录中的任意位置。在这种情况下,运行bentoml build命令时需指定build_ctx和bentofile参数:
build_ctx:构建上下文代表 Python 项目的工作目录。构建过程中它会被前置到PYTHONPATH,确保本地 Python 模块能正确导入。默认情况下,它被设置为执行bentoml build命令的当前目录。bentofile:默认为构建上下文中的pyproject.toml(或bentofile.yaml)文件。
自定义这两个值的用法:
bentoml build -f ./src/my_project_a/bento_fraud_detect.yaml ./src/从 CLI 源码看,build命令的第一个位置参数即build_ctx(默认.),-f/--bentofile指定配置文件路径,还支持--name、--version、--label KEY=VALUE、-o/--output、--containerize、--push、--platform等选项(见 src/bentoml_cli/bentos.py)。在源码层面,build_ctx会被os.path.realpath(os.path.expanduser(...))解析,且必须是存在的目录,否则抛出InvalidArgument(见 src/bentoml/_internal/bento/bento.py)。
Bento 的标准目录结构
默认情况下,所有构建的 Bento 都存储在 BentoML 的 Bento Store(本质上是本地目录)中。可以通过以下命令进入特定 Bento 的目录:
cd $(bentoml get BENTO_TAG -o path)根据pyproject.toml(或bentofile.yaml)中的配置,目录内可能包含不同的文件和子目录。一个典型的 Bento 包含以下关键子目录:
src:包含include字段指定的文件。这些文件相对于用户 Python 代码的 CWD(当前工作目录),因此用户代码中可以导入相对模块和文件路径;apis:包含根据 Service 的 API 规格自动生成的 API 定义(如openapi.yaml,以及非 legacy 模式的schema.json,见 src/bentoml/_internal/bento/bento.py);env:包含 Bento 初始化所需的环境相关文件,这些文件根据pyproject.toml(或bentofile.yaml)中指定的构建选项生成——其中env/python存放requirements.txt、requirements.lock.txt、install.sh与wheels/,env/docker存放生成的Dockerfile与entrypoint.sh,env/conda存放environment.yml。
警告:不建议直接修改 Bento 中的文件,除非是出于调试目的。
- 模型推理服务
- 人工智能
- 后端
- 大模型
- MLOps
- LLMOps
【免费下载链接】BentoML
The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more!
相关推荐
ZenML 集成 BentoML Model Deployer 实战:从 Bento 构建到本地 HTTP 与容器化模型部署
ZenML 集成 BentoML Model Deployer 实战:从 Bento 构建到本地 HTTP 与容器化模型部署 本文以 ZenML 官方文档《Be
MLOps机器学习后端工作流自动化AI AgentGraphile Build 插件选项(Plugin Options)完全指南:从 nodeIdFieldName 到自定义配置的命名规范
Graphile Build 插件选项(Plugin Options)完全指南:从 nodeIdFieldName 到自定义配置的命名规范 导读 本文以 gra
后端API网关JVMS源码解析:理解Go语言实现的版本管理器核心逻辑
JVMS源码解析:理解Go语言实现的版本管理器核心逻辑 JVMS(JDK Version Manager)是一款专为Windows系统设计的JDK版本管理工具,
开发工具CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考