作者 王锐日期 2024年5月16日相关链接 Amazon CloudFront Amazon Elastic Kubernetes Service Amazon Simple Storage Service (S3) AWS CloudFormation永久链接
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时,服务器无事件触发,自动同步模型目录数据。本解决方案的架构分为两个阶段:部署阶段和用户交互阶段。
部署代码和详细说明可以在我们的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
运行以下命令:bashcd /comfyuioneks ampamp cdk deploy ComfyuiCluster
CloudFormation将创建名为ComfyuiCluster的堆栈,以部署EKS集群所需的所有资源。此过程通常需要约20到30分钟完成。
部署成功后,CDK输出将显示一个ConfigCommand。该命令用于更新配置,启用通过kubectl访问EKS集群。执行ConfigCommand以授权kubectl访问EKS集群。为验证kubectl是否已被授权访问EKS集群,执行以下命令:bashkubectl get svcEKS集群的部署完成。请注意,EKS蓝图已输出KarpenterInstanceNodeRole,这是由Karpenter管理的节点的角色。记录此角色,后面将进行配置。
运行以下命令: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后,可以继续以下步骤。运行以下命令:bashcd /comfyuioneks ampamp cdk deploy S3OutputsStorage
S3OutputsStorage堆栈创建一个S3桶,按照模式命名为comfyuioutputs{accountid}{region},用于存储ComfyUI生成的图像。
ComfyUI工作负载通过Kubernetes进行部署。
运行以下命令,创建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仅需重新构建镜像并替换为新版本。获取前一部分中的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 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
运行以下命令,将您的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
运行以下命令替换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
要通过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进行边缘加速。

在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
联系人:李总
邮箱:ascorbic@icloud.com
公司地址:芜湖市闪欲峡谷14号
微信扫一扫
手机官网