产品展示

在 AWS 上高效且灵活地部署 Stable Diffusion ComfyUI 架构博客

2026-01-27 13:34:44
7次

高效弹性部署 Stable Diffusion ComfyUI 到 AWS

作者 王锐日期 2024年5月16日相关链接 Amazon CloudFront Amazon Elastic Kubernetes Service Amazon Simple Storage Service (S3) AWS CloudFormation永久链接

关键要点

ComfyUI 是一种开源的基于节点的稳定扩散工作流程解决方案。部署解决方案使用基础设施即代码IaC方法,结合AWS Cloud Development Kit (CDK)和Amazon EKS蓝图。解决方案包括动态扩展、成本优化以及与Amazon S3和CloudFront的集成。

引言

ComfyUI 是一种开源的稳定扩散工作流解决方案,具有以下优势:

显著优化SDXL模型推理性能高度可自定义,用户可以进行精细控制工作流程便携,易于共享友好的开发者体验

由于这些优势,ComfyUI正被越来越多的艺术创作者所使用。本文将介绍如何高效和弹性地在AWS上部署ComfyUI。

解决方案概述

该解决方案的特点包括:

轻云机场特性描述基础设施即代码IaC部署采用极简运营和维护的方法,使用AWS CDK和Amazon EKS蓝图来管理托管ComfyUI的EKS集群。Karpenter的动态扩展利用Karpenter的能力,根据业务需求自定义节点扩展策略。利用Amazon Spot实例节省成本使用Amazon Spot实例降低GPU实例的成本。优化GPU实例存储使用充分利用GPU实例的实例存储,最大化模型加载和切换的性能,同时降低模型存储和传输的成本。使用Amazon S3 CSI驱动程序直接写入图像生成的图像通过S3 CSI驱动程序直接写入Amazon S3,降低存储成本。借助Amazon CloudFront加速动态请求为不同区域的艺术工作室提供更快的动态请求处理。无服务器事件触发的模型同步当模型被上传或删除到Amazon S3时,服务器无事件触发,自动同步模型目录数据。

部署流程

本解决方案的架构分为两个阶段:部署阶段和用户交互阶段。

部署阶段

模型存储在Amazon S3中:ComfyUI的模型存储在与本地ComfyUI/models目录结构相同的Amazon S3中。在Amazon EKS集群中初始化GPU节点:初始化EKS集群中的GPU节点时,将格式化本地实例存储,并使用用户数据脚本从Amazon S3同步模型到本地存储。在EKS中运行ComfyUI Pod:运行ComfyUI的Pods将节点上的实例存储目录连接至Pod内部的模型目录,方便无缝访问和加载模型。与AWS Lambda同步模型:当模型被上传或删除到Amazon S3时,AWS Lambda函数利用SSM命令将模型从S3同步到所有GPU节点的本地存储。将输出映射到Amazon S3:运行ComfyUI的Pod通过持久性卷申请PVC将ComfyUI/output目录映射到S3以进行输出。

用户交互阶段

请求路由:用户请求通过CloudFront到达Amazon EKS Pod时,Pod首先从实例存储加载模型。推理后图像存储:推理完成后,Pod将图像存储在ComfyUI/output目录,并直接通过S3 CSI驱动程序写入Amazon S3。实例存储的性能优势:得益于实例存储的性能,初始模型加载和模型切换所需的时间显著减少。

部署代码和详细说明可以在我们的GitHub样例库中找到。

图像生成

部署完成后,您可以通过浏览器直接访问ComfyUI前端,访问CloudFront的域名或Kubernetes Ingress的域名。

您还可以通过保存其工作流程为可调用的API的JSON文件与ComfyUI进行交互。

部署说明

前提条件

该解决方案假设您已经安装、部署并熟悉以下工具:

AWS CLI最新版本eksctlkubectlDockernpmAWS CDK最新版本

确保您有足够的vCPU配额用于G实例至少8 vCPU,本文使用的g52xl/g4dn2x。

下载代码,检查分支,安装rpm包,并检查环境:bashgit clone https//githubcom/awssamples/comfyuioneks /comfyuionekscd /comfyuioneks ampamp git checkout v020npm installnpm listcdk list

运行npm list以确保已安装以下包:bashnpm installnpm listcdk list

运行cdk list以确保环境已设置,您将有以下AWS CloudFormation堆栈进行部署:plaintextComfyuiClusterCloudFrontEntryLambdaModelsSyncS3OutputsStorageComfyuiEcrRepo

部署EKS集群

运行以下命令:bashcd /comfyuioneks ampamp cdk deploy ComfyuiCluster

CloudFormation将创建名为ComfyuiCluster的堆栈,以部署EKS集群所需的所有资源。此过程通常需要约20到30分钟完成。

部署成功后,CDK输出将显示一个ConfigCommand。该命令用于更新配置,启用通过kubectl访问EKS集群。

执行ConfigCommand以授权kubectl访问EKS集群。为验证kubectl是否已被授权访问EKS集群,执行以下命令:bashkubectl get svc

EKS集群的部署完成。请注意,EKS蓝图已输出KarpenterInstanceNodeRole,这是由Karpenter管理的节点的角色。记录此角色,后面将进行配置。

部署用于存储模型的Amazon S3桶,并设置AWS Lambda进行动态模型同步

运行以下命令:bashcd /comfyuioneks ampamp cdk deploy LambdaModelsSync

LambdaModelsSync堆栈主要创建以下资源:

S3桶:根据格式comfyuimodels{accountid}{region}命名,用于存储ComfyUI模型。Lambda函数,以及相关角色和事件源:Lambda函数命名为comfymodelssync,负责在将模型上传到或从S3删除时,初始化从S3桶到GPU实例本地存储的模型同步。一旦S3桶和Lambda函数部署完成,S3桶最初将是空的。执行以下命令以初始化S3桶并下载用于测试的SDXL模型。bashregion=uswest2 # 根据您当前的区域修改。cd /comfyuioneks/test/ ampamp bash inits3formodelssh region您无需等待模型下载完毕并上传到S3;确保模型在启动GPU节点之前上传到S3后,可以继续以下步骤。

部署用于存储ComfyUI生成图像的S3桶

运行以下命令:bashcd /comfyuioneks ampamp cdk deploy S3OutputsStorage

S3OutputsStorage堆栈创建一个S3桶,按照模式命名为comfyuioutputs{accountid}{region},用于存储ComfyUI生成的图像。

部署ComfyUI工作负载

ComfyUI工作负载通过Kubernetes进行部署。

构建并推送ComfyUI Docker镜像

运行以下命令,创建ComfyUI镜像的ECR仓库:bashcd /comfyuioneks ampamp cdk deploy ComfyuiEcrRepo

在Docker已成功安装的机器上运行buildandpushsh脚本:bashregion=uswest2 # 根据您当前的区域修改。cd /comfyuioneks/comfyuiimage/ ampamp bash buildandpushsh region注意

Dockerfile使用git clone和git checkout的组合来固定ComfyUI的特定版本。可根据需要进行修改。Dockerfile不安装自定义节点,可以在需要时通过RUN命令自行添加。更新ComfyUI仅需重新构建镜像并替换为新版本。

部署Karpenter以管理GPU实例的扩展

获取前一部分中的KarpenterInstanceNodeRole,运行以下命令部署Karpenter Provisioner:bashKarpenterInstanceNodeRole=ComfyuiClusterComfyuiClusterkarpenternoderole # 根据您的角色进行修改。sed i s/role KarpenterInstanceNodeRole/role KarpenterInstanceNodeRole/g comfyuioneks/manifests/Karpenter/karpenterv1beta1yamlkubectl apply f comfyuioneks/manifests/Karpenter/karpenterv1beta1yaml在前面的部分获取的KarpenterInstanceNodeRole需要额外的S3访问权限,以允许GPU节点从S3同步文件。运行以下命令:bashKarpenterInstanceNodeRole=ComfyuiClusterComfyuiClusterkarpenternoderole # 根据您的角色进行修改。aws iam attachrolepolicy policyarn arnawsiamawspolicy/AmazonS3FullAccess rolename KarpenterInstanceNodeRole

部署S3 PV和PVC以存储生成的图像

执行以下命令以部署S3 CSI的PV和PVC:bashregion=uswest2 # 根据您当前的区域修改。account=(aws sts getcalleridentity query Account output text)sed i s/region /region region/g comfyuioneks/manifests/PersistentVolume/sdoutputss3yamlsed i s/bucketName /bucketName comfyuioutputsaccountregion/g comfyuioneks/manifests/PersistentVolume/sdoutputss3yamlkubectl apply f comfyuioneks/manifests/PersistentVolume/sdoutputss3yaml

部署EKS S3 CSI驱动程序

运行以下命令,将您的AWS身份与访问管理 (IAM)主体添加到EKS集群:bashidentity=(aws sts getcalleridentity query Arn output text noclipager)if [[ identity == assumedrole ]] then rolename=(echo identity cut d/ f2) accountid=(echo identity cut d f5) identity=arnawsiamaccountidrole/rolenamefiaws eks updateclusterconfig name ComfyuiCluster accessconfig authenticationMode=APIANDCONFIGMAPaws eks createaccessentry clustername ComfyuiCluster principalarn identity type STANDARD username comfyuiuseraws eks associateaccesspolicy clustername ComfyuiCluster principalarn identity accessscope type=cluster policyarn arnawseksawsclusteraccesspolicy/AmazonEKSAdminPolicy

运行以下命令为S3 CSI驱动程序创建角色和服务账号,允许其读写S3:bashregion=uswest2 # 根据您当前的区域修改。account=(aws sts getcalleridentity query Account output text)ROLENAME=EKSS3CSIDriverRoleaccountregionPOLICYARN=arnawsiamawspolicy/AmazonS3FullAccesseksctl create iamserviceaccount name s3csidriversa namespace kubesystem cluster ComfyuiCluster attachpolicyarn POLICYARN approve rolename ROLENAME region region

运行以下命令安装 awsmountpoints3csidriver 插件:bashregion=uswest2 # 根据您当前的区域修改。account=(aws sts getcalleridentity query Account output text)eksctl create addon name awsmountpoints3csidriver version v100eksbuild1 cluster ComfyuiCluster serviceaccountrolearn arnawsiam{account}role/EKSS3CSIDriverRole{account}{region} force

部署ComfyUI Deployment和服务

运行以下命令替换Docker镜像:bashregion=uswest2 # 根据您当前的区域修改。account=(aws sts getcalleridentity query Account output text)sed i s/image /image {account}dkrecr{region}amazonawscom/comfyuiimageslatest/g comfyuioneks/manifests/ComfyUI/comfyuideploymentyaml

运行以下命令部署ComfyUI Deployment和Service:bashkubectl apply f comfyuioneks/manifests/ComfyUI

在EKS上测试ComfyUI

API测试

要通过API进行测试,请在comfyuioneks/test目录中运行以下命令:bashingressaddress=(kubectl get ingressgrep comfyuiingressawk {print 4})sed i s/SERVERADDRESS = /SERVERADDRESS = {ingressaddress}/g invokecomfyuiapipysed i s/HTTPS = /HTTPS = False/g invokecomfyuiapipysed i s/SHOWIMAGES = /SHOWIMAGES = False/g invokecomfyuiapipy/invokecomfyuiapipy

浏览器测试

运行以下命令获取K8S ingress地址:bashkubectl get ingress

通过网页浏览器访问该ingress地址。

在EKS上部署和测试ComfyUI现在已经完成。接下来我们将把EKS集群连接到CloudFront进行边缘加速。

在 AWS 上高效且灵活地部署 Stable Diffusion ComfyUI 架构博客

可选:部署CloudFront进行边缘加速

在comfyuioneks目录下执行以下命令,将Kubernetes Ingress连接到CloudFront:bashcdk deploy CloudFrontEntry

部署完成后,将打印输出,包括CloudFront URL CloudFrontEntrycloudFrontEntryUrl。请参考前面的部分进行API或浏览器测试。

清理资源

运行以下命令删除所有Kubernetes资源:bashkubectl delete f comfyuioneks/manifests/ComfyUI/kubectl delete f comfyuioneks/manifests/PersistentVolume/kubectl delete f comfyui

全国咨询热线

13594780017

轻云加速器【官网入口】|轻云加速器

联系电话:13594780017

联系人:李总

邮箱:ascorbic@icloud.com

公司地址:芜湖市闪欲峡谷14号


微信扫一扫

手机官网