本文将向您提供一份指南,关于如何在谷歌云上以Vertex AI部署Stable Diffusion模型(一种流行的图像生成模型)。该指南包括设置和权重下载、用于部署的TorchServe、部署在Vertex端点上的TorchServe服务器以及在GCS上自动保存图像历史。
简介
Stable Diffusion是一个图像生成模型。它于2022年开源,因其能够从文本描述中生成高质量的图像而受到欢迎。像其他图像生成模型,如Dall-E,Stable Diffusion使用机器学习技术,根据给定的输入内容生成图像。
酩悦轩尼诗是奢侈品集团LVMH的葡萄酒和烈酒部门,管理着超过26个标志性品牌的组合,如酩悦香槟、轩尼诗和凯歌。酩悦轩尼诗已与 Artefact合作,研究尖端技术在营销内容生成中的潜在用途。出于对隐私和安全的关注,该团队决定探索在谷歌云平台(GCP)上部署Stable Diffusion技术,使酩悦轩尼诗能够在他们自己的基础设施内微调和运行该模型,提供从模型微调到API公开的无缝体验。
在你开始之前,需要注意的是,本文假设你对谷歌云平台(GCP),特别是Vertex AI有事先的了解。这包括模型注册表和顶点端点等概念。此外,你需要事先有Docker的经验,以遵循一些步骤。如果你不熟悉这些概念,建议你在继续进行之前先熟悉一下。
此外,为了下载Stable Diffusion的权重,你需要有一个huggingface账户,如果你还没有,你可以在 huggingface的网站上轻松创建一个。
说了这么多,让我们开始吧 !
设置和权重下载
我建议克隆我准备的github资源库,以便按照文章的步骤进行。
创建一个虚拟环境来安装软件包总是很重要的。就个人而言,我将使用anaconda,并将requirements.txt与每个依赖项一起安装。
conda activate stable_diffusion \
pip install -r src/requirements.txt
你现在可以下载Stable Diffusion模型的权重了,在本文中我们将使用Stable Diffusion模型1.5。你需要在模型页面上接受许可,否则你在下载模型权重时将出现错误。
进入你的账户→设置→access token → new token(读取权限)。

你可以把令牌作为一个环境变量加入。我个人建议使用.env文件并使用python-dotenv库加载环境变量。
你必须导航到`src/stable_diffusion`并运行。
这将下载里面的权重
Torchserve架构
Torchserve是一个用于服务PyTorch模型的框架。它允许你在生产环境中部署PyTorch模型,并提供诸如模型版本和多模型服务等功能。它被设计成易于使用,使您能够专注于构建和部署您的模型,而不是担心基础设施。
1. 创建一个尊重TorchServe格式的处理程序
自定义处理程序是一个Python类,它定义了如何对输入数据进行预处理,如何运行模型,以及如何对输出进行后处理。为了给你的模型创建一个自定义处理程序,你需要创建一个遵循TorchServe格式的Python类。
在TorchServe资源库中已经给出了一个用于稳定扩散的自定义处理程序。但是Vertex端点期望有一个特定的请求格式,所以我们需要调整处理程序的preprocess()方法以考虑Vertex格式。你可以使用本文github仓库中提供的名为`stable_diffusion_handler.py`的处理程序的修改版本。
2. 创建.mar文件
一旦你创建了你的自定义处理程序,你将需要使用model-archiver工具把它和任何依赖项以及模型本身打包成一个.mar文件。model-archiver工具是一个命令行工具,它允许你把你的模型、处理程序和依赖项打包成一个文件。
这将创建一个名为output.mar的.mar文件,其中包含你的模型、处理程序和依赖项。
你可能需要根据文件在你机器上的位置来编辑路径。
–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服务器。要做到这一点,你将需要运行以下命令。
— start \
— ts-config=config.properties \
— models=stable-diffusion.mar \
— model-store=stable_diffusion/model-store
config.properties让你指定你的TorchServe服务器的配置,如推理的端口、健康检查、工作人数等。
注意:所有的脚本都需要在文件所在的地方运行,以避免任何路径错误。
在本地运行TorchServe服务器
在开始dockerize我们的部署之前,在本地测试代码是很重要的,我已经准备了一个bash脚本,将创建.mar文件并启动TorchServe服务器。
You can run it with :
你需要等待几分钟,以便服务器初始化和工作器加载模型,如果你看到以下日志,你就可以开始运行推理。
org.pytorch.serve.wlm.WorkerThread— W-9000-stable-diffusion_1.0 \
State change WORKER_STARTED -> WORKER_MODEL_LOADED
然后你可以使用下面的代码对你的模型进行推理请求。
prompt = “a photo of an astronaut riding a horse on mars”
URL = “http://localhost:7080/predictions/stable-diffusion”
response = requests.post(URL, data=prompt)
你可以通过查看服务器日志来检查服务器是否收到你的请求。
MODEL_LOG — Backend received inference at: 1672929343
Stable Diffusion要GPU才能顺利运行,所以你暂时不会有任何输出。你可以用`torhcserve -stop`来停止torchserve服务器。
Dockerize torchserve
你的TorchServe服务器在本地工作,要在Vertex AI上部署Stable Diffusion,你需要将其dockerize。这意味着创建一个Docker镜像,其中包含模型、自定义处理器和所有必要的依赖。这只是我们在一个Docker文件中完成的所有步骤。
幸运的是,它已经准备好了,在这里就可以使用:Dockerfile。
在本地运行该容器以检查它是否正常工作是很重要的。我将在本地构建它,但你可以用云计算构建它,并把它拉到你的机器上。
在本地构建镜像(你需要运行Docker守护程序)。
镜像的建立需要20到30分钟,建立阶段很长,因为模型的权重需要在被模型-存档器打包之前复制到镜像里面。
你可以运行一个docker容器,用7080端口进行监听。
为了检查一切工作是否正常,你可以等到工作者加载完模型后,运行与之前相同的推理代码,因为我们使用的是同一个7080端口。
在Vertex AI上的部署
现在,Docker文件已经准备好并开始工作,我们需要。
这正是deploy.shbash脚本所要做的,你可以用它来运行。
在网速良好的情况下,部署需要1小时左右。
在模型成功连接到端点后,你可以用以下代码查询端点。
PROJECT_NAME = “”
REGION = “”
ENDPOINT_ID = “”
aip.init(project=PROJECT_NAME, location=REGION)
endpoint = aip.Endpoint(endpoint_name=ENDPOINT_ID)
text_input = “””A bottle of aged and exclusive cognac
stands on a reflective surface, in front of a vibrant bar,
hyper detailed, 4K, bokeh”””
def query_endpoint(endpoint, text_input):
payload = {“data”: text_input}
response = endpoint.predict(instances=[payload])
return response

一瓶陈年独家白兰地站在反光的表面上,在一个充满活力的酒吧前,超详细,4K,虚化 - 稳定扩散1.5
在T4 GPU上,推理应该需要10到15秒。你可以通过选择更好的GPU来提高速度,你可以在deploy.sh里面改变ACCELERATOR_TYPE变量。
可选:如果图像大小对端点来说太大,或者你想存储图像历史。
你可能想跟踪图像的历史记录,或者由于端点响应的大小限制为1.5MB而出现错误。在这种情况下,我建议使用处理程序的后处理方法,将图像保存在GCS内,只返回图像的GCS路径。
Luckily, I have already prepared a handler that does just this for you, switching from stable_diffusion_handler.py to stable_diffusion_handler_gcs.py should do the trick.
警示:在使用新处理程序运行部署之前,你需要注意:
结论
在这篇文章中提供了一个全面的指南,用于在谷歌云平台上使用Vertex AI部署Stable Diffusion模型。
该指南涵盖了一些基本步骤:
重要的是要记住,虽然Vertex端点可以是一个有效的解决方案,但它不支持缩减到0个实例,这可能导致成本增加,因为GPU仍然在使用。
此外,随着Stable Diffusion模型的部署完成,我们目前正在探索更多的可能性,如在特定的酩悦轩尼诗产品上对模型进行微调,以进一步提高模型的能力。

Interested in Data Consulting | Data & Digital Marketing | Digital Commerce ?
Read our monthly newsletter to get actionable advice, insights, business cases, from all our data experts around the world!