亚马逊AWS官方博客
ComfyUI 集成 Stable Diffusion 3 在亚马逊云科技的典型使用场景介绍
1. 概述
Stable Diffusion 3(简称 SD3)是一个先进的图像生成模型,由 Stability AI 于 2024 年 6 月发布。SD3 能够理解复杂的自然语言提示,包括空间推理、构图元素、姿势动作和风格描述等。SD3 背后的训练数据集包括大量的图像-文本对,使其能够处理多种语言的文本描述,并生成与之匹配的视觉作品。随着大模型技术的发展,越来越多的前端框架随之发展壮大,提高了大模型的易用性。SD3 官方推荐使用 ComfyUI 作为其前端 UI。该前端专为 SD 模型适配,通过拖拉拽的方式实现工作流,通过可视化的方式呈现文生图工作流的各个细节。本文提供三种基于 ComfyUI SD3 的部署方案以应对不同场景的挑战。方案适用于包括中国区在内的所有亚马逊云科技的区域,最终部署后的环境如下图所示。
本文将 SD3 在 AWS 的主要使用方式做了总结,并针对性的提出其适用场景。以下是三种方式的概要描述:
- 通过 Amazon Deep learning AMI 部署在 EC2,步骤最简单,针对个人尝鲜,体验试用最为合适。
- 通过容器镜像部署在 EC2 主机,对于大规模并发调度,面向生产的企业级基于 K8S 的基础架构应用较为友好,有一定上手门槛。
- 通过客制化容器部署在 SageMaker 的终端节点。对模型持续演进,MLOPS 有严格要求的场景较为适用。同时 SageMaker 兼具高弹性,高可用,低运维,多种推理方式的优点,从容应对面向生产的工作负荷。但具有一定学习曲线。
接下来,我们以亚马逊云科技中国区 2024 年 6 月推出的 G5 机型(Nvidia A10G 芯片,24G 显存)为例,以递进式的分三个章节详细介绍以上三种部署方式,并在每个章节结束处总结其适用场景以及延展方案推荐。
2. 基于 Amazon Web Services Deep learning AMI(DLAMI)的 SD3 ComfyUI 部署
DLAMI 是您在云端进行深度学习的一站式商店。这里的自定义机器学习镜像适用于大多数 Amazon EC2 区域,适用于各种实例类型,从仅限 CPU 的小型实例到最新的高性能多 GPU 实例。它预配置了 NVIDIA CUDA 和 NVIDIA cuDNN,以及最流行的深度学习框架的最新版本。可以大大减少您在配置机器学习环境时的基础工作。以下是具体步骤:
1. 选择一个区域,打开 EC2 的创建实例页面,并为该实例起名
2. 选择您期望部署 ComfyUI SD3 的区域以及 AMI
以亚马逊云科技北京区为例,请在 EC2 的启动选项页中,选择如下图所示的 Deep learning AMI,目前 SD3 所兼容的机器学习框架为 PyTorch 2.3。
3. 在 Instance type 中选择 G5.xlarge,如下图所示
4. 配置,或选择一个您的 SSH 密钥对作为登录该 EC2 的安全凭证
5. 选择一个 VPC 网络环境,并配置好可达的安全组策略
6. 配置一个不低于 100GB 的存储
7. 保持其他选项默认设置,校验主要配置信息后点击“Launch instance”
8. 用您熟悉的 SSH 客户端链接此实例,并克隆 ComfyUI 的官方代码库,命令如下
9. 安装 ComfyUI 所依赖的库,命令行如下
10. SD3 模型配置
将 SD3 模型文件放入 /path/to/ComfyUI-master/models/checkpoints/
您可以从 Huggingface https://huggingface.co/stabilityai/stable-diffusion-3-medium/tree/main ,或者 HF-mirror https://hf-mirror.com/stabilityai/stable-diffusion-3-medium/tree/main 下载开源 SD3 的模型权重文件。本文以 sd3_medium_incl_clips.safetensors 为例。
VAE 模型配置:将 VAE 模型文件放入/path/to/ComfyUI-master/models/vae/
您可以从 Huggingface https://huggingface.co/runwayml/stable-diffusion-v1-5/blob/main/vae/diffusion_PyTorch_model.safetensors 下载开源 VAE 的模型权重文件。本文以 diffusion_PyTorch_model.safetensors 为例。
11. 启动 ComfyUI,命令如下
命令执行完后,如下截图
12. 通过端口映射将您的本地端口映射到 EC2
13. 通过本地浏览器导航到 http://localhost:8188/ 将出现本文第一张截图
14. 在 CLIP Text Encoder(Prompt)修改提示词,并点击 Queue Prompt
此时默认的工作流会被触发,可以通过每个模块看到一个完整的工作流的构成,每一个模块也有各自的进度条显示其状态。每一个文生图的请求内部是通过队列管理的。
15. 观察 EC2 后端日志:发现第一次推理所需时间较长,通过观察显存变化以及日志信息可以大致分析出,第一次推理时间主要花在了模型权重文件加载到显存上,之后同样分辨率的推理请求基本可以在 2 秒内完成。
本节小结:基于亚马逊云科技 Deep learning AMI 的 EC2 利用 ComfyUI 集成 SD3 的推理方案非常适用于模型的前期调研。该方案具有快速构建,门槛低的特点。如果需要批量部署该环境可以通过代码及基础设施的 CloudFormation 模板构建,更多信息请参考附录的参考链接[1]。
3. 基于 Amazon Deep learning containers(DLC)的 SD3 ComfyUI 部署
AWS Deep Learning Containers 是 Docker 映像,其已预先安装并使用最新版本的热门深度学习框架进行了测试。Deep Learning Containers 让您能够快速部署自定义机器学习环境,而无需从头构建并优化环境。本节将通过亚马逊云科技发布的镜像库将上节 ComflyUI 以及各个模型文件打包到容器镜像中,通过亚马逊云科技 Deep learning AMI 的 EC2 拉起 DLC 容器镜像,进行文生图。以下是具体步骤。
1. 重复上节 1-7 步完成 Deep learning AMI EC2 构建,并 SSH 到该实例
2. 将该实例关联一个角色,确保该角色可以访问 ECR 服务
3. 在该 EC2 上登录亚马逊云科技中国区公开 ECR 账号,以下以北京区为例
以下为成功 login 后的状态
4. 创建名为“sd3-comflyui-docker”的 docker 文件,并复制如下 docker 代码
以上 docker 文件将亚马逊云科技提供的 PyTorch2.3 GPU 推理容器作为 base docker image,在其之上构建 ComfyUI ,并将上一节第 10 步获取的 SD3,以及 VAE 模型权重文件配置到指定目录,最终将容器的入口程序设置为 main.py。注意亚马逊云科技针对每个区域提供不同的 base container image 地址,详细列表请参考如下链接,示例代码以北京区域为例:https://docs.thinkwithwp.com/zh_cn/sagemaker/latest/dg-ecr-paths/ecr-cn-north-1.html 。
5. 在“sd3-comflyui-docker”目录构建容器镜像,如下命令
其执行情况根据实际网络情况而定,如下图所示
查看刚刚构建的容器镜像
6. 拉起容器镜像,并将本地 GPU 资源带入至容器
执行以下命令,拉起容器:
命令执行后,如下图所示
7. 效仿第二节 12 步,做本地端口映射。而后用浏览器导航到 http://localhost:8080/ 将出现篇首的 ComflyUI 界面
本节小结:基于亚马逊云科技的 DLC 方式完成 SD3 推理的方案非常适用于面向大规模并发同时伴有高峰低谷的文生图业务场景。配合 KEDA,Karpenter 在 EKS 的调度,可以进一步优化成本,兼具弹性,更多关于该方案的完备介绍请参考【2】。
4. 基于 Amazon Deep learning container(DLC)的 SD3 ComfyUI 在 SageMaker 的部署
SageMaker 是亚马逊云科技的机器学习云平台,提供了从数据处理,模型训练到面向生产环境部署等一系列机面向机器学习工作负载的综合解决方案。通过以上两节的介绍,我们已经可以在 Deep learning AMI 上的 EC2,基于 Deep learning Container 的容器进行 SD3 的部署。在 DLC 的基础上,SageMaker 可以进一步对客制化的容器提供托管服务。本节的重点是通过一个可视化的集成环境 Jupyter 来完成客制化容器的适配,并发布到 SageMaker,完成 SageMaker 的终端节点部署并接受 API 的推理请求。SageMaker 提供托管的 Jupyter 环境,您可以很容易地在 SageMaker Jupyter notebook instance 中完成开发环境的搭建。接下来本文将按开发者的开发习惯,通过在 Deep learning AMI 的 EC2 上安装 Jupyter Lab 完成以上目标,具体配置步骤如下。
1. 完成第二节 1-7 步,完成 Deep learning AMI EC2 构建,并 SSH 到该实例
2. 用如下命令安装 Jupyter lab
3. 启动 Jupyter Lab
4. 仿照第二节 12 步,将本地接口映射到 8888,打开浏览器导航到上图中 Jupyter lab 给出的 URL 地址
5. 将 Jupyter notebook Repo 克隆到本地,如下命令
6. 通过 Jupyter 的文件上传功能将第二节第 10 步获得的两个权重文件导入到您的工作空间,如下图所示
7. 逐个运行每个代码块,请留意 Deploy 代码大约执行 10 分钟
终端节点部署过程中 SageMaker 会拉起 ComflyUI 的客制化容器,并完成 8080 端口的“/ping”健康检查。ComfyUI 适配 SageMaker 需要做一定的代码适配,如容器开放端口,对 SageMaker 的请求添加 endpoint 路由等,更多的细节请参考本博客对应的 Github repo:https://github.com/Codinghub-ZhuYu/ComfyUI-BYOC-on-SageMaker.git。
当健康检查完成后您在控制台将看到如下创建成功信息
8. 观察 AWS SageMaker 控制台终端节点选项页的变化如下
导航到 Inference -> Endpoints->Settings
9. 您可以进一步在终端节点的概述页中查看容器的启动日志
可以看到熟悉的 log 在 CloudWatch 日志中打印出来
10. 执行文生图推理代码 “prediction = predictor.predict(inputs)”
通过观察 CloudWatch 可以看到 SageMaker 将 post 请求发送给了自定义容器,并在 5 秒内完成了推理。
11. 通过先前配置的 S3 out 路径获取最终结果
本节小结:通过基于 DLC 的自定义容器可以深度集成 SageMaker,完成面向生产的推理任务。同时可以借助 SageMaker 的多种推理方案根据不同场景做。如对 payload 要求过大的高清大图适配异步推理[3],对于无需 API 支持的大批量推理应用批量推理[4]。对于有 MLOps 无中断升级需求的用户可以借助 Production Variant 完成蓝绿部署[5],以及通过 SageMaker 的 Autoscaling 功能完成弹性扩缩[6],进一步提高系统弹性应对业务的挑战。
5. 总结
以上三种方案基本涵盖了利用 ComfyUI 集成 SD3 做文生图的主要场景。方案一最为基础,门槛最低,方案二,通过 DLC 可以进一步延展到面向高并发基于 EKS 的综合调度场景,方案三通过与 SageMaker 的结合,可以兼顾 MLOps 做到无缝升级,也可以用到更多高阶的推理功能。
参考链接:
[1] https://thinkwithwp.com/cn/getting-started/hands-on/stable-diffusion-deployment/
[2] https://aws-samples.github.io/stable-diffusion-on-eks/en/
[4] https://docs.thinkwithwp.com/zh_cn/sagemaker/latest/dg/batch-transform.html