刘远,腾讯云泛互联网首席解决方案架构师。
技术背景
Stable Diffusion 是一种深度学习的文本到图像模型,由 Runway 和慕尼黑大学合作构建,第一个版本于 2021 年发布。目前主流版本包含 v1.5、v2和v2.1。它主要用于生成基于文本描述的详细图像,也应用于其他任务,如修复图像、生成受文本提示引导的图像到图像的转换等。
应用场景
AI 绘图在各个行业领域会起到革命性的作用,目前多数是加快现有工作的效率和质量。以下是几个典型的应用场景:
1. 插画:无论是游戏 CG 还是概念插画,使用 AI 绘图都能起到很好的效果。一般来说,在商用环境下不会直接使用结果上线,而是在这个基础上使用PS等软件进行修改,或以此作为灵感重绘。
2. 游戏 UI:过去游戏界面的绘制,一般需要对单个物品(如宝箱、装备、武器)进行多个版本的绘制。使用 AI 绘图大量生产图片或图标,然后进行修改或者临摹,在缩短出图时间的同时,减少出图成本。
3. 平面包装:平面包装是一个依赖抽象图形的领域方向,整体上对图片精确率要求不高,只需要模糊的方向和概念,并且接受随机生成的样式结果。这一特性刚好符合AI绘图的特性,通过外部轮廓设定后,使用AI对内容图案进行绘制。
4. 服装设计及模特拍摄:在服装设计领域,很多时候都依赖一些抽象的灵感和思路,采用AI出图后,服装设计师可以根据图片进行灵感设计,根据服装材料、流行程度和季节,针对图片进行重新调整。另外,拍摄模特图片非常耗费时间和成本,采用AI方式进行试穿,也是 AI 绘图的发展方向。
5. 建筑效果图:利用 ControlNet 的能力,建筑领域也开始尝试使用AI绘图进行效果图生成,为建筑设计师提供灵感,未来结合3D模型生成,所写即所得,提高建筑设计师和客户的沟通效率。
行业客户普遍基于上述场景做AI绘图业务尝试:Stable Diffusion 预训练模型,加上各种微调插件,如 LoRA 进行风格定制,ControlNet 控制图像,能有效输出符合业务场景定义的图片素材。
部署 Stable Diffusion
部署架构图
本文介绍如何使用容器服务 TKE 和文件存储 CFS 在腾讯云上的轻松部署 Stable Diffusion , 以及如何使用云原生网关、qGPU、TACO 和 COS 在云原生推理场景下进行能力扩展。
搭建步骤
准备需使用 Stable Diffusion 容器镜像
_腾讯云容器镜像服务(Tencent Container Registry,TCR)_是腾讯云提供的容器镜像云端托管服务,支持 Docker 镜像、Helm Chart 存储分发及镜像安全扫描,为企业级客户提供了细颗粒度的访问权限管理和网络访问控制。
TCR 支持上千节点并发拉取 GB 级大镜像,配合镜像加速能力,实现极速分发。
1. 从 GitHub 下载 Stable Diffusion web UI 代码,制作 Docker 镜像。
(https://github.com/AUTOMATIC1111/stable-diffusion-webui)
- 将准备好的 Stable Diffusion 容器镜像上传到容器镜像仓库 TCR,参考:TCR企业版指南。
(https://cloud.tencent.com/document/product/1141/39287)
- 如果对仓库权限有细粒度控制要求,比如模型文件打包在镜像内的使用场景,推荐使用 CAM 对命名空间或仓库进行访问控制,参考:容器镜像服务权限管理。
(https://cloud.tencent.com/document/product/1141/41417)
- 模型文件加上推理服务,镜像体积可能达到几十 GB,企业版容器仓库支持按需加载,提升应用分发效率,参考:按需加载容器镜像。
(https://cloud.tencent.com/document/product/1141/53928)
准备待部署 Stable Diffusion 的 TKE 集群
腾讯云容器服务 TKE 基于原生 Kubernetes 提供以容器为核心的解决方案,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。通过 TKE 的弹性、混部、轻运维等特性助力 AIGC 业务提升资源利用率、降低成本。
- 开通并创建 TKE 集群,流程参考 创建容器服务集群。Kubernetes 版本选择最新的1.26.1,容器网络插件选择【Global Router】,其他选项默认即可。
(https://cloud.tencent.com/document/product/457/32189)
- 集群选择托管类型,Worker节点选择【GPU计算型PNV4】- A10,安装 GPU470 驱动,CUDA 版本11.4.3,cuDNN 版本 8.2.4。
- 根据部署对 GPU 共享的需求,可选择开启 qGPU,本文第四部分会介绍 TKE+qGPU 的使用。
通过 TKE+CFS 快速部署 Stable Diffusion Web UI
_腾讯云文件存储(Cloud File Storage,CFS)_提供了标准的 NFS 文件系统访问协议,为多个 CVM 实例提供共享的数据源,支持弹性容量和性能的扩展,现有应用无需修改即可挂载使用,是一种高可用、高可靠的分布式文件系统。
CFS 扩容过程中不中断请求和应用,可确保整体业务连续性;采用三副本的分布式存储机制、具有极高的可靠性;提供低延迟访问,支持数千客户端的同时访问。
1. 创建存放模型的文件存储 CFS
1.1. 选择与集群相同的 VPC 和子网,开通 CFS 服务。在 CFS 远程挂载点,新建 /models/Stable-diffusion 目录。挂载点和文件操作,参考 创建文件系统及挂载点。
(https://cloud.tencent.com/document/product/582/9132)
1.2. 下载 v1-5-pruned-emaonly.safetensors 模型文件至/models/Stable-diffusion,地址见:runwayml/stable-diffusion-v1-5。
(https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main)
1.3. 如需更大的带宽和读写 IOPS,建议选择 CFS Turbo,容器环境使用参考
在 TKE 上使用CFS Turbo。
(https://cloud.tencent.com/document/product/582/56768)
2. 创建静态 PV&PVC
2.1. 在 TKE 控制台上,创建 CFS 类型 StorageClass,选择共享实例。
2.2. 使用CFS里新建的/models/Stable-diffusion目录,以及上面的StorageClass,静态创建 PV&PVC。
2.3. 如果有其他模型目录挂载需求,同样在 CFS 挂载点中新建子目录,并进行 PV&PVC 静态创建。Stable DiffusionWeb UI 服务 models 子目录结构,如下所示:
3. 创建 Stable Diffusion Web UI 工作负载
3.1. 在TKE控制台上,选择【工作负载】-【Deployment】-【新建】,部署 stable-diffusion-webui 镜像。
3.2. 在部署页面里,【数据卷】选择【添加数据卷】。【使用已有PVC】方式,添加前面创建的 PVC:
3.3. 【实例内容器】-【镜像】部分,选择已保存在 TCR 里的 stable-diffusion-webui 镜像。
3.4. 将新建的【数据卷】,进行【挂载点】配置。挂载点与 CFS 远程目录对应关系如表格所示:
PVC | 容器挂载点 | 对应的CFS目录 |
---|---|---|
sd-model-pvc | /root/stable-diffusion-webui/models/Stable-diffusion | /models/Stable-diffusion |
3.5. 展开【显示高级设置】,添加运行参数 --listen,将 stable-diffusion-webui 进程监听在0.0.0.0上。更多参数选项参考 Command Line Arguments and Settings
(https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Command-Line-Arguments-and-Settings)
3.6. 将 GPU 资源的卡数设置为 1,如果开启了 qGPU,这里还可以填写0.1-1之间的数值,对 GPU 卡进行虚拟化切分。
3.7. 创建 Deployment 对应的 Service,选择【公网LB访问】,对外暴露7860端口访问。
3.8. 通过 CLB 公网 IP 地址,成功访问 Stable Diffusion Web UI 服务。如果有限流或访问控制需求,推荐选择云原生网关充当 Ingress Controller,本文第五部分会介绍云原生网关的使用。
【进阶】Stable Diffusion 使用 qGPU
qGPU 是腾讯云推出的 GPU 容器虚拟化产品,支持多个容器共享 GPU 卡并支持容器间算力和显存精细隔离,同时提供业界唯一的在离线混部能力,在精细切分 GPU 资源的基础上,在最大程度保证业务稳定的前提下,提高 GPU 使用率,帮助客户大幅度节约 GPU 资源成本。
Stable Diffusion Web UI 服务以串行方式处理请求,如果希望增加推理服务并发性能,可以考虑扩展Deployment的Pod数量,以轮询的方式响应请求。这里我们采用TKE qGPU能力,将多个实例 Pod 运行在同一张 A10 卡上,在保障业务稳定性的前提下,切分显卡资源,降低部署成本。
采用 qGPU 方式,需要先将 Pod 的资源申请方式进行修改。如果计划单卡上部署2个 Pod,在 YAML 中将 tke.cloud.tencent.com/qgpu-core 从100更改为50,也就是50%的算力分配,同时将 tke.cloud.tencent.com/qgpu-memory 的数值设置为 A10 显存的一半。
resources:
limits:
cpu: "20"
memory: 50Gi
tke.cloud.tencent.com/qgpu-core: "50"
tke.cloud.tencent.com/qgpu-memory: "10"
Deployment YAML更新完成后,调整 Pod 数量为2个,即可实现负载均衡的 Stable Diffusion 轮询模式。
注意,在 tke.cloud.tencent.com/qgpu-core 为100的整倍数时,可以不写 qgpu-memory,默认分配整卡显存。
当 tke.cloud.tencent.com/qgpu-core小于100时,也就是按比例切分GPU资源时,必须显示指定tke.cloud.tencent.com/qgpu-memory。qGPU 参考:容器服务使用 qGPU。
(https://cloud.tencent.com/document/product/457/65734)
【进阶】通过云原生 API 网关对外提供 Stable Diffusion 服务
_腾讯云云原生 API 网关(Cloud Native API Gateway)_是腾讯云基于开源微服务网关推出的一款高性能高可用的云上网关托管产品,减少用户自建网关的开发及运维成本。作为云上微服务架构的流量入口,集成请求分发、API 管理、流量监控、访问限制等功能,是微服务架构中的重要组件。
网关提供与腾讯云环境、腾讯云产品的标准化对接方式;提供多种腾讯云开发的特色网关插件,如限流、熔断、流量镜像等;网关实例与配置数据库,均以多可用区方式部署,保证业务连续性。
- 开通云原生网关,选择和 TKE 集群、CFS 同 VPC 的实例,参考 微服务引擎 TSE 新建网关。
(https://cloud.tencent.com/document/product/1364/72495)
- 在网关控制台上,选择【路由管理】-【服务来源】,绑定TKE集群。
3. 选择【路由管理】-【服务】,新建网关服务。在【服务列表】中,选择部署Deployment 时启用的 Service 进行映射。云原生网关会自动拉取 TKE Service 关联的Pod IP,当 Pod IP 变化时,动态更新网关服务里的 Upstream配置项,参考 微服务引擎 TSE 创建 TKE 服务的路由。
(https://cloud.tencent.com/document/product/1364/83138)
- 点击服务名,新建访问路由。将请求方法设置为【ANY】,Host 填写云原生网关的公网 IP。如果后期绑定域名使用,Host 还需要加上域名地址。
- 根据资源用量和计划访问请求数,可以选择配置网关限流策略,自定义限流响应内容,参考 微服务引擎 TSE 配置限流策略。
(https://cloud.tencent.com/document/product/1364/90030)
6. Stable Diffusion Web UI 出图时会进行多轮请求,将 Deployment 的 Pod 副本数量修改为大于1时,还需要配置 Session 会话保持,保证同一IP的客户请求落在相同的Pod里。选择【路由管理】-【Konga控制台】,找到Konga公网访问地址,在Konga控制台里找到【UPSTREAM】,点击【DETAILS】,在【HASH ON】下拉框里,选择【IP】,完成基于客户端IP的会话保持配置。
【进阶】优化 Stable Diffusion 推理性能
腾讯云计算加速套件 TACO Kit__(TencentCloud Accelerated Computing Optimization Kit)是一种异构计算加速软件服务,具备领先的 GPU 共享技术和业界唯一的 GPU 在离线混部能力,搭配腾讯自研的软硬件协同优化组件和硬件厂商特有优化方案,支持物理机、云服务器、容器等产品的计算加速、图形渲染、视频转码各个应用场景,帮助用户实现全方位全场景的降本增效。
TACO Infer 是面向推理场景无感集成的 AI 推理加速软件。集成硬件厂商的定向开源加速方案,基于自研编译优化后端,整合先进的编译优化、图优化和算子优化技术,兼容 CPU、GPU、NPU 等多种加速硬件。在 Stable Diffuison 场景中,可以实现模型的前向推理能力提升,出图由原来的约 2 秒缩短到 1 秒。
Stable Diffusion 是一个多模型组成的扩散 Pipeline,主要由三个部分组成:变分自编码器 VAE、U-Net 和文本编码器 CLIP。推理耗时主要集中在 UNet 部分,我们选择对这部分进行模型优化,加速推理速度。
- 下载 A10 GPU 优化的 stable-diffusion-v1.5 UNet 模型文件,以及 sd_v1.5_demo 镜像,该镜像里的 Web UI 修改了模型加载代码,UNet 部分会加载独立优化模型。镜像及 UNet 优化模型获取,参考 TACO Infer 部署 Stable Diffusion web UI。
(https://cloud.tencent.com/document/product/1573/89629)
2. 将 sd_v1.5_demo 镜像服务部署在 TKE 上:按前述步骤进行操作,其中替换镜像为sd_v1.5_demo ,并额外为 UNet 优化模型创建 CFS /data 目录和PV&PVC。
- 同样参数配置下,生成10张猫的图片,优化前推理耗时16.14s。加载 TACO 优化的 UNet 模型后,10张图片仅耗时11.56s,端到端性能提高30%。
- TACO 可以对 Stable Diffusion 系列模型进行优化。如果希望对其他 Stable Diffusion 微调模型进行推理优化,并部署在上述环境中,可按照以下步骤操作:
a. 参考 TACO Infer 优化 Stable Diffusion 模型,拉取预置库环境的 sd_taco:v3 镜像。
(https://cloud.tencent.com/document/product/1573/89628)
b. Stable Diffusion模型主流存储方式,分为单文件和 diffusers 目录结构两种,其中 diffusers 结构按照 Stable Diffusion 的模型结构组织,包含 unet、vae、text-encoder等。在 TACO 优化过程中,会使用这种存储方式读取,我们可以在 HuggingFace 上找到这种格式的模型文件进行下载。
c. 如果 HuggingFace 速度较慢,也可以使用官方的转换脚本,将单文件格式(ckpt或safetensors)转化成 diffusers 格式使用。脚本见 diffusers/scripts at main · huggingface/diffusers · GitHub。
(https://github.com/huggingface/diffusers/tree/main/scripts)
python convert_original_stable_diffusion_to_diffusers.py --checkpoint_path [single_file_model_name] --dump_path [diffusers_model_directory] --from_safetensors
d. 选择一台 A10 GPU CVM,使用-v命令挂载上面的 diffusers 模型目录,交互式启动容器,在容器内部对挂载好的模型进行优化。
docker run -it --gpus=all --network=host -v /[diffusers_model_directory]:/[custom_container_directory] sd_taco:v3 bash
e. 使用 diffusers 加载模型权重,从中导出 UNet 模型进行优化,运行脚本参考 TACO Infer 优化 Stable Diffusion 模型。
(https://cloud.tencent.com/document/product/1573/89628)
f. 完成后放入 CFS挂载的 /data 目录,推理时 UNet 从优化文件中加载;单文件格式模型(ckpt或safetensors)仍然放入CFS挂载的 /models/Stable-diffusion 目录,Stable Diffusion 其他部分从原始文件里加载。
g. 重启 stable-diffusion-webui 界面,选择新模型使用。
【进阶】通过 COS 内容审核能力处理 Stable Diffusion API 输出
_腾讯云对象存储(Cloud Object Storage,COS)_是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据。腾讯云 COS 使所有用户都能使用具备高扩展性、低成本、可靠和安全的数据存储服务。用户可以通过控制台、API、SDK 和工具等多样化方式简单、快速地接入 COS,实现了海量数据存储和管理。通过 COS 可以进行任意格式文件的上传、下载和管理。
腾讯云数据万象(Cloud Infinite,CI)能够实现对云上的图片、视频、音频、文档等数据的处理,为客户提供专业一体化的数据处理解决方案,涵盖图片处理、内容审核、内容识别、媒体处理、文档服务等功能,满足客户多种场景维度的需求。
Stable Diffusion Web UI 适合作为交互式工具来创作图片,如果希望基于它构建应用微服务,就需要用到 Stable Diffusion API 能力:发送带有提示和参数的 POST 请求,接收包含输出图像的响应。
- 在 TKE 集群同地域创建 COS 存储桶,新建 /images 子目录,参考 创建存储桶。
(https://cloud.tencent.com/document/product/436/13309)
还可以选择部署 GooseFS,加速数据访问的同时提供一体化存储方案,提高训练、模型、推理的数据流转效率,参考 GooseFS 使用 TKE 部署。
(https://cloud.tencent.com/document/product/1424/68301)
- 对 stable-diffusion-webui 部署的 Deployment 添加运行参数 --api 或 --nowebui,启用 Stable Diffusion API 服务。Stable Diffusion API 使用参考 API · Stable Diffusion Web UI。
(https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/API)
- 在TKE控制台上,安装COS-CSI 扩展组件。在kube命名空间里,创建读取COS桶的Secret,类型Opaque。参考 使用对象存储 COS-TKE。
(https://cloud.tencent.com/document/product/457/44232#.E6.93.8D.E4.BD.9C.E6.AD.A5.E9.AA.A4)
- 使用 COS 里新建的 /images 目录,静态创建 PV&PVC
- 创建消费者服务,挂载上述PVC。消费者服务通过POST请求 Stable Diffusion API 服务的7860端口,将BASE64编码的PNG图片保存在COS images目录中。示例代码如下,更多请求格式访问 API 服务 /docs 路径获取。
import json
import base64
import requests
url = 'x.x.x.x:7860/sdapi/v1/txt2img'
data = { 'prompt': 'cat', 'steps': 20 }
response = requests.post(url, data=json.dumps(data))
with open('cat.png', 'wb') as image_file:
image_file.write(base64.b64decode(response.json()['image'][0]))
- 使用COS基于数据万象CI封装的服务,可以对 images 目录进行内容审核,确保 Stable Diffusion API 服务产生的图片合规。如需通过 API 直接对响应图片进行审核,参考 图片审核API。
(https://cloud.tencent.com/document/product/436/63593)
-
进入保存图片的存储桶管理页面,选择【内容审核 > 审核策略】,在页面里查看已有的策略是否满足业务需求,可编辑或新建策略。
-
在左侧导航栏中,选择【内容审核 > 自动审核配置】,在【指定前缀审核】选择 images 子目录,对目录中的图片内容进行审核配置。参考 设置图片审核
(https://cloud.tencent.com/document/product/436/45433)
- 完成后,选择左侧导航栏中的【内容审核 > 审核详情】,进入详情页面。针对已审核过的图片,可以手动进行冻结或归为正常。参考 对象存储内容审核操作文档。
(https://qcloudimg.tencent-cloud.cn/raw/f88c8ab7406e31e7192ef3ccbae2f255.png)
结论
本文介绍了 Stable Diffusion 模型在互联网行业的应用场景,并展示了利用腾讯云原生产品能力,进行高可用部署的工程化实践。
在生产环境中,推理服务需要考虑并发请求下服务的可用性和扩展性,同时也需要考虑多模型文件管理的便利性,以及配合当前业务架构的灵活性;Stable Diffusion 的前向推理过程是一个比较耗时的过程,GPU 应用部署对比 CPU 应用部署成本也较高,在控制成本的前提下,如何有效地提高推理速度,也是企业需要重点考虑的因素;另外,作为在线业务,推理服务需要合理设计限流熔断,避免流量激增造成整体业务不可用。
利用腾讯云云原生能力,能够轻松满足上述需求。在此基础上,可以考虑将前端 Web 应用和后端推理服务进行解耦,提高架构吞吐能力;当业务访问具有明显潮汐现象时,还可以通过 TKE GPU HPA 的弹性能力,进一步降低资源部署成本。
看到这里,是否迫不及待想要咨询体验了呢~
后台留言“AI绘图”,腾讯云云原生技术专家与您联系~
附录
容器服务TKE:https://cloud.tencent.com/product/tke
容器镜像服务:https://cloud.tencent.com/product/tcr
文件存储CFS:https://cloud.tencent.com/product/cfs
云原生API网关:https://cloud.tencent.com/product/cngw
计算加速套件TACO Kit:https://cloud.tencent.com/product/taco
对象存储COS:https://cloud.tencent.com/product/cos