自从我写这篇文章以来,发生了很多变化BentoML 简介:统一的 AI 应用程序框架,无论是在一般人工智能领域还是BentoML生成式人工智能大型语言模型、扩散模型、ChatGPT (Sora) 和 Gemma:这些可能是过去几个月被提及最多的术语人工智能领域的变化速度是惊人的。在这些辉煌的人工智能突破中,对人工智能部署工具的追求不仅是功能强大但也人性化且性价比不变。对于 BentoML,它附带了重大更新 1.2,它朝着同样的目标迈进。

在这篇博文中,让我们重新审视 BentoML 并使用一个简单的示例来了解如何利用 BentoML 提供的一些新工具和功能在生产中构建 AI 应用程序。

我将构建的示例应用程序能够执行图像字幕,其中涉及使用人工智能为图像生成文本描述。 BLIP(引导语言-图像预训练)是一种改进这些 AI 模型的方法,首先对大型图像-文本数据集进行训练以理解它们之间的关系,然后通过字幕等特定任务进一步完善这种理解。我将在下面的部分中使用的 BLIP 模型是 Salesforce/blip-图像标题大。您可以在此示例中使用任何其他 BLIP 模型,因为代码实现逻辑是相同的。

快速介绍

在我们深入研究之前,让我们重点介绍一下 BentoML 带来的变化,尤其是其 1.2 更新。 BentoML 的核心是一个开源平台,旨在简化 AI 应用程序的服务和部署。以下是 BentoML 1.2 的简化工作流程:

  1. 模型包装:使用 BentoML Service SDK 包装您的机器学习模型,以便您可以将其公开为推理端点。
  2. 模型服务:在您自己的计算机上运行模型,利用您自己的资源(例如 GPU)通过端点进行模型推理。
  3. 轻松部署:将模型部署到无服务器平台 BentoCloud。

最后一步,之前我们需要手动构建一个Bento(BentoML中的统一分发单元,包含源代码、Python包、模型引用和配置),然后将其推送并部署到BentoCloud。在 BentoML 1.2 中,“构建、推送和部署”现已合并为单个命令 bentoml deploy。我将在下面的示例中详细讨论详细信息和 BentoCloud。

注意:如果您想在自己的基础设施中部署模型,您仍然可以通过手动构建 Bento,然后将其容器化为符合 OCI 的映像来实现。< /em>

现在,让我们开始看看它在实践中是如何运作的!

设置环境

使用venv创建虚拟环境。建议这样做,因为它有助于避免潜在的包冲突。

python -m venv Bentoml-new
来源 Bentoml-new/bin/activate

安装所有依赖项。

pip install "bentoml>=1.2.2" 枕形火炬变压器

构建 BentoML 服务

首先,导入必要的包并使用常量来存储模型 ID。

from __future__ 导入注解

将输入导入为 t

导入便当
从 PIL.Image 导入图像

MODEL_ID =“Salesforce/blip-image-captioning-large”

接下来,让我们创建一个 BentoML 服务。对于 BentoML 1.2 之前的版本,我们使用称为“Runners”的抽象进行模型推理。在 1.2 中,BentoML 通过将 API 服务器和 Runner 的功能集成到名为“服务。”它们是在 BentoML 中定义模型服务逻辑的关键构建块。

从 1.2 开始,我们使用 @bentoml.service 装饰器在名为 service.py 的文件中将 Python 类标记为 BentoML 服务。对于这个 BLIP 示例,我们可以创建一个名为 BlipImageCaptioning 的服务,如下所示:

<前><代码>@bentoml.service
BlipImageCaptioning 类:

在初始化过程中,我们通常会加载模型(以及必要时的其他组件)并将其移动到 GPU 以获得更好的计算效率。如果您不确定要使用什么函数或包,只需复制并粘贴 BLIP 模型的 Hugging Face 存储库。这是一个例子:

<前><代码>@bentoml.service
BlipImageCaptioning 类:

def __init__(self) -> 无:
进口火炬
从转换器导入 BlipProcessor、BlipForConditionalGeneration
# 使用 torch 加载模型并将其设置为使用 GPU 或 CPU
self.device = “cuda” if torch.cuda.is_available() else “cpu”
self.model = BlipForConditionalGeneration.from_pretrained(MODEL_ID).to(self.device)
self.processor = BlipProcessor.from_pretrained(MODEL_ID)
print(“模型 blip 已加载”, “设备:”, self.device)

下一步是通过 @bentoml.api 创建用于用户交互的端点函数。当应用于 Python 函数时,它会将该函数转换为可以处理 Web 请求的 API 端点。

这个 BLIP 模型可以获取图像和可选的一些用于字幕的起始文本,所以我这样定义它:

<前><代码>@bentoml.service
BlipImageCaptioning 类:

@bentoml.api
async defgenerate(self, img: Image, txt: t.Optional[str] = None) -> str:
如果是txt:
输入 = self.processor(img, txt, return_tensors=”pt”).to(self.device)
别的:
输入 = self.processor(img, return_tensors=”pt”).to(self.device)
# 通过模型处理输入,为给定图像生成标题,设置可以添加到标题中的新标记(单词)的最大和最小数量的限制。
out = self.model.generate(**输入,max_new_tokens=100,min_new_tokens=20)
# 将生成的输出解码为可读的标题,跳过任何不适合显示的特殊标记
返回 self.processor.decode(out[0],skip_special_tokens=True)

类中的 generate 方法是作为 API 端点公开的异步函数。它接收图像和可选的 txt 参数,使用 BLIP 模型处理它们,并返回生成的标题。请注意,主要推理代码也来自 BLIP 模型的 Hugging Face 存储库。 BentoML 这里仅帮助您管理输入和输出逻辑.

这就是全部代码!完整版本:

from __future__ 导入注解

将输入导入为 t

导入便当
从 PIL.Image 导入图像

MODEL_ID =“Salesforce/blip-image-captioning-large”

@bentoml.service
BlipImageCaptioning 类:

    def __init__(self) -> 无:
        进口火炬
        从转换器导入 BlipProcessor、BlipForConditionalGeneration
        self.device = "cuda" if torch.cuda.is_available() else "cpu"
        self.model = BlipForConditionalGeneration.from_pretrained(MODEL_ID).to(self.device)
        self.processor = BlipProcessor.from_pretrained(MODEL_ID)
        print("模型 blip 已加载", "设备:", self.device)

    @bentoml.api
    async defgenerate(self, img: Image, txt: t.Optional[str] = None) -> str:
        如果是txt:
            输入 = self.processor(img, txt, return_tensors="pt").to(self.device)
        别的:
            输入 = self.processor(img, return_tensors="pt").to(self.device)

        out = self.model.generate(**输入,max_new_tokens=100,min_new_tokens=20)
        返回 self.processor.decode(out[0],skip_special_tokens=True)

要在本地提供此模型,请运行:

bentoml 服务服务:BlipImageCaptioning

可通过 http://localhost:3000 访问 HTTP 服务器。您可以使用 Swagger UI 与其交互。

服务 API:执行

我上传了下面的图像(我使用稳定扩散创建了该图像,并且它也是使用 BentoML 部署的)并使用提示文本“森林中的独角兽”进行推理。

森林里的独角兽,背景是彩虹,前景是花朵,前景是池塘,前景是彩虹

模型输出的图像标题是:森林里的独角兽,背景有彩虹,前景是花朵,前景有彩虹的池塘

本地服务工作正常,但在生产中部署人工智能应用程序时,我们始终需要考虑不同的事情,例如基础设施(尤其是 GPU)、扩展性、可观察性和成本效率。这就是 BentoCloud 的用武之地。

部署到 BentoCloud

解释 BentoCloud 可能需要一篇独立的博客文章。以下概述了它提供的功能以及如何利用它进行机器学习部署:

  • 机器学习工作负载自动扩展:BentoCloud 根据传入流量动态扩展部署副本,在不活动期间缩减至零以优化成本。
  • 内置可观察性:通过 BentoCloud 控制台实时了解流量、监控资源利用率、跟踪操作事件并查看审核日志。
  • 优化基础设施。借助 BentoCloud,重点完全转移到代码开发,因为该平台管理所有底层基础设施,确保为您的 AI 应用程序提供优化的环境。

要为 BentoCloud 部署准备 BentoML 服务,请首先在服务代码中指定 resources 字段。这告诉 BentoCloud 如何为您的服务分配正确的实例类型。有关详细信息,请参阅配置

<前><代码>@bentoml.service(
资源={
“内存”:“4Gi”
}

BlipImageCaptioning 类:

接下来,创建一个 bentofile.yaml 文件来定义用于构建 Bento 的构建选项。同样,使用 BentoCloud 时,您不需要手动构建 Bento,因为 BentoML 会自动为您完成此操作。

服务:“服务:BlipImageCaptioning”
标签:
  所有者: Bentoml 团队
  项目:画廊
包括:
- “*.py”
Python:
套餐:
    - 火炬
    - 变压器
    - 枕头

使用 bentoml deploy 命令将您的服务部署到 BentoCloud,并使用 -n 标志为您的部署分配自定义名称。不要忘记 提前登录

bentoml 部署 . -n blip 服务

部署涉及一系列自动化流程,其中 BentoML 构建 Bento,然后将其推送并部署到 BentoCloud。您可以看到终端中显示的状态。

推送结果屏幕

一切就绪!部署后,您可以在 BentoCloud 控制台上找到部署,它提供了一个全面的界面,为与您的服务交互提供了增强的用户体验。

BentoCloud console

结论

BentoML 1.2 显着简化了 AI 部署,使开发人员能够轻松地将 AI 模型投入生产。它与 BentoCloud 的集成提供了可扩展、高效的解决方案。在以后的博客文章中,我将演示如何针对不同场景构建更多可用于生产的人工智能应用程序。快乐编码!

Comments are closed.