释放Stable Diffusion 无限可能

news2024/11/24 18:17:04

最近在整理大语言模型的系列内容,Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion,是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布,主要用于根据文本的描述产生详细图像,当然它也可以应用于其他任务,比如内补绘制、外补绘制,以及在提示词指导下,对现有图形进行风格化或转变。Stable Diffusion 模型版本正在快速迭代,开源生态也在逐步扩展,对行业生产力带来了巨大的变革。如今出现了很多的开源软件,通过调用 Stable Diffusion 来支持各种功能,并提供简洁的用户界面以方便设计师和爱好者使用。然而 Stable Diffusion 的大规模部署不是一件简单的事情,需要考虑多种因素:

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

  • 个性化和可扩展性:Stable Diffusion 生态广泛,仅广泛使用的基础模型就有 1.5 ,XL 和 2 三个版本。同时大量的插件和附加模型(如 LoRA ,ControlNet 等)可被附加到基础模型上。还可针对特定工作场景(如人像生成)进行精细化调优。这些模型和插件也都在不断迭代。在大规模部署时,针对不同的工作场景可以使用不同的模型进行模型推理,这对整个系统可扩展性要求很高。
  • 推理速度:Stable Diffusion 的基础模型是在亚马逊云计算服务上使用 256 个 NVIDIA A100 GPU 训练,共花费 15 万个 GPU 小时,成本为 60 万美元。而这只是基础模型,对于调用基础模型并加载个性化数据进行推理的应用场景来说,需要使用加速计算芯片(如 NVIDIA GPU 或亚马逊云科技的 Inferentia 芯片)来提升单任务推理速度,降低用户等待时间,提升用户体验。

  • 弹性伸缩:在多种业务场景中,使用者的请求有较大的不确定性。从平衡成本的角度出发,需要考虑在请求较多时快速增加推理实例数量以应对请求,而在请求较少时降低实例数量以降低成本。

屏幕截图 2024-04-26 190905.png

上图是一个常见的大语言模型在容器集群上的部署方式,这种部署方式存在以下问题:

  1. 所有请求都是同步的。由于模型推理相对比较耗时,每个请求耗时可达几十秒,甚至几分钟。这不仅要求客户与后端之间的网络绝对稳定,在流量突增且没有限流手段时,甚至会导致系统雪崩。

  2. 常见的自动扩容策略是基于 CPU 或 GPU 利用率的指标跟踪,无法直观反应系统负载,且触发时间长,无法应对突增请求。但如果为了避免冷启动而保留大量的空闲容量,则资源在低谷期大量闲置,空置成本高昂。

  3. 在弹性伸缩拉起新实例后,还需要加载 Stable  Diffusion 运行时和模型才能对外提供服务。Stable Diffusion 运行时的容器镜像普遍在 10 GB 以上,新实例下载镜像和解压耗费的时间过长,导致冷启动时间过长,大大影响使用者的体验。

  4. Stable Diffusion 模型通常使用存放在块存储或文件存储中,每次加载模型时候拉取性能受限,成本也较高。

解决方案

为了解决传统部署方式带来的业务痛点,亚马逊云科技中国区的技术团队基于使用者的需求和对多种业务场景的深刻理解提出了一套解决方案。该方案充分利用云上资源的弹性,无服务器产品的简便,和 Kubernetes 生态强大的任务调度能力,展示了如何构建端到端低成本、快速扩展的异步图像生成架构。

  • 拥抱开源生态:支持 Stable Diffusion Web UI 和 ComfyUI 两种开源的 Stable Diffusion 运行时,和基于这两种运行时的插件生态。

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

  • 大幅降低成本:通过使用 Amazon EC2 Spot 实例和 Mountpoint for Amazon S3 CSI Driver,使得计算成本相较于 EC2 标准价格可节省最高约 70%,多节点场景下的存储成本相较于其他存储方案更可节省大半。

  • 扩展非常方便:该方案是云原生架构,基于 Amazon EKS、无服务器(Serverless)和事件驱动(Event-Driven)架构,大部分组件无需自行管理,且便利扩展。

  • 可视化监控:提供调用流程详细的可视化,历史统计功能,提供完善的可观测性组件,有效缩短 MTTI(Mean Time to Identify)。

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

  • Stable DiffusionWeb UI

    GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI
     

  • ComfyUI

    GitHub - comfyanonymous/ComfyUI: The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface.

  • KEDA

    KEDA | Kubernetes Event-driven Autoscaling

  • Karpenter

    Karpenter

  • Bottlerocket

    容器主机 - Bottlerocket - Amazon Web Services

  • Amazon EC2 Spot 实例

    Amazon EC2竞价型实例_Amazon EC2优势_AWS实例-AWS云服务

  • Mountpoint for Amazon S3 CSI Driver

    GitHub - awslabs/mountpoint-s3-csi-driver: Mountpoint for Amazon S3 CSI Driver

  • Amazon EKS

    Amazon EKS Kubernetes托管_kubernetes集群管理服务-AWS云服务

  • Amazon CDK

    AWS CDK 开发工具包-AWS开源软件开发框架-AWS云服务

方案的具体工作流程如下图所示:

image.png

  1. 使用者将请求(模型,Prompt 等)发送至业务应用,业务应用将请求发送至 Amazon API Gateway 提供的 API 端点。

  2. 请求通过 Amazon Lambda 进行校验,并投送至 Amazon SNS 主题。

  3. Amazon SNS 根据请求中的运行时名称,基于请求过滤机制,将请求投送至对应运行时的 SQS 队列。

  4. 在 EKS 集群中,KEDA 会根据队列内消息数量扩充运行时的副本数。

  5. Stable Diffusion 运行时启动时会通过 Mountpoint for Amazon S3 CSI Driver,直接从 S3 存储桶中加载模型。

  6. Queue Agent 会从 Amazon SQS 队列里接收任务,并发送给 Stable Diffusion 运行时生成图像。

  7. 生成的图片由 Queue Agent 存储至 Amazon S3 存储桶中,并将完成通知投送至 Amazon SNS 主题,SNS 可将响应投送至 SQS 或其他目标中。

  8. 该解决方案提供完整的可观测性和管理组件,包含基于 CloudWatch 和 ADOT 的数值监控和日志,以及基于 Amazon X-Ray 的全链路跟踪。

  9. 该解决方案通过基于 Amazon CDK 的基础设施即代码部署方式进行部署和配置,通过 IAM 和 API Key 提供安全和访问控制。

方案的生产实践
API 接入和事件分发

该解决方案使用基于 Amazon API Gateway 的 API 端点对外提供服务,并基于 Amazon SNS,Amazon SQS 进行任务分发。用户将请求(模型,Prompt 等)发送至 Amazon API Gateway 提供的 API 端点,请求通过 Amazon Lambda 进行校验,并投送至 Amazon SNS 主题。Amazon SNS 根据请求中的运行时名称,将请求投送至对应运行时的 SQS 队列。

image.png

使用 Queue Agent 组件进行异步推理

部署时,每个运行时有独立的 Amazon SQS 队列以接收请求。而考虑到不同的的 Stable Diffusion 运行时的 API 接口和行为不同,对异步处理和队列的支持也不同,故我们构建了名为 Queue Agent 的组件。Queue Agent 会从 Amazon SQS 队列里接收任务,并转换成对应运行时的 API 请求格式,发送给 Stable Diffusion 运行时生成图像。Queue Agent 还兼顾了从 Internet 或 Amazon S3 上获取图像,和任务跟踪,错误处理的功能,将更多任务从 Stable Diffusion 运行时解耦,从而支持更多的 Stable Diffusion 运行时。

image.png

利用 KEDA 自动扩缩容器副本

当 Amazon SQS 队列中积压过多消息时,需要增加容器副本数以快速处理这些积压任务。我们使用开源的 Kubernetes Event-Driven Autoscaling(简称 KEDA)进行弹性伸缩。KEDA 会轮询 SQS 队列的队列内消息数量,并根据消息数量和预设的阈值来决定运行时的副本数。由于 KEDA 持续监控队列,在没有负载的时候,可以不启动任何运行时,而在有任务时再启动运行时实例,有效节省成本。除了 SQS 队列长度外,KEDA 还支持根据许多其他指标(被称为 Scaler)进行扩缩容。例如部分业务场景有明确的业务高峰期,则可以使用 Cron 在预估的业务高峰期提前进行扩容,而在业务低谷期不预置资源。通过多个 Scaler 的组合,可以支持更多的工作场景。

  • Kubernetes Event-Driven Autoscaling

    KEDA | Kubernetes Event-driven Autoscaling

image.png

利用 Karpenter 自动扩缩实例

在运行时副本数扩展后,需要节点弹性伸缩组件创建实例承载新的运行时副本。传统的节点弹性伸缩组件是 Kubernetes 社区的 Cluster Autoscaler。而亚马逊云科技开源的弹性伸缩组件 Karpenter 可以智能选择实例类型和购买方式。根据同时启动的 Pod 数量,选择最合适的实例类型。例如在同时启动的 Pod 数量很多时,可以选择包含 2 张或 4 张 GPU 的实例,减少实例启动时间对冷启动时间的影响。Karpenter 使用 EC2 Fleet,实例启动速度快于基于 Autoscaling Group 的节点组。在推理任务的成本划分中,GPU 实例的成本占了总成本的 95% 以上。Karpenter 支持创建 Spot 实例,且在创建时会智能选择回收几率最低的实例类型,降低 Spot 实例回收对任务造成的影响。

  • Cluster Autoscaler

    autoscaler/cluster-autoscaler at master · kubernetes/autoscaler · GitHub

image.png

基于 Bottlerocket 实现容器镜像缓存

在存储方面,方案针对 Stable Diffusion 运行时和模型使用了不同的存储。新创建的实例采用了 Bottlerocket 操作系统。Bottlerocket 是一款基于 Linux 的开源操作系统,由亚马逊云科技专门构建用于运行容器。Bottlerocket 仅包括运行容器所需的基本软件,启动速度极快。而在 Stable Diffusion 运行时镜像方面,由于 Docker 拉取镜像是单线程,且拉取完成后还需要解压缩,导致镜像拉取耗时较长。我们将 Stable Difussion 运行时镜像预加载到磁盘,并抓取 EBS 快照。在每次创建新实例时,EBS 快照会恢复到新实例的数据盘,新的实例在加入 EKS 集群后可以立即启动容器,节省拉取镜像和解压的时间。

image.png

利用对象存储支撑大量模型动态读取

常见的模型存储会使用块存储或者文件存储,但对于模型读取这种连续读的工作负载,挂载对象存储存在优势。Mountpoint for Amazon S3 可以将 S3 存储桶挂载到文件系统。在读取模型时支持多线程读取,充分利用网卡资源。在 Amazon S3 上的性能测试显示,使用 Mountpoint for Amazon S3 加载 Stable Diffusion 1.5 的基础模型仅需 14.5 秒,进一步缩减冷启动耗时。

image.png

推送处理结果

生成的图片由 Queue Agent 存储至 Amazon S3 存储桶中,并将完成通知投送至 Amazon SNS 主题。不论任务成功或失败,运行时的返回也会存储到 S3 存储桶,方便进行调试。而只有任务真正处理完成后,Queue Agent 才会从队列中删除对应的任务。当出现意外状况(如 SD 运行时崩溃)时,任务会在设定的一段时间(被称为 Visibility Timeout)后,重新出现在队列中,其他运行时可以重试这个任务。Amazon SQS 这个“两阶段确认”的特性有效的提升了整体方案的可靠性。

image.png

X-Ray 端到端全链路追踪

而在可观测性方面,除了传统的基于 CloudWatch 数值监控和日志之外,通过分布式跟踪,我们能了解每一步的耗时和性能瓶颈,方便运维人员快速排查问题。

image.png

方案的性能与成本

这套方案已经在多个 Amazon Web Services 使用者的生产环境上部署。而我们在 Amazon Web Services 美国西部(俄勒冈)区域的内部实测,端到端的扩容速度(即请求发送到处理完成)最低可达 60 秒,完全可以有效应对需要快速扩容的场景。推理成本由于使用了 Spot 实例最高可节省 70%,有效降低了方案的整体成本,适应大规模部署。

开始使用

目前这套方案已经开源,支持部署到亚马逊云科技海外和中国区域。您可以从 https://github.com/aws-samples/stable-diffusion-on-eks/  获取源代码并开始在您的环境中部署。

资源与参考文献:

  • Guidance for Asynchronous Image Generation with Stable Diffusion on AWS

  • 概览 - Stable Diffusion on Amazon EKS

文章来源:释放Stable Diffusion 无限可能 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《欢乐钓鱼大师》攻略,钓友入坑必备!

欢迎来到《欢乐钓鱼大师》!在这个游戏里,你可以尽情享受垂钓的乐趣,通过不断更换和升级高阶鱼竿,轻松地钓到各种稀有鱼类。因为许多玩家在挑战关卡时遇到了一些困难,所以今天我给大家带来了《欢乐钓鱼大师攻略指南》&a…

第 3 篇 : Netty离线消息处理(可跳过)

说明 仅是个人的不成熟想法, 未深入研究验证 1. 修改 NettyServerHandler类 package com.hahashou.netty.server.config;import com.alibaba.fastjson.JSON; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHan…

Vue3中使用无缝滚动插件vue3-seamless-scroll

官网:https://www.npmjs.com/package/vue-seamless-scroll 1、实现效果文字描述: 表格中的列数据进行横向无缝滚动,某一列进行筛选的时候,重新请求后端的数据,进行刷新 2、安装:npm i vue3-seamless-scrol…

从Kafka的可靠性设计体验软件设计之美

目录 1. Kafka可靠性概述 2. 副本剖析 2.1 什么是副本 2.2 副本失效场景 2.3 数据丢失场景 2.4 解决数据丢失方案 3. 日志同步机制 4. 可靠性分析 1. Kafka可靠性概述 Kafka 中采用了多副本的机制,这是大多数分布式系统中惯用的手法,以此来实现水平扩…

异步日志方案spdlog

异步日志方案spdlog spdlog 是一款高效的 C 日志库,它以其极高的性能和零成本的抽象而著称。spdlog 支持异步和同步日志记录,提供多种日志级别,并允许用户将日志输出到控制台、文件或自定义的接收器。 多线程使用和同步、异步日志没有关系是…

10.接口自动化测试学习-Pytest框架(2)

1.mark标签 如果在每一个模块,每一个类,每一个方法和用例之前都加上mark标签,那么在pytest运行时就可以只运行带有该mark标签的模块、类、接口。 这样可以方便我们执行自动化时,自主选择执行全部用例、某个模块用例、某个流程用…

indexDB 大图缓存

背景 最近在项目中遇到了一个问题:由于大屏背景图加载速度过慢,导致页面黑屏时间过长,影响了用户的体验。从下图可以看出加载耗时将近一分钟 IndexDB 主要的想法就是利用indexDB去做缓存,优化加载速度;在这之前&am…

自动驾驶传感器篇: GNSSIMU组合导航

自动驾驶传感器篇: GNSS&IMU组合导航 1.GNSS1.1 GNSS 系统概述1.2 GNSS系统基本组成1. 空间部分(Space Segment):2. 地面控制部分(Ground Control Segment):3. 用户设备部分(Use…

python爬虫-----深入了解 requests 库下篇(第二十六天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

电影交流|基于SprinBoot+vue的电影交流平台小程序系统(源码+数据库+文档)

电影交流平台目录 目录 基于SprinBootvue的电影交流平台小程序系统 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 电影信息管理 3公告信息管理 4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

Oracle delete删除数据是否为逻辑删除、新插入数据占用的数据块位置实验

假设一:数据库delete删除为直接删除 假设二:数据库delete删除为逻辑删除,在数据块标记出来,但是实际并没有删除。 方式一:通过dump数据块的方式来实现 我们先用小数据量,通过dump数据块的方式来实现 -- 数…

Activity界面什么都不显示怎么解决

如图,有可能是你重写错了方法,两个onCreate方法非常像,参数不同,正确方法如下:

003基于SSM的学生选课系统(学生信息管理系统)ssm+mysql

003基于SSM的学生选课系统/学生信息管理系统 开发环境: Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库: MySQL 前端:JavaScript、jQuery、bootstrap4、particles.js 后端:maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybat…

共享购:融合社交分享与消费返利的创新电商模式

共享购电商模式是一种独特的商业模式,巧妙地将社交分享与消费返利结合,让消费者在购物的同时,也能通过平台资产奖励实现价值的双重增长。该平台资产体系主要由共享值和共享积分两大要素构成,共同构建了一个充满活力的电商生态系统…

C++中布隆过滤器

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

【网络原理】TCP协议的连接管理机制(三次握手和四次挥手)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文) 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法) 【网络…

Linux的FTP服务

目录 1.什么是FTP服务? 2.FTP的工作原理和流程 1 主动模式 2 被动模式 3.搭建和配置FTP服务 1 下载服务包、备份配置文件 2 修改配置文件​编辑 3 匿名访问测试 4 设置黑白命令 1.什么是FTP服务? FTP(file Transfer Protocol&#…

Baidu comate智能编程助手评测

Baidu comate智能编程助手评测 作者:知孤云出岫 目录 一. 关于comate产品 二. 关于comate产品体验 三. 关于实际案例. 四. 关于baidu comate编程助手的实测体验感悟 五. …

(三)登录和注册(handle_auto.go)

登录和注册(handle_auto.go) 文章目录 登录和注册(handle_auto.go)一、所需要的结构体信息二、注册三、登录四、退出 一、所需要的结构体信息 type UserAuth struct{}type LoginReq struct {Username string json:"username" binding:"required"Password …

面试经典150题——求根节点到叶节点数字之和

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一——DFS 理解问题: 首先要理解题目的要求,即对于给定的二叉树,我们需要找出从根节点到所有叶子节点的所有路径,然后将每一条路径上的数字组成一个整数,最后求出这些整数…