2026-01
在AWS上使用Discord的Stable Diffusion弹性部署 架构博客
使用 Discord 在 AWS 部署稳定扩散的弹性方案
重点内容在本文中,我们将探讨如何在 AWS 上部署一个高度可用的解决方案,使用稳定扩散模型进行文本到图像的生成,并使用 Discord 作为用户界面。这个解决方案可以简化文本到图像的请求过程,允许 Discord 伺服器的所有成员进行创作。
稳定扩散是一种最先进的文本到图像模型,可以根据输入的文本生成图像。通常,部署此类模型需要特定的计算硬体,例如图形处理器GPU。借助 AWS,可以降低入门的门槛。
解决方案架构
所选择的许多服务是 无伺服器,这将提供多种好处。在撰写本文时,稳定扩散要求使用 GPU 进行推论,因此选择了 Amazon Elastic Compute CloudAmazon EC2,因其提供了 GPU。解决方案架构如图 1 所示。
让我们了解这个解决方案的架构。
基于自定义指标的自动扩展为了正确扩展系统,我们创建了一个自定义的 Amazon CloudWatch 指标。这个指标计算所需的 Amazon Elastic Container ServiceAmazon ECS任务数量,以妥善处理 Amazon Simple Queue ServiceAmazon SQS消息的数量。高分辨率的 CloudWatch 指标可以迅速进行自动扩展。对于此用例,我们实现了每 10 秒创建一次的高分辨率指标。
接下来,让我们创建自定义的 CloudWatch 指标。Amazon EventBridge 规则提供了一个无伺服器的解决方案,以计划启动动作。这里我们使用 Amazon EventBridge 规则,每分钟启动一次 AWS Step Function Express 工作流程。通过 Express 工作流,我们可以创建少于五分钟的无伺服器工作流,从而避免长时间运行的 AWS Lambda 函数。Express 工作流每 10 秒执行一次 Lambda 函数,持续一分钟,以生成自定义的 CloudWatch 指标。
两个高分辨率的 CloudWatch 警报根据自定义的 CloudWatch 指标进行扩展。这些警报一个用于增加 ECS 任务和 EC2 实例,另一个则用于减少这些资源。
处理 Discord 请求当某人在 Discord 中发送请求时,Amazon API Gateway HTTP API 会接收该请求并将信息传递给 AWS Lambda 函数。HTTP API 与 REST API 相比,是一种更具成本效益的选择,并提供身份验证和授权的工具。HTTP API 使用跨域资源共享CORS,仅允许 discordcom 作为来源,因此提供了安全性。
AWS Lambda 函数用于作为无伺服器的解决方案来响应 HTTP API 的请求。它能够转换 HTTP API 的请求,并将信息发送到 SQS 先进先出FIFO伫列。使用 FIFO 伫列可以无缝地解耦用户请求与后端处理。该伫列确保用户请求按请求顺序进行处理。AWS Lambda 函数在三秒内向 HTTP API 返回响应,满足 Discord Slash 命令的要求。
扩展时,EC2 实例将注册到 ECS 集群中,由于选择的 EC2 实例类型提供了 GPU 实例,ECS 提供重复的解决方案,以便在各类实例上部署容器。当前这个方案仅使用 g4dnxlarge 实例类型。然后,ECS 服务将 ECS 任务放置在合适的 EC2 实例上,任务将利用 Amazon Elastic Container RegistryAmazon ECR私有登录库来拉取映像,执行文本到图像处理并响应 Discord 请求。ECR 私有登录库为管理映像的容器登录库。
一旦在 Amazon EC2 实例上启动 ECS 任务,该任务将使用长轮询的方式消耗伫列中的消息,这样可以减少 ECS 任务需要发送的 ReceiveMessage 请求数量。当 ECS 任务从伫列接收消息后,将开始处理请求。
预估每月费用本示例假设每月有 1000 个请求,每个请求的完成时间为 16 秒。考虑到处理消息的时间七分钟和自动扩展冷却时间30 分钟,我们在 EC2 时间中添加了额外时间。您可以使用 AWS 定价计算器 调整定价计算,根据您的使用情况预估费用。
前提条件
这篇博客假设您熟悉 Terraform、Docker、Discord、Amazon EC2、Amazon Elastic Block Store (Amazon EBS)、Amazon Virtual Private Cloud (Amazon VPC)、AWS 身份与访问管理 (IAM)、Amazon API Gateway、AWS Lambda、Amazon SQS、Amazon Elastic Container Registry (Amazon ECR)、Amazon ECS、Amazon EventBridge、AWS Step Functions、以及 Amazon CloudWatch。
在这个指南中,您需要以下前提条件:
拥有一个 AWS 帐号,并具有创建安装步骤中描述资源的权限在您要部署的区域中拥有一个与 Internet 网关关联的公共子网的虚拟私有云VPC。建议使用默认 VPC,子网需标记为 key Tier 和 value Public 并与 VPC 附加。如果您决定创建自己的 VPC 和子网,请确保已启用 自动分配 IP 设定。
拥有一个具有所需权限以部署基础设施的 IAM 用户
在您拥有的 Discord 伺服器上注册的一个新的 Discord 应用,并具备 applicationscommand 的范畴。如果您需要创建 Discord 应用的起始点,可以参考 这个教程。 Discord 机器人令牌Discord 应用 IDDiscord 公共密钥拥有一个 Hugging Face 帐户一台安装了以下软件的计算机:Terraform gt= 136gitAWS CLIdocker部署指南
按照以下步骤在 AWS 上部署这个解决方案。
增加 EC2 限制
此解决方案使用 g4dnxlarge 实例类型,可能需要您 请求 EC2 限制提升。检查 正在运行的按需所有 G 和 VT 实例 的当前限制。确保拥有超过 4 vCPU;单个 g4dnxlarge 需要 4 vCPU。我们建议请求 8 vCPU,以便可以使用 2 个 g4dnxlarge 实例。
部署基础设施
确保拥有至少 60 GB 的可用存储,并且运行在 64 位 x86 架构系统上。打开机器的命令行介面。通过 AWS CLI 以您的 AWS 用户身份登录,命令为 aws configure。如果使用 EC2 实例,请创建并使用实例配置文件,而不是直接使用 AWS CLI。 所选择的区域将是您要部署的区域。
克隆 Terraform 存储库:git clone https//githubcom/awssamples/amazonscalableinfradiscorddiffusiongit
进入 Terraform 存储库:cd amazonscalableinfradiscorddiffusion
自定义 terraformtfvars 文件中的变量以匹配您的部署需求。
将以下密码导出到命令行: export TFVARdiscordbotsecret=DISCORDBOTSECRETHEREexport TFVARhuggingfacepassword=HUGGINGFACEPASSWORDHERE
初始化存储库:terraform init
应用基础设施大约需要 2 分钟:terraform apply
保存输出以备将来使用。
设置 Discord
这个设置将 Discord 互动 URL 添加到您的 Discord 应用中。在 terraform apply 成功返回后,继续这些步骤。
打开 Discord 应用页面 gt 常规资讯。将 discordinteractionsendpointurl 的值复制并粘贴到互动端点 URL 中,然后保存更改。如果成功,应该会出现一个绿色框,显示 您的所有编辑已正确记录。
Docker 映像和 Amazon Elastic Container Registry
在这一部分中,您将创建一个包含稳定扩散模型的 Docker 映像。
退出 terraform 存储库:cd
克隆 Docker 构建存储库:git clone https//githubcom/awssamples/amazonscalablediscorddiffusiongit
进入 Docker 存储库:cd amazonscalablediscorddiffusion
构建并推送 Docker 映像到 ECR。这需要在运行的机器上安装并正在运行 Docker。 您可以从 Amazon ECR 存储库中找到适合您部署的命令。
这是一个大约 10GB 的映像,根据您机器的网络连接,推送过程可能需要超过 20 分钟。
使用 Discord Slash 命令请求图像
这部分将描述如何使用 Discord 请求文本到图像的响应。
登录 Discord 并导航到您已部署 Discord 应用的伺服器。进入某个文本频道。输入命令 /sparkle。 当出现 COMMANDS MATCHING /sparkle 的框时,选择 /sparkle 命令框。 根据您如何自定义您的 Discord 应用,图 3 中的图像可能会有所不同。输入提示,例如 a corgi style of monet。 来自 YourBotName 的响应将显示为 Submitted to Sparkle YourPromptHere,如图 4 所示。将需要 10 分钟的时间来启动 EC2 实例及运行 ECS 任务。一旦 ECS 任务在实例上运行,推断时间应该缩短至 30 秒以内,具体取决于请求。当 ECS 任务正在处理您的请求时,您将看到 Processing your Sparkle 的提示消息,如图 5 所示。
当消息完成时,将显示 Completed your Sparkle! 的提示,如图 6 所示。
黑豹vnp加速器清理工作
为了避免将来产生费用,请删除 Terraform 脚本创建的资源。
返回到您部署 terraform 脚本的目录。要在 AWS 中销毁基础设施,运行命令 terraform destroy。当提示确认您要销毁基础设施时,输入 yes 并按 Enter。结论
总之,我们创建了解决方案,允许 Discord 伺服器的成员使用稳定扩散模型从文本创建图像。使用此实现,部署可以扩展到多个 Discord 伺服器并处理每秒超过 100 个请求。
在 AWS 上创建项目,降低人们体验文本到图像模型的门槛。
标签:架构、aws、discord、高可用性、扩展、解决方案、稳定扩散、文本到图像
Steven Warren
Steven 是 AWS 的技术帐户经理。他热衷于构建有趣且容易接近的项目。在夏天,他喜欢骑电动长板,冬天则和家人一起滑雪或单板滑雪。