使用 BentoML 部署 Hugging Face 模型:DeepFloyd IF 实战

发布于 2023 年 8 月 9 日
在 GitHub 上更新

Hugging Face 提供了一个 Hub 平台,让您可以轻松上传、分享和部署模型。它为开发人员节省了从头训练模型所需的时间和计算资源。然而,在实际生产环境或云原生方式中部署模型仍然可能带来挑战。

这就是 BentoML 的用武之地。BentoML 是一个用于机器学习模型服务和部署的开源平台。它是一个统一的框架,用于构建、交付和扩展生产就绪的 AI 应用程序,包括传统模型、预训练模型、生成模型以及大型语言模型。以下是从高层次角度使用 BentoML 框架的方式:

  1. 定义模型:在使用 BentoML 之前,您需要一个机器学习模型(或多个模型)。这个模型可以使用 TensorFlow 和 PyTorch 等机器学习库进行训练。
  2. 保存模型:训练好模型后,将其保存到 BentoML 本地模型存储中,该存储用于本地管理所有训练好的模型并访问它们进行服务。
  3. 创建 BentoML 服务:您创建一个 service.py 文件来封装模型并定义服务逻辑。它指定了用于模型大规模推理的 Runner,并公开了 API 来定义如何处理输入和输出。
  4. 构建 Bento:通过创建一个 YAML 配置文件,您可以将所有模型和 Service 打包成一个 Bento,这是一个可部署的artifact,包含所有代码和依赖项。
  5. 部署 Bento:Bento 准备就绪后,您可以将 Bento 容器化以创建 Docker 镜像并在 Kubernetes 上运行。或者,直接将 Bento 部署到 Yatai,一个开源的端到端解决方案,用于自动化和大规模运行 Kubernetes 上的机器学习部署。

在这篇博客文章中,我们将演示如何通过遵循上述工作流程将 DeepFloyd IF 与 BentoML 集成。

目录

DeepFloyd IF 简介

DeepFloyd IF 是一种最先进的开源文本到图像模型。它凭借其独特的运行策略和架构,与 Stable Diffusion 等潜在扩散模型截然不同。

DeepFloyd IF 具有高度的照片真实感和复杂的语言理解能力。与 Stable Diffusion 不同,DeepFloyd IF 直接在像素空间中工作,利用包含冻结文本编码器和三个级联像素扩散模块的模块化结构。每个模块在过程中扮演着独特的角色:Stage 1 负责创建 64x64 像素的基础图像,然后通过 Stage 2 和 Stage 3 逐步将其升级到 1024x1024 像素。DeepFloyd IF 独特性中的另一个关键方面是它集成了大型语言模型(T5-XXL-1.1)来编码提示,这提供了对复杂提示的卓越理解。有关更多信息,请参阅这篇 关于 DeepFloyd IF 的 Stability AI 博客文章

为了确保您的 DeepFloyd IF 应用程序在生产环境中以高性能运行,您可能需要明智地分配和管理资源。在这方面,BentoML 允许您为每个阶段独立扩展 Runner。例如,您可以为 Stage 1 Runner 使用更多 Pod 或为其分配更强大的 GPU 服务器。

环境准备

此 GitHub 存储库存储了本项目所需的所有文件。要在本地运行此项目,请确保您具备以下条件:

  • Python 3.8+
  • 已安装 pip
  • 至少 2x16GB 显存 GPU 或 1x40GB 显存 GPU。本项目使用了 Google Cloud 的 n1-standard-16 型机器,外加 64GB 内存和 2 块 NVIDIA T4 GPU。请注意,虽然可以在单块 T4 上运行 IF,但生产级服务不建议这样做。

满足先决条件后,将项目存储库克隆到本地计算机并导航到目标目录。

git clone https://github.com/bentoml/IF-multi-GPUs-demo.git
cd IF-multi-GPUs-demo

在构建应用程序之前,让我们简要了解一下此目录中的关键文件:

  • import_models.py:定义 IFPipeline 各阶段的模型。您可以使用此文件将所有模型下载到本地机器,以便将它们打包成一个 Bento。
  • requirements.txt:定义本项目所需的所有包和依赖项。
  • service.py:定义了一个 BentoML 服务,其中包含使用 to_runner 方法创建的三个 Runner,并公开了一个用于生成图像的 API。该 API 接收一个 JSON 对象作为输入(即提示和负面提示),并通过使用一系列模型返回一个图像作为输出。
  • start-server.py:通过 service.py 中定义的服务启动 BentoML HTTP 服务器,并创建一个 Gradio Web 界面供用户输入提示以生成图像。
  • bentofile.yaml:定义要构建的 Bento 的元数据,包括 Service、Python 包和模型。

我们建议您为依赖隔离创建一个虚拟环境。例如,运行以下命令激活 myenv

python -m venv venv
source venv/bin/activate

安装所需的依赖项

pip install -r requirements.txt

如果您以前没有使用命令行从 Hugging Face 下载过模型,则必须先登录

pip install -U huggingface_hub
huggingface-cli login

将模型下载到 BentoML 模型存储

如上所述,您需要下载 DeepFloyd IF 各阶段使用的所有模型。设置好环境后,运行以下命令将模型下载到本地模型存储中。此过程可能需要一些时间。

python import_models.py

下载完成后,查看模型存储中的模型。

$ bentoml models list

Tag                                                                 Module                Size       Creation Time
sd-upscaler:bb2ckpa3uoypynry                                        bentoml.diffusers     16.29 GiB  2023-07-06 10:15:53
if-stage2:v1.0                                                      bentoml.diffusers     13.63 GiB  2023-07-06 09:55:49
if-stage1:v1.0                                                      bentoml.diffusers     19.33 GiB  2023-07-06 09:37:59

启动 BentoML 服务

您可以使用 start-server.py 文件直接运行 BentoML HTTP 服务器,该服务器带有由 Gradio 提供支持的 Web UI。这是此应用程序的入口点。它提供了各种选项,用于自定义执行和管理不同阶段之间的 GPU 分配。您可以根据您的 GPU 设置使用不同的命令:

  • 对于显存超过 40GB 的 GPU,所有模型都在同一个 GPU 上运行。

    python start-server.py
    
  • 对于两个各有 15GB 显存的 Tesla T4,将 Stage 1 模型分配给第一个 GPU,将 Stage 2 和 Stage 3 模型分配给第二个 GPU。

    python start-server.py --stage1-gpu=0 --stage2-gpu=1 --stage3-gpu=1
    
  • 对于一个拥有 15GB 显存的 Tesla T4 和两个显存较小的额外 GPU,将 Stage 1 模型分配给 T4,Stage 2 和 Stage 3 模型分别分配给第二和第三个 GPU。

    python start-server.py --stage1-gpu=0 --stage2-gpu=1 --stage3-gpu=2
    

要查看所有可自定义选项(例如服务器端口),请运行:

python start-server.py --help

测试服务器

服务器启动后,您可以访问 Web UI:https://:7860。BentoML API 端点也可通过 https://:3000 访问。以下是一个提示和负面提示的示例。

提示

橙色和黑色,一个女人站在路灯下的头像特写,暗黑主题,弗兰克·米勒风格,电影感,超现实,氛围感,细节极其丰富,超现实主义,8k 分辨率,照片级真实感,高纹理,复杂细节

负面提示

平铺,手部绘制不佳,脚部绘制不佳,脸部绘制不佳,超出框架,变异,突变,多余肢体,多余腿,多余手臂,毁容,变形,斜视,身体超出框架,模糊,糟糕的艺术,糟糕的解剖结构,模糊,文本,水印,颗粒感

结果

Output image

构建并提供 Bento 服务

现在您已成功在本地运行 DeepFloyd IF,可以通过在项目目录中运行以下命令将其打包到 Bento 中。

$ bentoml build

Converting 'IF-stage1' to lowercase: 'if-stage1'.
Converting 'IF-stage2' to lowercase: 'if-stage2'.
Converting DeepFloyd-IF to lowercase: deepfloyd-if.
Building BentoML service "deepfloyd-if:6ufnybq3vwszgnry" from build context "/Users/xxx/Documents/github/IF-multi-GPUs-demo".
Packing model "sd-upscaler:bb2ckpa3uoypynry"
Packing model "if-stage1:v1.0"
Packing model "if-stage2:v1.0"
Locking PyPI package versions.

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

Successfully built Bento(tag="deepfloyd-if:6ufnybq3vwszgnry").

在本地 Bento 存储中查看 Bento。

$ bentoml list

Tag                               Size       Creation Time
deepfloyd-if:6ufnybq3vwszgnry     49.25 GiB  2023-07-06 11:34:52

现在 Bento 已准备好在生产环境中提供服务。

bentoml serve deepfloyd-if:6ufnybq3vwszgnry

要以更云原生的方式部署 Bento,请运行以下命令生成 Docker 镜像:

bentoml containerize deepfloyd-if:6ufnybq3vwszgnry

然后您可以在 Kubernetes 上部署模型。

接下来

BentoML 提供了一种强大而直接的方式来部署 Hugging Face 模型用于生产。凭借其对各种 ML 框架的支持和易于使用的 API,您可以立即将模型投入生产。无论您是使用 DeepFloyd IF 模型还是 Hugging Face Model Hub 上的任何其他模型,BentoML 都可以帮助您将模型变为现实。

查看以下资源,了解您可以使用 BentoML 及其生态系统工具构建什么,并继续关注 BentoML 的更多信息。

社区

注册登录 发表评论