使用开源工具和生成式人工智能实现异步图像生成
本指南将帮助您在 AWS 上实施可扩展且低成本的 Stable Diffusion (SD) Web 用户界面(UI)推理架构。SD 是一个流行的开源项目,用于使用生成式人工智能生成图像。本指南展示了如何使用无服务器和容器服务来构建和部署端到端、低成本的异步图像生成架构。
请注意:[免责声明]
架构图
[架构图描述]
第 1 步
用户或应用程序向 Amazon API Gateway 发送提示,Amazon API Gateway 将在整份指南中用作端点(包含身份验证功能)。AWS Lambda 会验证请求,将请求发布到指定的 Amazon Simple Notification Service(Amazon SNS)主题,并立即返回响应。
第 2 步
Amazon SNS 将消息发布到 Amazon Simple Queue Service(Amazon SQS)队列。每条消息都包含一个 Stable Diffusion(SD)运行时名称属性,这些消息将被传递到具有相匹配 SD 运行时名称的队列中。
第 3 步
在 Amazon Elastic Kubernetes Service(Amazon EKS)集群中,之前部署的开源 Kubernetes 事件驱动自动缩放器(KEDA)会纵向扩展新的容器组(pod),以处理来自 Amazon SQS 队列(如队列 1、队列 2)的传入消息。
第 4 步
在 Amazon EKS 集群中,之前部署的开源 Kubernetes 计算自动缩放器 Karpenter 会启动基于 Amazon Elastic Compute Cloud(Amazon EC2)GPU 实例(如 g4、g5 和 p4)的新计算节点,以调度待处理的容器组(pod)。这些实例使用预缓存的 SD 运行时映像,并基于 Bottlerocket 操作系统,以加快启动速度。您可以使用按需或竞价定价模式启动实例。
第 5 步
在运行时初始化时,或处理按需请求时,Stable Diffusion 运行时会通过适用于 Amazon S3 的 Mountpoint CSI 驱动程序从 Amazon Simple Storage Service(Amazon S3)存储桶中加载机器学习(ML)推理模型文件。
第 6 步
队列代理(为本指南创建的软件组件)接收来自 SQS 处理队列的消息,并将其转换为 SD 运行时 API 调用的输入。
第 7 步
队列代理调用 SD 运行时 API,接收和解码响应,并将生成的图像保存到指定的 Amazon S3 存储桶中。
第 8 步
队列代理向指定的 SNS 主题发送通知。用户收到来自 SNS 主题的通知,可以渲染图像。
Well-Architected 支柱
当您在云中构建系统时,AWS Well-Architected Framework 可以帮助您了解所做决策的利弊。框架的六大支柱使您能够学习设计和操作可靠、安全、高效、经济高效且可持续的系统的架构最佳实践。使用 AWS 管理控制台中免费提供的 AWS Well-Architected Tool,您可以通过回答每个支柱的一组问题,根据这些最佳实践来检查您的工作负载。
上面的架构图是按照 Well-Architected 最佳实践创建的解决方案示例。要做到完全的良好架构,您应该遵循尽可能多的 Well-Architected 最佳实践。
-
卓越运营
AWS X-Ray 可跟踪从 API Gateway 到 Lambda、Amazon SNS、Amazon SQS、Amazon EKS 容器组(pod),直至 Amazon S3 的请求。这使用户可以快速对请求进行故障排除。此外,X-Ray 还提供服务地图,让用户一目了然地确定当前系统状态。
适用于 OpenTelemetry 的 AWS Distro 从 EKS 集群收集指标,并将其发送至 Amazon CloudWatch。适用于 OpenTelemetry 的 Distro 和 CloudWatch 可帮助您获取关键指标,并让您在指标超过阈值时自动收到警报。CloudWatch Container Insights 可帮助实现这些指标的可视化。
-
安全性
AWS Identity and Access Management(IAM)为 API Gateway、Lambda、Amazon SNS、Amazon SQS 和 Amazon S3 提供访问控制。EKS 集群上的服务账户 IAM 角色(IRSA)可为 EKS 集群内运行的容器组(pod)提供细粒度的访问控制。EKS 集群上的 IAM 和 IRSA 可强制执行基于角色的访问控制,并限制对资源的未经授权访问。
-
可靠性
本指南中的所有服务均为区域性服务,具有内置的高可用性,并针对可用区故障提供了容错能力。除了为每项单独的服务提供高可用性外,本指南还采用了松散耦合的微服务架构。此外,Amazon S3 和 Amazon EFS 还提供高度可靠的存储服务,为长时间正常运行提供支持。
-
性能效率
Amazon EKS 提供了灵活的容器调度和可扩展性。KEDA 是适用于 Kubernetes 的事件驱动型容器组(pod)自动缩放器。Karpenter 简化了 Kubernetes 基础设施,并会自动启动适当数量的计算资源来处理集群的应用程序。结合 KEDA 和 Karpenter,Amazon EKS 可在一分钟内纵向扩展一个新节点。Bottlerocket 是针对容器进行了优化的操作系统,启动时间比 Amazon Linux 2 短。
-
成本优化
竞价型实例的价格低于按需型实例。Amazon EKS 中的 Stable Diffusion Web 用户界面需要 GPU 实例进行推理,使用竞价型实例可节省高达 70% 的成本。由于 SQS 队列存储了推理任务,因此在竞价型实例中断时,您不会丢失数据。
此外,Fargate 上的 Amazon Elastic Container Service(Amazon ECS)为运行容器化应用程序提供了无服务器基础设施。Amazon EKS 通过标准 API 为部署、运行和管理容器提供了一种经济高效的方式。Fargate 上的 Amazon ECS 和 Amazon EKS 为容器编排提供了可配置的基础设施选项,可实现成本优化。
-
可持续性
Lambda 会根据请求自动扩展,不会对闲置基础设施收费。这减少了前端 API 的计算使用量。Karpenter 具有容器工作负载整合功能,可定期检查当前工作负载是否可以整合到资源占用较少的现有 EKS 计算节点上,有助于减少闲置资源。Fargate 上的 Amazon ECS 提供了无服务器基础设施选项,能够以最小的资源占用量运行容器。
实施资源
提供了在 AWS 账户中进行实验和使用的详细指南。构建指南的每个阶段(包括部署、使用和清理)都将被检查,以便为部署做好准备。
示例代码为起点。它经过行业验证,是规范性但不是决定性的,可以帮助您开始。
相关内容
免责声明
示例代码;软件库;命令行工具;概念验证;模板;或其他相关技术(包括由我方人员提供的任何前述项)作为 AWS 内容按照《AWS 客户协议》或您与 AWS 之间的相关书面协议(以适用者为准)向您提供。您不应将这些 AWS 内容用在您的生产账户中,或用于生产或其他关键数据。您负责根据特定质量控制规程和标准测试、保护和优化 AWS 内容,例如示例代码,以使其适合生产级应用。部署 AWS 内容可能会因创建或使用 AWS 可收费资源(例如,运行 Amazon EC2 实例或使用 Amazon S3 存储)而产生 AWS 费用。
本指南中提及第三方服务或组织并不意味着 Amazon 或 AWS 与第三方之间存在认可、赞助或从属关系。AWS 的指导是一个技术起点,您可以在部署架构时自定义与第三方服务的集成。