云端生成式 AI – 基于 Amazon EKS 的 Stable Diffusion 图像生成方案

a24a428f25409cfa5b64ea6e21e48be4.gif

Stable Diffusion 是当下生成式 AI 领域最受欢迎的开源多模态语言-图像模型,由于其易用的接口和良好的使用体验,受到了开源社区和广大设计行业从业者的追捧。Stable Diffusion 模型版本正在快速迭代,并带动了各行各业的生产力变革。目前市场上有多种围绕 Stable Diffusion 模型的行业解决方案,比如亚马逊云科技推出的 Stable Diffusion 插件解决方案。

本文中,我们将介绍一种更加适合 toC 场景的解决方案,它将帮助客户从容应对大并发量的请求,达到分钟级冷启动;使用更简单的控制平面,为客户提供更灵活的架构,轻松实现各种功能模块设计;同时,它还利用 Amazon Spot instances,帮助客户有效控制成本。

39a47b9b65a76b6489c74370883926ec.png

Stable Diffusion 文生图原理

16dcf70e87e175735ab70eb135f99899.png

Stable Diffusion 图生图原理

  • Stable Diffusion:

    https://aws.amazon.com/cn/campaigns/aigc/solutions/stable-diffusion-aws-extension/

  • Amazon Spot instances:

    https://aws.amazon.com/cn/ec2/spot/

方案特点

我们根据实际客户需求和案例经验,提炼出该方案的特点如下:

  • 更快速的扩容,基于 KEDA、Karpenter、Bottlerocket,提供可自定义的任务粒度的自动扩容能力,且最快可以达到 1 分钟内业务就绪,适合高并发且对响应时间有要求的情况。

  • 大幅降低成本,通过使用 Amazon Spot instances 和 Amazon EFS,使得计算成本相较于 On-demand instances 可节省最高约 70%,多节点场景下的存储成本相较于 EBS 更可节省数倍。

  • 运维非常方便,方案是云原生架构,基于 Amazon EKS、无服务器(Serverless)和事件驱动(Event-Driven),大部分组件无需自行管理,适合运维人手不足的情况。

  • 可视化监控,提供调用流程详细的可视化,历史统计与异常检测功能,有效缩短 MTTI(Mean Time to Identify)。

  • 自动化部署,方案使用 Amazon CDK,借助编程语言的强大表达能力和高效执行效率,仅需 30-40 分钟就可以自动完成构建。

方案架构

55a6f378df04096c27c19c2cae911ff8.png

方案流程如下:

  • 用户将提示词和参数通过 http 请求的方式,经过 Amazon CloudFront 加速,传递到应用服务器(可通过 Amazon Fargate 部署)。

  • 应用服务器完成相关业务处理后(如:认证鉴权/task 跟踪/参数优化等),调用 Amazon API Gateway 提供的推理 API 接口,之后请求交由 Amazon Lambda 校验并发布到 Amazon SNS 服务,并拿到同步响应。

  • Amazon SNS 借助可自定义的 filter 规则将请求以异步消息的方式发布到对应的队列服务 Amazon SQS 中,多队列的设计可灵活适应复杂的业务需求。

  • KEDA 会根据 Amazon SQS 中的消息数量,动态扩容 Amazon EKS 集群中的工作负载 Pod。

  • 扩容动作会借助 Karpenter 启动 Amazon GPU Spot instances 作为工作节点,并使用基于 Bottlerocket 构建的 snapshot 来快速启动 Stable Diffusion WebUI 工作负载。

  • Stable Diffusion WebUI 以指定配置参数启动,并从 Amazon EFS 中加载基础模型文件。

  • Queue Agent 从任务队列中拉取任务,完成相关处理(下载输入图片/切换基础模型等),调用 Stable Diffusion WebUI 的 API 完成推理并生成结果,将结果图片保存到 Amazon S3 中。

  • Queue Agent 将任务响应数据发布到 Amazon SNS 服务,以便应用服务器能够通过多种方式(Amazon SQS/Http Endpoint)获取异步响应数据并进行后续业务处理。

  • 方案使用 Amazon CloudWatch、Amazon Distro for OpenTelemetry 和 Amazon X-Ray 来采集、追踪和展示相关过程中产生的日志和指标。

  • 方案还使用了 Amazon IAM 来控制资源的访问授权,使用 Amazon ECR 存储容器镜像,使用 Amazon DataSync 同步模型文件,使用 Amazon CDK 来完成自动化部署。

主要服务列表:

  • Amazon Elastic Kubernetes Service(Amazon EKS):是一项托管 Kubernetes 服务,用于在 Amazon Cloud 上运行 Kubernetes。在云中,Amazon EKS 可自动管理负责安排容器、管理应用程序可用性、存储集群数据和其他关键任务的 Kubernetes 控制面板节点的可用性和可扩展性。

  • Amazon ECR:Amazon Elastic Container Registry是完全托管式容器注册表,提供高性能托管,让您能在任何地方可靠地部署应用程序映像和构件。

  • Amazon Lambda:Amazon Lambda 是一项事件驱动、随用随付的计算服务,让您无需预置或管理服务器即可运行代码。

  • Amazon SQS:Amazon Simple Queue Service(SQS)是一种消息队列服务,可让您分离和扩展微服务、分布式系统和无服务器应用程序。

  • Amazon SNS:Amazon Simple Notification Service(SNS)是一项用于应用与应用之间(A2A)以及应用与人之间(A2P)通信的完全托管式消息收发服务。

  • Amazon API Gateway:Amazon API Gateway 是一种完全托管式服务,可以轻松创建、发布任意规模的 API。

  • Amazon CloudWatch:Amazon CloudWatch 会在自动化控制面板中收集并可视化实时日志、指标和事件数据,从而简化您的基础设施和应用程序维护。

  • Amazon X-Ray:Amazon X-Ray 通过您的应用程序时会提供完整的请求视图,并通过无代码和低代码移动过滤负载、函数、轨迹、服务、API 等方面的可视化数据。

  • Amazon S3:Amazon Simple Storage Service(Amazon S3)是一项对象存储服务,旨在存储和保护任意量的数据。

  • Amazon EFS:适用于构建人员的无服务器、完全弹性的文件系统,可以轻松设置、扩展高可用性共享存储并对其进行成本优化。

  • Amazon DataSync:安全的,可自动化并加速本地存储和亚马逊云科技存储服务之间的数据移动服务。

方案实践

前置条件

本文假设您已熟悉 Amazon EC2、Amazon Cloud Development Kit(Amazon CDK)、Docker、Amazon Elastic Container Registry(Amazon ECR)、Amazon Elastic Kubernetes Service(Amazon EKS)。

本方案后续步骤的前置条件如下:

  • Kubernetes cluster 1.22+

  • Helm CLI

  • Node.js 16+

  • Amazon CDK CLI

  • An Amazon Account

  • Administrator or equivalent privilege

本方案默认使用 G5 系列机型(如需使用其它系列机型可修改运行时 Helm Chart 的配置 karpenter.provisioner.instanceType),推荐的区域(Region)如下:

  • US East (N. Virginia) us-east-1

  • US West (Oregon) us-west-2

本方案建议准备一个可访问互联网的调试部署环境,该环境需要能运行 Amazon cli、Git、Docker、NPM、Amazon CDK、kubectl、eksctl 等命令。我们建议您使用 Amazon Cloud9 或 Amazon SageMaker Notebook  来进行部署。

  • Amazon Cloud9:

    https://aws.amazon.com/cn/cloud9/

  • Amazon SageMaker Notebook:

    https://aws.amazon.com/cn/sagemaker/notebooks/

环境部署

环境准备:

我们的方案已在 Github 上开源。地址为:

https://github.com/aws-samples/stable-diffusion-on-eks

运行以下命令以获取源代码和部署脚本:

git clone --recursive https://github.com/aws-samples/stable-diffusion-on-ekscd stable-diffusion-on-eks

左滑查看更多

请参考我们的实施指南,会帮助您一步一步完成方案的环境部署:

https://aws-samples.github.io/stable-diffusion-on-eks/zh/implementation-guide/deployment/

方案效果

方案部署完成以后,我们可以使用代码或者 Postman 等方式构造 http 请求并发送,将获取的 API Endpoint 做为请求 URL,Method 为 Post,Body 为 application/json,示例 Payload 如下(请将注释移除后使用):

文生图:

{"alwayson_scripts": {// 必要,任务类型"task": "text-to-image",// 必要,基础模型名称,关联队列分发或模型切换"sd_model_checkpoint": "v1-5-pruned-emaonly.safetensors",// 必要,任务ID,在上传结果图片和返回响应时会用到"id_task": "21123","uid": "456","save_dir": "outputs"},// 以下皆为官方参数,使用默认值或者直接传入即可"prompt": "A dog","steps": 30,"width": 768,"height": 768
}

左滑查看更多

文生图结果:

19bfacc57a04e13be102117063f9a4b2.png

图生图:

{"alwayson_scripts": {// 必要,任务类型"task": "image-to-image",// 必要,输入图片的url"image_link": "https://www.segmind.com/sd-img2img-input.jpeg",// 必要,任务ID,在上传结果图片和返回响应时会用到"id_task": "31311",// 必要,基础模型名称,关联队列分发或模型切换"sd_model_checkpoint": "v1-5-pruned-emaonly.safetensors",// 非必要,用户id"uid": "456"},// 以下皆为官方参数,使用默认值或者直接传入即可"prompt": "A fantasy landscape, trending on artstation, mystical sky","steps": 16,"width": 512,"height": 512
}

左滑查看更多

图生图结果:

7b8d0e5831b889d89ccced1edcf0cf3d.png

注:结果图片和响应数据,会存储到相关的 S3 output bucket 中以便后续访问。

方案细节

更快的启动时间:toC 业务往往具有高并发的特点,为了迅速响应请求,本方案使用 Karpenter 进行 node 的弹性伸缩,底层直接调用了 EC2 fleet API,结合基于 Bottlerocket 构建的 snapshot,使得服务冷启动时间最快可达到 1 分钟内。

# a sample config for karpenter nodeTemplate
modelsRuntime:
- name: "sample1"namespace: "sample1"modelFilename: "v1-5-pruned-emaonly.safetensors"extraValues:karpenter: nodeTemplate:amiFamily: BottlerocketdataVolume:volumeSize: 80GivolumeType: gp3deleteOnTermination: trueiops: 4000throughput: 1000snapshotID: snap-0c31434acc0a8a558

左滑查看更多

更低的成本:通过使用 Spot 实例和混合 GPU 实例大幅度降低推理成本。虽然 Spot 实例有被回收的风险,但由于 Stable Diffusion 单任务耗时短且无状态,而且在 Spot 实例回收前会处理相应事件并重新启动新的实例,故 Spot 实例完全可以胜任该场景推理需求。Karpenter 默认使用 pricing-capacity-optimized 的 Spot 实例选择策略,会优先使用回收风险最低,且最廉价的 Spot 实例类型。当遇到 Spot 实例无法启动时,将以 On-demand 方式启动,且支持异构和不同家族的实例。

# a sample config for karpenter provisioner
modelsRuntime:
- name: "sample1"namespace: "sample1"modelFilename: "v1-5-pruned-emaonly.safetensors"extraValues:karpenter: provisioner:instanceType:- "g5.xlarge"- "g5.2xlarge"- "g4dn.xlarge"- "g4dn.2xlarge"

左滑查看更多

更简单的控制平面:EKS 可直接使用 Karpenter 和 KEDA 等社区组件进行任务调度和弹性伸缩,使用 Amazon SQS 的消息数作为弹性指标更贴近实际业务需求。

# a sample config for scaling
modelsRuntime:
- name: "sample1"namespace: "sample1"modelFilename: "v1-5-pruned-emaonly.safetensors"extraValues:sdWebuiInferenceApi:scaling:queueLength: 10cooldownPeriod: 60pollingInterval: 1maxReplicaCount: 10minReplicaCount: 1inferenceApi:image:repository: 123456789012.dkr.ecr.us-west-2.amazonaws.com/sd-on-eks/inference-apitag: abcd1queueAgent:image:repository: 123456789012.dkr.ecr.us-west-2.amazonaws.com/sd-on-eks/queue-agenttag: latestpersistence:enabled: trueexistingClaim: "efs-model-storage-pvc"

左滑查看更多

更灵活的设计:可以使用多个 Amazon SQS 队列并结合 Amazon SNS 的 filter 功能,来满足不同业务场景的架构设计需求。例如通过创建针对特定基础模型的专用队列,避免基础模型频繁切换以加快特定模型的生图速度,而对于需要切换主模型的请求可以将其路由到专门的动态队列处理。例如为付费用户的请求设置单独的专用队列,用更多的资源提供更好的服务等。

// lib/runtime/sdRuntime.ts
if (!this.options.dynamicModel) {this.options.inputSns!.addSubscription(new aws_sns_subscriptions.SqsSubscription(inputQueue, {filterPolicy: {sd_model_checkpoint:sns.SubscriptionFilter.stringFilter({allowlist: [this.options.sdModelCheckpoint]})}}))generatedValues.sdWebuiInferenceApi.queueAgent.dynamicModel = false
} else {this.options.inputSns!.addSubscription(new aws_sns_subscriptions.SqsSubscription(inputQueue, {filterPolicy: {sd_model_checkpoint:sns.SubscriptionFilter.stringFilter({denylist: this.options.allModels})}}))generatedValues.sdWebuiInferenceApi.queueAgent.dynamicModel = true
}

左滑查看更多

更精细的并发控制:将 Queue Agent 与 SD WebUI 部署在同一 Pod,以拉的模式来处理异步任务,能够对并发进行灵活精细的控制,缓解了 SD WebUI 负载过重无法响应或超时等问题,同时也方便调整超时时间和重试策略等参数来进行针对性优化。

# src/backend/queue_agent/main.py
queue = sqsRes.Queue(sqs_queue_url)
SQS_WAIT_TIME_SECONDS = 20
check_readiness()
while True:received_messages = receive_messages(queue, 1, SQS_WAIT_TIME_SECONDS)for message in received_messages:try:if taskType == 'text-to-image':r = invoke_txt2img()elif taskType == 'image-to-image':r = invoke_img2img()except Exception as e:traceback.print_exc()finally:handle_outputs()delete_message(message)

左滑查看更多

更好的兼容性:对 SD WebUI Runtime 无侵入,可兼容官方各版本的 Runtime 或客户定制的 Runtime,将定制化的部分放到 Queue Agent 以方便二次开发。支持异步响应以多种方式(Http/Https/SQS)发送到目标和 Amazon SageMaker 异步响应规范。

更直观的监控:集成了 Amazon X-Ray、Amazon CloudWatch 和 Amazon Distro for OpenTelemetry,可以更直观地跟踪整个流程,查看日志和相关指标(例如:流程各环节调用状态和耗时/共享存储的 IO/工作节点的负载等)。

af08ee5ff1b98274317dd0598c98b78b.png

更方便易用:方案基于 Amazon CDK 自动进行部署(根据不同环境估算约 30-40 分钟),并提供了模型文件自动同步(Amazon S3 → Amazon EFS)、模型文件批量下载上传、图片浏览应用等辅助工具。

结论

作为开源多模态生成式 AI 领域的领导者,Stability.ai 推出了更为强大的 Stable Diffusion XL 1.0,并发布在 Amazon BedRock 上。

本文介绍了一种扩容迅速、成本低、维护方便的 Stable Diffusion 开源方案,适合熟悉容器,无服务器并需要以快速扩展和低成本方式部署 Stable Diffusion 模型的学生、设计师和开发人员,应用在高速发展的 toC 业务中。亚马逊云科技致力于为客户提供丰富而功能强大的图像生成方案,也支持开源并持续推动优化,为业务创新提供更好的助力。

本篇作者

d489bf5be72fd679b262071da3cd8d6e.jpeg

陆从尧

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云平台的解决方案咨询和设计。从业十七年,担任过研发经理、架构师等多种角色,有多年的互联网软件研发、系统架构设计及开发经验

ef1a3c65df68ac5fd29b588c9c46b25d.jpeg

孙华

亚马逊云科技资深无服务器产品专家。在过去的 20 多年一直从事软件架构、程序开发以及技术推广等领域的工作。他擅长 Web 领域应用、SaaS 系统和云呼叫中心开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。

0e3de7e770af744abfa28a9cbf896604.jpeg

于昺蛟

亚马逊云科技现代化应用解决方案架构师,负责亚马逊云科技容器和无服务器产品的架构咨询和设计。在容器平台的建设和运维,应用现代化,DevOps 等领域有多年经验,致力于容器技术和现代化应用的推广。

f18b25fa6d916d484d998995ca04985b.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

5c9c23f999e02d255f37eecdc4a9159d.gif

听说,点完下面4个按钮

就不会碰到bug了!

35ae6f616b0a097a5fced478218a365f.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/183988.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解密ChatGPT】:从过去到未来,揭示其发展与变革

🎊专栏【ChatGPT】 🌺每日一句:天行健,君子以自强不息,地势坤,君子以厚德载物 ⭐欢迎并且感谢大家指出我的问题 文章目录 一、ChatGPT的发展历程 二、ChatGPT的技术原理 三、ChatGPT的应用场景 四、ChatGPT的未来趋势 五、总结 引言:随着…

Azure 机器学习 - 使用Python SDK训练模型

目录 一、环境准备二、工作区限制三、什么是计算目标?四、本地计算机五、远程虚拟机六、Apache Spark 池七、Azure HDInsight八、Azure Batch九、Azure Databricks十、Azure Data Lake Analytics十一、Azure 容器实例十二、Kubernetes 了解如何用 SDK v1 将 Azure 计…

2023-mac rz sz 安装

之前安装过一次,没问题,这次按照之前教程装了就不管上传下载都会卡住; step1: brew install lrzsz step2:在/usr/local/bin 路径下配置两个sh,之前从网上找到的直接用都不对,下面这个是调试过的正式可用的 iterm2…

golang工程中间件——redis常用结构及应用(string, hash, list)

Redis 命令中心 【golang工程中间件——redisxxxxx】这些篇文章专门以应用为主,原理性的后续博主复习到的时候再详细阐述 string结构以及应用 字符数组,redis字符串是二进制安全字符串,可以存储图片等二进制数据,同时也可以存…

1-前端基本知识-CSS

1-前端基本知识-CSS 文章目录 1-前端基本知识-CSS总体概述什么是CSS?CSS引入方式行内式内嵌式连接式/外部样式表 CSS选择器元素选择器id选择器class选择器(使用较广) CSS浮动CSS定位静态定位:static绝对定位:absolute相…

深度学习之基于YoloV5-Deepsort人物识别与追踪系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 YoloV5-Deepsort是一种基于深度学习的人物识别与追踪系统,具有较高的准确率和实时性能。 YoloV5是一种…

在maven官网中如何下载低版本的maven

链接:https://archive.apache.org/dist/maven/maven-3/

[ACTF2020 新生赛]Upload 1

题目环境: 仍旧是文件上传漏洞 这道题和上一道大差不差、大同小异、这里不再赘述。 [极客大挑战 2019]Upload 1:https://blog.csdn.net/m0_73734159/article/details/134267317?spm1001.2014.3001.5501 区别在于本题需要在抓包数据里面改文件后缀&#…

关于WMS三个核心问题的解读

一、企业是否需要上WMS系统,可以从以下五个方面入手: 1.库存管理状况:了解企业的库存管理状况,是否存在库存冗余、漏洞、过度采购、库存盘点不准确等问题。 2.物流效率水平:需要了解企业物流效率水平,包括…

【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉…

【蓝桥杯选拔赛真题13】C++最短距离 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

C/C++最短距离 第十二届青少组蓝桥杯C++选拔赛真题 一、题目要求 1、编程实现 有一个居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1,2,3……,当排满一行时,从下一行相邻的楼往反方向排号。 例如:小区为 3 行 6 列,矩阵排列方式: 要求:已知小区…

如何在CPU上进行高效大语言模型推理

大语言模型(LLMs)已经在广泛的任务中展示出了令人瞩目的表现和巨大的发展潜力。然而,由于这些模型的参数量异常庞大,使得它们的部署变得相当具有挑战性,这不仅需要有足够大的内存空间,还需要有高速的内存传…

【STM32】定时器

systick定时器: 【STM32】Systick定时器-CSDN博客 0.通用定时器框图 1.时钟源 2.控制器 3.输入捕获 计数器实际上是与比较寄存器的影子寄存器进行比较的。 4.输出比较 1.STM32的定时器学习要点 参考手册 STM32F1xx中文参考手册.pdf 林何/STM32F103C8 - 码云 -…

sql学习笔记(三)

目录 1.四舍五入 2.向上取整 3.向下取整 4.Hive 分区 5.case when条件语句 6.日期函数 7.字符串函数 8.窗口函数 1️⃣排序函数 1.四舍五入 round select round(3.14) —>3 2.向上取整 ceiling select ceiling(12.15) —>13 3.向下取整 floor select flo…

centos获取服务器公网ip

查看公网IP 用下面几个命令: #curl ifconfig.me #curl icanhazip.com #curl cip.cc

现一个智能的SQL编辑器

补给资料 管注公众号:码农补给站 前言 目前我司的多个产品中都支持在线编辑 SQL 来生成对应的任务。为了优化用户体验,在使用 MonacoEditor 为编辑器的基础上,我们还支持了如下几个重要功能: 多种 SQL 的语法高亮多种 S…

Xilinx FPGA SPIx4 配置速度50M约束语句(Vivado开发环境)

qspi_50m.xdc文件: set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] set_property CONFIG_VOLTAGE 3.3 [curren…

听听ChatGPT对IT行业的发展和就业前景的看法

🌈个人主页: Aileen_0v0🔥系列专栏:PYTHON学习系列专栏💫"没有罗马,那就自己创造罗马~" 目录 (1)判断素数 写法1: 写法2: (2)计算1-100的偶数之和 写法1: 写法2: (3)计算1-100的奇数之和 (4)多层循环 IT行业哪个方向比较…

easyHttp -- 轻量级的 HTTP 客户端工具包

easyHttp gitte地址:easy-http 介绍 easyHttp 是一个轻量级的 HTTP 客户端工具包,专为 Java 设计,使得基本的 HTTP 请求变得异常简单。该库主要针对常见的 HTTP 请求提供了简洁的 API,使得开发者无需面对复杂的设置。当前版本已支持基本的请…

Markdown写作应用推荐

MWeb Pro 是一款适用于macOS的专业Markdown写作、笔记本应用软件。喜欢写博客的朋友,那你一定会需要 MWeb Pro 这款软件。为您提供最佳的写作体验。 Markdown 语法支持: 使用 Github Flavored Markdown 语法,简称 GFM 语法。支持表格、TOC、…