阅读我们的文章

class="lazyload

.

本文提供了一份指南Cloud Vertex AI 在 GoogleCloud 上部署广受欢迎的图像生成模型 Stable Diffusion。本指南涵盖了环境配置和权重下载、Cloud TorchServe 进行部署、在 Vertex 端点上部署 TorchServe 服务器,以及将图像历史记录自动保存到 GCS。

引言

Stable Diffusion 是一种图像生成模型。它于 2022 年开源,并因其能够根据文本描述生成高质量图像而广受欢迎。与其他图像生成模型(如 Dall-E)一样,Stable Diffusion 利用机器学习技术,根据给定的输入生成图像。

酩悦轩尼诗(Moët Hennessy)是奢侈品集团LVMH旗下的葡萄酒与烈酒部门,旗下拥有包括酩悦香槟(Moët & Chandon)、轩尼诗(Hennessy)和凯歌香槟(Veuve Clicquot)在内的26多个标志性品牌。酩悦轩尼诗曾与 Artefact 合作,探索尖端技术在营销内容生成中的潜在应用。团队将隐私与安全置于首位,决定在谷歌Cloud (GCP)上部署Stable Diffusion,使酩悦轩尼诗能够在自有基础设施内对模型进行微调并运行,从而提供从模型微调到API开放的无缝体验。

在开始之前,请注意:本文假设您已具备 GoogleCloud (GCP)的相关知识,特别是对 Vertex AI 的了解。这包括模型注册表和 Vertex 端点等概念。此外,您还需要具备 Docker 的使用经验,以便完成部分操作步骤。如果您对这些概念不熟悉,建议您先了解相关内容后再继续。
此外,要下载 Stable Diffusion 权重,您需要拥有一个 Hugging Face 账户。如果您还没有,可以在Hugging Face 官网上轻松注册一个。
言归正传,让我们开始吧!

设置和权重下载

建议克隆我准备好的GitHub 仓库,以便按照文章中的步骤操作。

创建一个虚拟环境来安装软件包总是很重要的。就我个人而言,我会使用 Anaconda 并安装包含所有依赖项的 requirements.txt 文件:

conda create -n stable_diffusion — no-default-packages python=3.8 -y
conda activate stable_diffusion
pip install -r src/requirements.txt

现在您可以下载 Stable Diffusion 的权重了,本文将使用Stable Diffusion 1.5 版本。您需要在模型页面上接受许可协议,否则在下载模型权重时会出现错误。
前往您的账户 → 设置 → 访问令牌 → 新建令牌(读取权限)

前往您的账户 → 设置 → 访问令牌 → 新建令牌(读取权限)

您可以将令牌作为环境变量添加。我个人建议使用 .env 文件,并通过python-dotenv 库加载该环境变量。
您需要导航至 `src/stable_diffusion` 目录并运行:

python download_model.py

这将下载其中的权重

`src/stable_diffusion/external_files/model_weights`。

Torchserve 框架

Torchserve是一个用于托管 PyTorch 模型的框架。它支持在生产环境中部署 PyTorch 模型,并提供模型版本控制和多模型托管等功能。该框架设计简洁易用,让您能够专注于模型的构建和部署,而无需担心基础设施问题。

1. 创建一个符合 TorchServe 格式的处理程序

自定义处理程序是一个 Python 类,用于定义如何预处理输入数据、如何运行模型以及如何对输出进行后处理。要为您的模型创建自定义处理程序,您需要创建一个遵循 TorchServe 格式的 Python 类。
TorchServe 仓库中已提供了一个适用于 Stable Diffusion 的自定义处理程序。但 Vertex 端点对请求格式有特定要求,因此我们需要调整处理程序的 preprocess() 方法以适应 Vertex 格式。您可以使用本文 GitHub 仓库中提供的名为 `stable_diffusion_handler.py` 的修改版处理程序。

2. 创建 .mar 文件

创建自定义处理程序后,您需要使用 model-archiver 工具将其与所有依赖项以及模型本身打包成一个 .mar 文件。model-archiver 是一个命令行工具,可用于将模型、处理程序和依赖项打包成一个文件。

这将生成一个名为 output.mar 的 .mar 文件,其中包含您的模型、处理程序和依赖项。

您可能需要根据文件在您计算机上的位置来修改路径:

torch-model-archiver
–model-name stable-diffusion
–version 1.0
–handler stable_diffusion/stable_diffusion_handler.py
–export-path stable_diffusion/model-store
–extra-files stable_diffusion/external_files

3. 运行 TorchServe 服务器

创建 .mar 文件后,您可以使用 torchserve 命令启动 TorchServe 服务器。为此,您需要运行以下命令:

torchserve
— start
— ts-config=config.properties
— models=stable-diffusion.mar
— model-store=stable_diffusion/model-store

通过 config.properties 文件,您可以指定 TorchServe 服务器的配置,例如推理端口、健康检查、工作节点数量等
警告:所有脚本必须在文件所在的目录下运行,以避免路径错误。

在本地运行 TorchServe 服务器

在开始将部署环境容器化之前,务必先在本地测试代码。我已经准备了一个 Bash 脚本,它将生成 .mar 文件并启动 TorchServe 服务器。

你可以通过以下方式运行它:


bash serve_locally.sh

您需要等待几分钟,以便服务器完成初始化且工作进程加载模型;若看到以下日志,即可开始运行推理:

2023–01–05T15:34:52,842 [DEBUG] W-9000-stable-diffusion_1.0
org.pytorch.serve.wlm.WorkerThread— W-9000-stable-diffusion_1.0
状态变化 WORKER_STARTED -> WORKER_MODEL_LOADED

然后,您可以使用以下代码向模型发送推理请求:

import requests
prompt = “一张宇航员在火星上骑马的照片”
URL = “http://localhost:7080/predictions/stable-diffusion”
response = requests.post(URL, data=prompt)

您可以通过查看服务器日志来确认服务器是否已收到您的请求:

2023–01–05T15:35:43,765 [INFO ] W-9000-stable-diffusion_1.0-stdout
MODEL_LOG — 后端在 1672929343 处接收到推理请求

Stable Diffusion 需要 GPU 才能流畅运行,因此目前您将无法获得任何输出结果。您可以使用 `torchserve –stop` 命令停止 torchserve 服务器。

将 torchserve 容器化

您的 TorchServe 服务器目前在本地运行,若要在 Vertex AI 上部署 Stable Diffusion,您需要将其容器化。这意味着需要创建一个 Docker 镜像,其中包含模型、自定义处理程序以及所有必要的依赖项。这实际上就是我们将上述所有步骤封装到 Dockerfile 中的过程。
幸运的是,这里已经准备好了一个可直接使用的DockerfileDockerfile

在本地运行容器以检查其是否正常工作非常重要。我将在本地构建它,但你也可以使用cloud 进行构建,然后将其拉取到你的机器上。

在本地构建镜像(需要运行 Docker 守护进程):

build -t serve_sd .

镜像构建将耗时 20 到 30 分钟,构建阶段耗时较长,是因为在由 model-archiver 打包之前,需要将模型的权重复制到镜像内部。

您可以使用以下命令运行一个 Docker 容器,并在 7080 端口上监听:

docker run -p 7080:7080 serve_sd

要检查一切是否正常运行,您可以等待 worker 加载完模型后,运行与之前相同的推理代码,因为我们使用的是相同的 7080 端口。

在 Vertex AI 上部署

既然 Dockerfile 已经准备就绪且运行正常,我们需要:

  • 使用Cloud 在 Google 容器注册表 (GCR) 中构建镜像
  • 将我们自定义模型的图像上传至 Vertex AI 模型注册表

  • 创建 Vertex AI 端点
  • 将模型连接到端点

这正是deploy.shBash 脚本将要执行的操作,你可以通过以下命令运行它:

bash deploy.sh

在网络速度良好的情况下,部署过程大约需要 1 小时:

  • 将 8 GB 的模型权重发送至Cloud 可能需要几分钟到几小时不等,具体取决于您的网络速度
  • 构建镜像大约需要20分钟

  • 上传模型大约需要5分钟

  • 创建该端点大约需要 5 分钟

  • 将模型安装到端点上大约需要30到40分钟

模型成功绑定到端点后,您可以使用以下代码查询该端点:

from google.cloud aiplatform as aip

PROJECT_NAME = ""
REGION = ""
ENDPOINT_ID = ""
aip.init(project=PROJECT_NAME, location=REGION)
endpoint = aip.Endpoint(endpoint_name=ENDPOINT_ID)
text_input = """一瓶陈年且独家的干邑白兰地
矗立在光可鉴人的台面上,位于一间充满活力的酒吧前,
超高清细节,4K,虚化效果"""

def query_endpoint(endpoint, text_input):
payload =
response = endpoint.predict(instances=[payload])
return response

image = query_endpoint(endpoint, text_input)
class="lazyload

一瓶陈年珍藏干邑静静矗立在光可鉴人的台面上,背景是色彩明艳的酒吧,画面细节极其丰富,4K分辨率,虚化效果——Stable Diffusion 1.5

在 T4 GPU 上,推理过程大约需要 10 到 15 秒。您可以通过选择性能更强的 GPU 来提升速度,具体操作是修改deploy.sh 文件中的 ACCELERATOR_TYPE 变量。

可选:如果图像大小超出端点的处理能力,或者您希望保存图像历史记录。

您可能希望记录图像的历史记录,或者您遇到了因端点响应大小限制为 1.5 MB 而导致的错误。在这种情况下,建议使用处理程序的后处理方法,将图像保存到 GCS 中,并仅返回该图像的 GCS 路径。

幸运的是,我已经准备了一个专门用于此目的的处理程序,只需将 stable_diffusion_handler.py 切换为stable_diffusion_handler_gcs.py即可解决问题。

警告:在使用新处理程序进行部署之前,您需要:

  • 创建一个用于存储图片的 GCS 存储桶

  • 在 src/stable_diffusion/external_files/config.py 文件中编辑新 GCS 存储桶和文件夹的名称

  • 在 deploy.sh 文件中更改端点所使用的服务账户。您需要一个具有 GCS OWNER 权限的服务账户。

结论

本文提供了一份全面指南,介绍如何使用 Vertex AI 在 GoogleCloud 上部署 Stable Diffusion 模型。

该指南涵盖了以下关键步骤:

  • 使用 TorchServe 进行部署
  • 为 Stable Diffusion 创建和修改自定义处理程序
  • 使用 Vertex 模型注册表和 Vertex Endpoints 部署模型

需要注意的是,虽然 Vertex 端点是一个有效的解决方案,但它不支持将实例数量缩减至 0,这可能会导致成本增加,因为 GPU 仍处于运行状态。

此外,随着 Stable Diffusion 模型的部署工作已完成,我们目前正在探索更多可能性,例如针对特定的酩悦轩尼诗产品对模型进行微调,以进一步提升模型的能力。

class="lazyload

Artefact 的 Medium 博客。

本文最初发表于Medium.com
欢迎关注我们的Medium博客!