BentoML核心概念(三):构建Bentos

简介: Bentos 是 BentoML 服务的布局格式。 Bento 是一个独立(self-contained)的存档,其中包含部署服务所需的所有信息,例如模型、代码、配置和数据文件。

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)中使用的模型标签。


相关文章
|
2月前
|
存储 JSON 数据格式
2.核心概念
2.核心概念
|
8天前
|
存储 Kubernetes 调度
K8S中的核心概念
【6月更文挑战第25天】k8s资源对象可以用yaml或者json格式声明。每个资源对象都有自己的特定结构定义,并统一保存在etcd这种非关系型数据库中。
|
2月前
|
存储 Kubernetes API
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
|
2月前
|
存储 C# 开发者
深入了解 C#编程的核心概念
【4月更文挑战第20天】C#是一种强大的面向对象编程语言,关键概念包括:面向对象(类、对象、继承、多态)、封装、数据类型、变量与常量、控制流、异常处理、委托和事件、泛型及集合。掌握这些概念并通过阅读代码、实践编写和学习新技巧行动,是成为熟练C#开发者的基石。了解并运用这些核心概念能提升代码效率、灵活性和可维护性。
|
容器
【系统架构】组件与(模块化和应用集成)的区别
【系统架构】组件与(模块化和应用集成)的区别
233 0
|
存储 SQL 监控
第四章 核心概念
第四章 核心概念
第四章 核心概念
|
存储 Python
BentoML核心概念(四):模型和 Bento 管理
BentoML 提供易于使用的本地和集中式商店来管理模型和bentos。 本文重点介绍基于本地文件系统的模型和 bento 商店的使用。 要了解有关集中式商店解决方案的更多信息,请参阅 BentoML Yatai。
|
传感器 存储 SQL
应用编排与管理:核心原理|学习笔记
快速学习应用编排与管理:核心原理
94 0
应用编排与管理:核心原理|学习笔记
|
存储 JSON 安全
ElasticSerach核心概念(三更)
ElasticSerach核心概念(三更)
ElasticSerach核心概念(三更)
|
存储 前端开发 Java
分层开发与响应式编程
分层开发与响应式编程
148 0
分层开发与响应式编程