使用 AWS ECS 和 EFS 扩展有状态 Streamlit 聊天机器人

您开发了一个出色的streamlit应用程序,但将其部署到公司内部却遇到了服务器过载和数据丢失的问题。本文将指导您如何在aws上部署一个可扩展且具有状态保持功能的streamlit应用,避免类似问题。

引言

Streamlit是Python开发者构建交互式Web应用的优秀框架。随着生成式AI的兴起,Streamlit的流行度也显著提升:

Streamlit简化了前端开发,让您专注于应用的核心功能。然而,云端部署则需要解决状态保持和可扩展性问题。Streamlit默认情况下使用内存状态,页面刷新或服务器重启会导致状态丢失。本文将提供在AWS上部署一个可扩展且具有状态保持功能的Streamlit聊天机器人的详细指南。

Streamlit的状态性和可扩展性

将Streamlit应用从本地环境迁移到云端,主要挑战在于状态保持和可扩展性。Streamlit的内存中状态机制在多实例扩展或服务器重启时会丢失数据。本文将提供一种解决方案,解决在将本地POC GenAI应用共享给同事时遇到的问题。

架构

本文介绍的架构利用以下AWS服务:

  • 应用程序负载均衡器 (ALB): 均衡分配传入流量到多个目标实例。
  • Fargate上的弹性容器服务 (ECS): 简化Docker容器管理,实现轻松扩展,无需管理服务器。使用arm64和0.25vcpu/0.5gb ram ECS任务以优化成本效益。
  • 弹性文件系统 (EFS): 提供可扩展的文件系统,可挂载到多个ECS节点,确保跨可用区的数据持久性和冗余。
  • CloudFront (可选): 作为CDN,提升性能并减少延迟,并提供HTTPS支持。

为什么不使用Lambda?

Lambda最初被考虑用于Python或Docker执行环境。然而,Streamlit依赖websocket资源/_stcore/stream,而Amazon API Gateway虽然支持websocket,但需要为连接/数据/断开事件定义多个Lambda处理程序,这与传统HTTP端点使用Lambda Web Adaptor的方式不同。更重要的是,Streamlit客户端将数据作为二进制帧发送到websocket API,而Amazon API Gateway仅支持文本帧,因此无法使用Lambda作为Streamlit后端。

为什么选择EFS而不是其他?

RDS、DynamoDB、ElasticCache和S3等服务也用于状态管理,但各有其复杂性和成本:

选项 优点 缺点
RDS 可靠,健壮 设置复杂,成本高,项目限制
DynamoDB 可扩展,快速 设置复杂,成本高,项目限制,需要手动二进制序列化
ElasticCache 高效缓存 设置复杂,重启时状态丢失,需要本地隧道
S3 成本效益高 网络延迟(除非付费使用S3 VPC网关端点)
EFS 易于设置,可扩展,持久,成本效益高 大规模扩展时成本/延迟会成为问题

EFS提供更简单且更具成本效益的解决方案。它易于设置且相对便宜,适合持久化状态存储。

负载均衡器并非免费的

ALB确实会产生固定成本,但其提供的可扩展性和可靠性对于生产环境至关重要,其优势超过了成本。

为什么选择这种方法?

部署Streamlit应用到云端需要考虑可扩展性和状态性。Streamlit的内存状态管理不适用于生产环境的多用户场景。仅仅扩展虚拟机是不够的,需要一个能够在刷新和服务器重启时保持用户会话的解决方案。

本方案使用streamlit-local-storage包将会话密钥存储在本地存储中,每个会话的数据保存到已安装的EFS存储中的一个文件夹中,文件夹路径由会话密钥构建。本地存储不适合存储大量二进制数据。这确保会话数据在多个ECS节点之间持久且同步。

无需使用复杂且昂贵的数据库解决方案,EFS提供了一种简单高效的替代方案。其易于设置、可扩展且成本效益高。最重要的是,代码在云端和本地环境中的运行方式相同,无需费力设置本地数据库。

可扩展有状态Streamlit应用程序的项目模板

这是一个基于Amazon Bedrock的LLM聊天机器人,提供基本的模型切换和对话重置。左侧面板显示服务的ECS任务主机名和会话ID。

Streamlit Python脚本伪代码

以下是管理会话数据的Streamlit Python脚本简化伪代码:

import uuid
import pickle
import streamlit as st
from streamlit_local_storage import LocalStorage
... other imports ...

session_data = {}
session_id = local_storage.getItem('session_id') or str(uuid.uuid4())
if session_id:
    with open(f'/session_data/{session_id}.json', 'r') as f:
        for key, value in pickle.load(f):
            session_data[key] = value

session_data['some-key'] = st.some_input(label='Enter some input here')
... main chatbot logic here ...

with open(f'/session_data/{session_id}.json', 'w') as f:
    pickle.dump(session_data, f)

此脚本使用本地单例字典session_data存储会话数据,session_id从本地存储生成或检索。会话数据在脚本初始化时加载,并在脚本结束时保存。由于EFS已安装到所有ECS节点,会话数据在所有ECS任务实例之间共享。Streamlit的原生session_state未使用,因为它存储在内存中,不跨多个ECS节点共享。

在您的组织中部署

在AWS上部署此可扩展且具有状态保持功能的Streamlit聊天机器人,请按照以下步骤操作:

  1. 克隆仓库: 克隆仓库https://github.com/gabrielkoo/scalable-stateful-streamlit-chatbot-on-aws/tree/main。
  2. 部署CloudFormation堆栈: 使用template.yml文件部署AWS基础设施。建议使用AWS管理控制台。
  3. 构建并部署Docker镜像: 运行./deployment.sh:构建Docker镜像,推送到Amazon ECR,并使用新镜像扩展ECS服务。
  4. 访问聊天机器人: 通过ALB提供的URL或CloudFront URL访问聊天机器人。
  5. 启用自动扩展: 为ECS服务配置自动扩展,以有效处理不同负载。(此步骤未在仓库中涵盖)

通过这些步骤,您可以在AWS上部署一个强大、可扩展且具有状态保持功能的Streamlit应用,即使在高负载下也能确保无缝的用户体验。 这比简单的虚拟机扩展更经济高效。 您可以专注于本地开发,然后轻松扩展到AWS!

以上就是使用 AWS ECS 和 EFS 扩展有状态 Streamlit 聊天机器人的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

Valve 头显 Steam Frame 上市在即:驱动状态变更为“已发布”

7 月 2 日消息,Valve 旗下三款硬件新品中 Steam 控制器与 Steam Machine 均已上市,而最后一款 VR 头显设备 Steam Frame 似乎也进入了发布前的最后准备阶段。@MizoChris 发现,Valve 近期为 Steam Frame 的无线适配器驱动程序推送了最新更新。与此前多次驱动更新不同的是,此次该驱动的状态被标记为“Released”,并在 SteamDB...

Jabra(捷波朗)扩展 Evolve3 专业办公耳机家族,带来 3 款新品

感谢网友 华南吴彦祖 的线索投递! 7 月 2 日消息,Jabra(捷波朗)今年 1 月推出了其兼顾消费级舒适体验的 Evolve3 系列专业办公耳机。而在当地时间 7 月 1 日,Jabra 在首发的 85 / 75 后为该系列追加推出 65 Flex / 65 / 45 三款新品。此次的新品中 Evolve3 65 Flex 专为办公地点不固定的工作量身打造,采用可折叠的无麦克风杆设计让携带变...

优必选 CEO 周剑:珍惜我们作为牛马的最后光阴,可能 20 年后都是机器人干活

感谢网友 刺客 的线索投递! 7 月 2 日消息,据网易科技报道,优必选 CEO 周剑在 6 月 30 日的 2026 年度全球发布会上谈到机器人替代人类工作的问题。周剑表示:好好珍惜我们作为牛马、作为劳动力工作的最后光阴吧,这也就是未来 5 年 10 年 20 年的事情了。现在 20 多岁的年轻小伙伴们,可能过了 20 年想工作也没了,都是机器人做了。周剑还认为:大家此时很多正在从事不愿意干的、...

在火狐 Firefox 安装“所有”扩展会发生什么:打开浏览器就得 40 分钟,几乎无法使用

感谢网友 Coje_He 的线索投递! 4 月 11 日消息,火狐 Firefox 浏览器一共有 8.4 万个扩展,全部加起来不到 50GB。而玩家 Jack W.最近突发奇想,尝试将这 8.4 万个扩展一股脑装到电脑上。这名玩家在 4 月 9 日更新的博文中表示,Mozilla 插件商店具有公开 API,没有限速、认证等反爬虫措施,因此看起来可以很轻松地把所有扩展下载下来。最初他通过分页方式抓取...

消息称 LG 电子涉足芯片设计服务,首款 ASIC 为 6nm 扫地机器人 SoC

7 月 1 日消息,据韩媒 ZDNET Korea 消息,LG 电子已开始对外提供芯片设计服务。其首款产品为一家韩国企业的 6nm SoC,该芯片后续将被“回购”并装备在 LG 电子的扫地机器人中。尽管早在 1999 年就出售了半导体业务,但 LG 电子一直维持着 Fabless 企业的身份,为自有产品提供 SoC 开发支持。LG 电子在芯片合同制造上的合作伙伴是台积电,上述外部 SoC 也将由台...

国内首个机器人学校开学,30 台“学生”将接受系统化职业技能培训

7 月 1 日消息,据“余杭发布”微信公众号消息,6 月 29 日,由浙江大学机器人研究院联合浙江省质量科学研究院及行业头部企业共同打造的杭州机器人学校,在余杭正式开学。这是国内首个以大脑赋能、智能体集成,推动机器人产品熟化与落地应用为核心的行业综合性、高能级产业赋能平台。目前市面上的人形机器人一般都有灵活的“身体”,会跑会跳,但它们大多还不具备理解环境、适应变化、自主决策的“大脑”。来到机器人学...

《007:初露锋芒》机器人钥匙扣获得方法介绍

《007:初露锋芒》中的纪念品机器人钥匙扣是游戏里非常独特的一种收集品,想要获得也比较麻烦,需要在特定的节点才能获得,具体节点就是地堡入口,经过一系列的攀爬跳跳乐后,最终会从一个通风管道落到一个办公桌上,在后面的演讲台上就能看到了。 007初露锋芒机器人钥匙扣怎么获得 纪念品:机器人钥匙扣 节点19:地堡入口 目标:到达HYPERION 经过一系列的攀爬跳跳乐后,最终会从一个通风管道落到一个办公桌...

Anthropic计划将Project Glasswing扩展至15国约200家机构

6月3日消息,techcrunch报道称,anthropic公司于本周二宣布,将其联合行业倡议project glasswing正式拓展至全球15个国家及地区的约150家新增机构。 作为该计划技术核心的,是Anthropic当前性能最强的AI模型——Claude Mythos。自今年4月向首批50家合作单位开放预览以来,该模型已成功识别出逾10,000个高危或严重级别的安全漏洞。此次新纳入的机构主...