使用 BentoML 部署 Hugging Face 模型:DeepFloyd IF 实战
Hugging Face 提供了一个 Hub 平台,让您可以轻松上传、分享和部署模型。它为开发人员节省了从头训练模型所需的时间和计算资源。然而,在实际生产环境或云原生方式中部署模型仍然可能带来挑战。
这就是 BentoML 的用武之地。BentoML 是一个用于机器学习模型服务和部署的开源平台。它是一个统一的框架,用于构建、交付和扩展生产就绪的 AI 应用程序,包括传统模型、预训练模型、生成模型以及大型语言模型。以下是从高层次角度使用 BentoML 框架的方式:
- 定义模型:在使用 BentoML 之前,您需要一个机器学习模型(或多个模型)。这个模型可以使用 TensorFlow 和 PyTorch 等机器学习库进行训练。
- 保存模型:训练好模型后,将其保存到 BentoML 本地模型存储中,该存储用于本地管理所有训练好的模型并访问它们进行服务。
- 创建 BentoML 服务:您创建一个
service.py
文件来封装模型并定义服务逻辑。它指定了用于模型大规模推理的 Runner,并公开了 API 来定义如何处理输入和输出。 - 构建 Bento:通过创建一个 YAML 配置文件,您可以将所有模型和 Service 打包成一个 Bento,这是一个可部署的artifact,包含所有代码和依赖项。
- 部署 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 分辨率,照片级真实感,高纹理,复杂细节
负面提示
平铺,手部绘制不佳,脚部绘制不佳,脸部绘制不佳,超出框架,变异,突变,多余肢体,多余腿,多余手臂,毁容,变形,斜视,身体超出框架,模糊,糟糕的艺术,糟糕的解剖结构,模糊,文本,水印,颗粒感
结果
构建并提供 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 的更多信息。
- OpenLLM - 一个用于在生产环境中操作大型语言模型(LLM)的开放平台。
- StableDiffusion - 使用任何扩散模型创建您自己的文本到图像服务。
- Transformer NLP 服务 - 用于 Transformer NLP 模型的在线推理 API。
- 加入 Slack 上的 BentoML 社区。
- 在 Twitter 和 LinkedIn 上关注我们。