《BentoML简介:统一的AI应用框架》

BentoML Unified AI Application Framework

从构建机器学习(ML)模型到将其部署到生产环境中的过程往往是一条崎岖的道路。这是一个重要但复杂的过程,数据科学家和工程师必须弥合他们之间的知识差距。数据科学家擅长创建模型,但在部署到生产环境时可能遇到困难。另一方面,工程师可能在持续迭代ML模型时遇到困难,导致低效、容易出错的操作。

考虑以下具体场景:您刚刚为文本摘要创建了一个ML模型,在测试中表现出色。您计划与团队共享此模型,以在其上构建应用程序。然而,将此模型发布出去带来了一个独特的挑战:确保您的团队可以在不修改代码或环境设置的情况下使用您的模型。

这就是BentoML的作用。

BentoML是一个开源的ML模型服务框架,旨在简化部署过程。通过促进从模型创建到生产的顺畅交接,这个端到端的框架使数据科学家和开发人员能够专注于他们擅长的领域,弥合了这两个关键角色之间的差距。结果,模型可以快速、可扩展地部署,确保更稳定的生产服务。

您可以使用BentoML框架开发生产就绪的模型服务端点。以下是BentoML的工作方式:

1. 指定模型:在使用BentoML之前,您需要从一个或一组模型开始。这些模型可以使用各种库(如TensorFlow或PyTorch)进行训练。
2. 保存模型:在训练好模型后,将其保存在BentoML本地模型存储中。它作为一个管理中心,为所有模型提供方便的访问方式,并以一种系统化的方式跟踪它们。
3. 创建BentoML服务:您需要创建一个`service.py`文件来封装您的模型并定义服务逻辑。它指定了Runner(BentoML中的一个抽象概念,用于优化推断)来执行规模化的模型推断,并构建您希望对外公开的端点。
4. 构建Bento:此步骤涉及将您的模型和BentoML服务打包到一个Bento中,通过配置YAML文件来完成。Bento是一个准备好部署的工件,它将所有必要的元素捆绑在一起:您的模型代码、其依赖项和服务逻辑。稍后我会给您一个更具体的例子。
5. 部署Bento:一旦准备好Bento,就可以部署它了。您可以将Bento容器化为Docker镜像,以便在Kubernetes上部署。如果您喜欢一体化解决方案,可以直接将Bento部署到Yatai,这是BentoML生态系统中的一个开源平台,用于自动化和管理Kubernetes上的机器学习部署。如果您想要一个完全托管的服务,请考虑通过BentoCloud部署Bento,这是一个用于构建和操作AI应用程序的无服务器解决方案。

现在,您对BentoML及其工作流程有了基本的了解,让我们看一个例子,了解BentoML如何简化模型服务和部署。

## 设置环境

要在本地运行此项目,请确保具备以下条件:

– Python 3.8+
– 安装了`pip`

然后,创建一个目录来存储所有项目文件,包括上述提到的`service.py`。我将逐一创建它们。

“`bash
mkdir bentoml-demo
cd bentoml-demo
“`

我建议您使用虚拟环境进行依赖隔离。

“`bash
python -m venv venv
source venv/bin/activate
“`

创建一个包含所有所需库的`requirements.txt`文件。

“`bash
bentoml
transformers
torch>=2.0
“`

安装依赖项:

“`bash
pip install -r requirements.txt
“`

## 将模型下载到本地模型存储

在本博客文章中,我使用了一个文本摘要Transformer模型(sshleifer/distilbart-cnn-12-6),作为示例。

import transformers
import bentoml

model= "sshleifer/distilbart-cnn-12-6"
task = "summarization"

bentoml.transformers.save_model(
    task,
    transformers.pipeline(task, model=model),
    metadata=dict(model_name=model),
)

运行此脚本将会下载并保存模型到本地。

python3 download_model.py

如果下载成功,模型将出现在模型存储中。您可以稍后检索此模型以创建BentoML服务。

$ bentoml models list

标签                                    模块                  大小       创建时间       
summarization:5kiyqyq62w6pqnry         bentoml.transformers  1.14 GiB   2023-07-10 11:57:40 

注意:所有下载到模型存储中的模型都保存在目录 /home/user/bentoml/models/ 中。

创建一个BentoML服务

有了可用的模型,您可以通过定义一个名为 service.py 的文件来创建一个BentoML服务,如下所示。此脚本从之前下载的模型中创建一个 summarizer_runner 实例,并将其封装在一个 bentoml.Service() 中。被 @svc.api() 装饰的 summarize() 函数指定了服务的API端点以及处理输入和输出的逻辑。

import bentoml

summarizer_runner = bentoml.models.get("summarization:latest").to_runner()

svc = bentoml.Service(
    name="summarization", runners=[summarizer_runner]
)

@svc.api(input=bentoml.io.Text(), output=bentoml.io.Text())
async def summarize(text: str) -> str:
    generated = await summarizer_runner.async_run(text, max_length=3000)
    return generated[0]["summary_text"]

在项目目录中,使用 bentoml serve 命令以开发模式启动BentoML服务器。

$ bentoml serve service:svc --development --reload

2023-07-10T12:13:33+0800 [INFO] [cli] 可以在 http://localhost:3000/metrics 上访问来自 "service:svc" 的 HTTP BentoServer 的 Prometheus指标。
2023-07-10T12:13:34+0800 [INFO] [cli] 从 "service:svc" 启动生产环境的 HTTP BentoServer,监听在 http://0.0.0.0:3000 (按下 CTRL+C 退出)
2023-07-10 12:13:34 circus[5290] [INFO] 加载插件...
2023-07-10 12:13:34 circus[5290] [INFO] 端点: 'tcp://127.0.0.1:61187'
2023-07-10 12:13:34 circus[5290] [INFO] 发布/订阅: 'tcp://127.0.0.1:61188'
2023-07-10T12:13:34+0800 [INFO] [observer] 监视目录: ['/Users/sherlock/Documents/bentoml-demo', '/Users/sherlock/bentoml/models']

服务器现在处于活动状态,在 http://0.0.0.0:3000 上提供一个Web用户界面。访问该网站,向下滚动到Service APIs,然后点击Try it out

请求正文框中输入您的文本,然后点击执行。以下是关于大型语言模型(LLM)概念的示例。

输入:

大型语言模型(LLM)是一个通过使用人工神经网络和大量的“参数”(即其层中的“神经元”与它们之间的权重,这些权重可以达到数十亿甚至数亿,这些神经元通过自监督学习或半监督学习在相对较短的时间内使用许多GPU进行(预)训练,以并行处理大量未标记文本,这些文本由维基百科语料库和Common Crawl等语料库提供,包含多达数万亿个标记(即单词部分),从而产生带有概率分布的分词词汇表。通过使用额外的GPU,LLM可以使用更多参数在更大量的未标记文本上(预)训练模型,从而升级。

文本摘要模型的输出:

大型语言模型(LLM)是一种计算机化的语言模型,由人工神经网络体现,使用大量的“参数”在其层之间具有数千万到数十亿的“权重”。可以使用额外的GPU对LLM进行升级,以在更多的未标记文本上使用更多的参数进行(预)训练。

构建Bento

现在模型已经正常运行,您需要将其打包成BentoML的标准分发格式,也称为“Bento”。 Bento包含运行服务所需的所有源代码、模型文件和依赖项。要构建一个Bento,在项目目录中创建一个bentofile.yaml文件。该文件定义了构建选项,如依赖项、Docker图像设置和模型。这里我只列出构建Bento所需的基本信息,如服务、要包含的Python文件和依赖项。详细信息请参阅BentoML文档。

service: 'service:svc'
include:
  - '*.py'
python:
  requirements_txt: requirements.txt

在项目目录中运行bentoml build命令来构建Bento。您可以在/home/user/bentoml/bentos/中找到所有创建的Bento。

$ bentoml build

从构建上下文"/Users/sherlock/Documents/bentoml-demo"构建BentoML服务"summarization:ulnyfbq66gagsnry"。
正在打包模型"summarization:5kiyqyq62w6pqnry"

██████╗░███████╗███╗░░██╗████████╗░█████╗░███╗░░░███╗██╗░░░░░
██╔══██╗██╔════╝████╗░██║╚══██╔══╝██╔══██╗████╗░████║██║░░░░░
██████╦╝█████╗░░██╔██╗██║░░░██║░░░██║░░██║██╔████╔██║██║░░░░░
██╔══██╗██╔══╝░░██║╚████║░░░██║░░░██║░░██║██║╚██╔╝██║██║░░░░░
██████╦╝███████╗██║░╚███║░░░██║░░░╚█████╔╝██║░╚═╝░██║███████╗
╚═════╝░╚══════╝╚═╝░░╚══╝░░░╚═╝░░░░╚════╝░╚═╝░░░░░╚═╝╚══════╝

成功构建Bento(tag="summarization:ulnyfbq66gagsnry")。

可能的下一步操作:

* 使用`bentoml containerize`将您的Bento容器化:
   $ bentoml containerize summarization:ulnyfbq66gagsnry

* 使用`bentoml push`将其推送到BentoCloud:
   $ bentoml push summarization:ulnyfbq66gagsnry

要查看所有可用的Bento,请运行以下命令:

$ bentoml list

标签                               大小       创建时间
summarization:ulnyfbq66gagsnry    1.25 GiB   2023-07-10 15:28:51

部署Bento

一旦Bento准备好,您可以使用bentoml serve在生产环境中提供服务。请注意,如果您有同一模型的多个版本,可以将latest标签更改为相应的版本。

$ bentoml serve summarization:latest

2023-07-10T15:36:58+0800 [INFO] [cli] Worker 0的环境:将CPU线程数设置为12
2023-07-10T15:36:58+0800 [INFO] [cli] 从“summarization:latest”的HTTP BentoServer获取的Prometheus指标可以在http://localhost:3000/metrics访问。
2023-07-10T15:36:59+0800 [INFO] [cli] 从“summarization:latest”启动生产环境的HTTP BentoServer,监听在http://0.0.0.0:3000(按CTRL+C退出)

另外,您还可以使用Docker将Bento容器化。在创建Bento时,Dockerfile会自动创建在/home/user/bentoml/bentos/summarization/ulnyfbq66gagsnry/env/docker/下。要创建Docker镜像,只需运行以下命令:

bentoml containerize summarization:latest

查看创建的Docker镜像:

$ docker images

REPOSITORY                    TAG                IMAGE ID       CREATED         SIZE
summarization                 ulnyfbq66gagsnry   da287141ef3e   7秒前          2.43GB

您可以在本地运行Docker镜像:

docker run -it --rm -p 3000:3000 summarization:ulnyfbq66gagsnry serve

使用Docker镜像,您可以在Kubernetes上运行模型,并创建一个Kubernetes Service来公开该模型,以便用户与其进行交互。

如果您正在寻找一个端到端的解决方案来部署模型,您可以选择使用Yatai在Kubernetes上部署和管理Bentos的部署规模。Yatai是BentoML生态系统中的一个重要组成部分,并且值得有一篇博客文章来解释其细节。如果您有兴趣,请查看Yatai的GitHub存储库。

结论

将机器学习模型从训练环境部署到生产环境并非易事,而这正是BentoML的优势所在。使用BentoML,您可以专注于模型构建,而框架会处理部署的复杂性。

随着机器学习模型在业务运营中的重要性日益增加,像BentoML这样的流畅模型服务和部署解决方案将变得不可或缺。BentoML不仅使部署模型变得轻松,而且还确保您的模型被高效地管理,并且可以根据您的需求进行扩展。如果您有兴趣,请立即开始使用BentoML,并体验模型部署的便捷性。祝编码愉快!