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


相关文章
|
6月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
|
1月前
|
机器学习/深度学习 自然语言处理 算法
ChatGPT的底层核心概念
ChatGPT的底层核心概念
|
8天前
|
存储 Kubernetes 调度
K8S中的核心概念
【10月更文挑战第26天】云原生环境下的安全问题易被忽视,导致潜在风险。应用层渗透测试和漏洞扫描是检测安全的关键,尤其是对于CVE漏洞的修复。然而,常见误解认为安全由外部防护处理且不易引入问题。
|
6月前
|
存储 JSON 数据格式
2.核心概念
2.核心概念
|
6月前
|
存储 Kubernetes API
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
|
6月前
|
存储 C# 开发者
深入了解 C#编程的核心概念
【4月更文挑战第20天】C#是一种强大的面向对象编程语言,关键概念包括:面向对象(类、对象、继承、多态)、封装、数据类型、变量与常量、控制流、异常处理、委托和事件、泛型及集合。掌握这些概念并通过阅读代码、实践编写和学习新技巧行动,是成为熟练C#开发者的基石。了解并运用这些核心概念能提升代码效率、灵活性和可维护性。
63 3
|
存储 SQL 监控
第四章 核心概念
第四章 核心概念
第四章 核心概念
|
存储 Python
BentoML核心概念(四):模型和 Bento 管理
BentoML 提供易于使用的本地和集中式商店来管理模型和bentos。 本文重点介绍基于本地文件系统的模型和 bento 商店的使用。 要了解有关集中式商店解决方案的更多信息,请参阅 BentoML Yatai。
|
传感器 存储 SQL
应用编排与管理:核心原理|学习笔记
快速学习应用编排与管理:核心原理
115 0
应用编排与管理:核心原理|学习笔记
|
存储 JSON 安全
ElasticSerach核心概念(三更)
ElasticSerach核心概念(三更)
ElasticSerach核心概念(三更)
下一篇
无影云桌面