☰
BentoML Bento 构建选项(Build Options)完整指南:从 bentofile.yaml 到可部署 Bento 的运行时规格配置
2026/9/25 3:21:52 网站建设 项目流程
  • 模型推理服务
  • 人工智能
  • 后端
  • 大模型
  • 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!

项目地址:https://gitcode.com/gh_mirrors/be/BentoML
点击查看免费下载

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 仓库,按以下步骤操作:

  1. 通过 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
  1. 确保启用pack_git_packages,这样私有包才能用于构建;
  2. 设置环境变量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 - gfortran

BentoML 使用 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字段配置总表

字段说明
distroDocker 镜像上的 OS 发行版,默认为debian
python_versionDocker 镜像上的 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!

项目地址:https://gitcode.com/gh_mirrors/be/BentoML
点击查看免费下载

相关推荐

上一篇:7个黄金法则:Basecamp如何用极简主义打造持续创新的独立产品
下一篇:DeepSpeed 渐进式层丢弃(PLD)实战:用 Progressive Layer Dropping 加速 Transformer 语言模型训练

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询