Bento 文件结构
Bento 遵循目录结构如下所示,下面我们来更详细地研究每个文件和目录。
> cd $(bentoml get iris_classifier:latest --path) > ls -lR - README.md - bento.yaml - /apis/ - openapi.yaml - /env/ - /python - python_version.txt - requirements.txt - /wheels - /docker - Dockerfile - docker-entrypoint.sh - bentoml-init.sh - /conda - environment.yml - /src - bento.py - /common - my_lib.py - my_config.json - /models - /iris_classifier - /yftvuwkbbbi6zcphca6rzl235 - model.pkl - bentoml_model.yaml 复制代码
README.md:
描述此 Bento 服务的 markdown 格式的 README 文件。
bento.yaml:
Bento 服务的配置。
/apis 目录:
包含 Bento 服务的 API 规范的目录。 OpenAPI 规范可以在 openapi.json
中找到。
对 Protobuf 的支持在当前路线图(roadmap)中,并将在未来的版本中得到支持。
/env 目录:
依赖环境的配置。
- Python 版本和要求可以在
/python
下找到。 - Docker 文件和入口点(entry point) shell 脚本可以在
/docker
下找到。 - conda 环境配置可以在 /conda 下找到。
/src 目录:
包含服务定义及其依赖模块的目录。服务所需的数据文件也可以在此目录下找到。
/models 目录:
包含服务定义的依赖模型的目录。
构建参数选项
回顾一下之前的入门指南,bentos 是使用 build
CLI 命令构建的。
> bentoml build # 或者 > bentoml build -f ./bentofile.yaml 复制代码
还有一个等效的 Python API 用于构建 Bento:
import bentoml bentoml.build( 'fraud_detector:svc', # Other build options ) 复制代码
构建的bentos被添加到本地bento商店,并且可以使用 Python API 和 CLI 进行管理。
> bentoml list # list all bentos in the store > bentoml get iris_classifer:latest # get the description of the bento 复制代码
默认情况下,构建参数选项适用于最常见的情况。构建将包含当前工作目录中的所有文件,除了同一目录中的 .bentoignore
文件中指定的文件。 它还将自动推断服务代码所需的所有 PyPI 包,并确定当前环境中使用的版本。
但是,我们可以进一步自定义服务的构建。具体Python代码如下所示:
import bentoml bentoml.build( service="fraud_detector.py:svc", version="any_version_label", # override default version generator description=open("README.md").read(), include=['*'], exclude=[], # files to exclude can also be specified with a .bentoignore file additional_models=["iris_model:latest"], # models to pack in Bento, in addition to the models required by service's runners labels={ "foo": "bar", "team": "abc" }, python=dict( packages=["tensorflow", "numpy"], # requirements_txt="./requirements.txt", index_url="http://<api token>:@mycompany.com/pypi/simple", trusted_host=["mycompany.com"], find_links=['thirdparty..'], extra_index_url=["..."], pip_args="ANY ADDITIONAL PIP INSTALL ARGS", wheels=["./wheels/*"], lock_packages=True, ), docker=dict( # "base_image": "mycompany.com/registry/name/tag", distro="amazonlinux2", gpu=True, setup_script="setup_docker_container.sh", python_version="3.8", ), conda={ "environment_yml": "./environment.yml", "channels": [], "dependencies": [], } ) 复制代码
我们也可以将所有构建选项放在同一目录下的 bentofile.yaml
中。
service: "iris_classifier:svc" description: "file: ./readme.md" labels: foo: bar team: abc include: - "*.py" - "*.json" exclude: - "*.pyc" additional_models: - "iris_model:latest" docker: distro: debian gpu: True python_version: "3.8" setup_script: "./setup_env.sh" python: packages: - tensorflow - numpy - --index-url http://my.package.repo/simple/ SomePackage - --extra-index-url http://my.package.repo/simple SomePackage - -e ./my_py_lib index_url: http://<api token>:@mycompany.com/pypi/simple trusted_host: mycompany.com # index_url: null # means --no-index find_links: - file:///local/dir - thirdparth... extra_index_urls: - abc.com pip_args: "-- " wheels: - ./build/my_lib.whl lock_packages: true 复制代码
下面,我们来一起探索可用的选项。
版本
要构建的 bento 的版本可以由 bento 关键字参数指定。 如果没有明确指定,版本会根据构建的时间戳和随机字节自动生成。
描述
关键字参数设置 Bento 服务的描述。内容将用于在Bento存档中创建 README.md 文件。如果未明确指定,则构建首先在当前工作目录中查找 README.md 是否存在,并将文件的内容设置为描述。
Include
include 关键字参数指定要包含在构建中的 Python 模块和数据文件的路径规范(类似于.gitignore
文件)。 路径规范是相对于当前工作目录的。 如果未明确指定,则当前工作目录下的所有文件和目录都包含在构建中。
Exclude
exclude 关键字参数指定要在构建中排除的 Python 模块或数据文件的路径规范(类似于 .gitignore
文件)。 路径规范是相对于当前工作目录的。
用户还可以选择将 .bentoignore
文件放在运行bentoml 构建的目录中,以在构建期间实现相同的文件排除。 如果未明确指定,则不会从构建中排除任何内容。 Exclude在Include之后应用。
Docker 选项
用于生成 Bento 服务的 Docker 镜像的选项,例如选择基础镜像和启用 GPU 的使用。
环境
env
关键字参数指定部署便当所需的 Python 版本和依赖项。
如果未明确指定,则构建通过递归遍历所有依赖项来自动推断服务所需的 PyPI 包。 虽然自动推断很方便,但我们仍然建议明确定义所需的包和版本,以确保更确定的构建和部署。
添加的模型
该构建会根据服务定义自动识别要构建到bento中的模型及其版本。
服务定义通过框架特定的 load_runner()
函数加载运行器(runners),构建将通过参数中提供的标签来识别模型。 使用 additional_models
关键字参数来包含客户运行器(runners)中使用的模型标签。