مقیاس یک چت ربات Streamlit Stateful با AWS ECS و EFS

عالی ساختی Streamlit کاربرد. وقتی رئیس شما از شما پرسید:
برنامه PoC GenAI شما عالی است. بیایید آن را در اختیار کل شرکت قرار دهیم!
شما آن را در یک ماشین مجازی مستقر کردید (شاید با استفاده از آدرسی مانند http://12.34.56.78:8501
) و همکاران شما با اشتیاق وارد شدند، سرور بیش از حد بارگذاری شد و بارها و بارها راه اندازی مجدد شد. برخی از داده های گرانبها استفاده از آنها برای همیشه از بین رفت. کارشان را از دست دادند. شما سعی کردید با دوبرابر کردن اندازه ماشین مجازی (مکرر) آن را با نوار چسب درست کنید، اما همان الگوی اضافه بار + راه اندازی مجدد تکرار شد. شما احساس درماندگی می کنید.
مقدمه
Streamlit بدون شک یکی از بهترین چارچوب ها برای توسعه دهندگان پایتون برای ساخت برنامه های وب تعاملی است. با افزایش علاقه به هوش مصنوعی Generative از اواخر سال 2022، این بسته افزایش قابل توجهی در محبوبیت داشته است، همانطور که تعداد فزاینده ستارهنگاران GitHub نشان میدهد:
مهمتر از آن، استفاده از Streamlit به این معنی است که شما نیازی به نگرانی در مورد یادگیری قسمت جلویی چیزها ندارید. شما می توانید بر روی ساختن عملکردهای اصلی برنامه خود تمرکز کنید، در حالی که Streamlit از بقیه مراقبت می کند. با این حال، وقتی صحبت از استقرار برنامههای Streamlit در فضای ابری میشود، همه چیز ممکن است کمی پیچیده شود.
Statefulness و مقیاس پذیری با Streamlit
هنگامی که برنامه Streamlit خود را از یک محیط محلی به فضای ابری منتقل می کنید، دو چالش مهم ایجاد می شود: اطمینان از دولتی بودن و دستیابی به مقیاس پذیری. به طور پیش فرض، Streamlit وضعیت را حفظ می کند در حافظه، به این معنی که وقتی کاربر هر حالتی از بین می رود صفحه را تازه می کند یا سرور دوباره راه اندازی می شود. این می تواند یک مانع مهم در هنگام مقیاس بندی برنامه در چندین نمونه یا زمانی که به رئیس خود پاسخ می دهید “چرا برنامه PoC GenAI محلی خود را با سایر همکاران به اشتراک نمی گذارید؟”.
من دیدم که انجمن Streamlit چندین بار در مورد این موضوع بحث کرده است (اینجا، اینجا، اینجا و اینجا)، اما تاکنون هیچ راهنمای جامعی در مورد نحوه استقرار یک برنامه Streamlit stateful در فضای ابری پیدا نکردهام. هدف این مقاله پر کردن این شکاف با ارائه راهنمای دقیق در مورد استقرار a چت ربات Streamlit مقیاس پذیر و حالت دار در AWS.
معماری
برای غلبه بر این چالش ها، این مقاله یک ربات چت Streamlit مقیاس پذیر و حالت پذیر را معرفی می کند که در AWS مستقر شده است. اهرم های معماری:
- Application Load Balancer (ALB): ترافیک ورودی برنامه را در چندین هدف توزیع می کند و توزیع بار یکنواخت را تضمین می کند.
-
سرویس کانتینر الاستیک (ECS) در Fargate: کانتینرهای Docker را مدیریت می کند و اجازه می دهد مقیاس بندی آسان بدون نیاز به مدیریت سرورها. با استفاده از
arm64
و0.25vCPU
/0.5GB RAM
وظایف ECS برای کارایی بیشتر هزینه و عملکرد. - سیستم فایل الاستیک (EFS): الف را فراهم می کند سیستم فایل مقیاس پذیر که می تواند روی چندین گره ECS نصب شود و اطمینان حاصل شود ماندگاری و افزونگی داده ها در سراسر مناطق در دسترس (AZs).
- CloudFront (اختیاری): به عنوان یک شبکه تحویل محتوا (CDN) برای بهبود عملکرد و کاهش تأخیر برای کاربران عمل می کند – مهمتر از آن HTTPS.
لامبدا نیست؟
من به استفاده از آن فکر کردم لامبدا در محیط اجرای پایتون یا داکر. با این حال، Streamlit به منبع وب سوکت نیاز دارد /_stcore/stream
مورد استفاده قرار گیرد. در حالی که خدمات مانند دروازه API آمازون از WebSocket پشتیبانی می کند، چنین پیاده سازی مستلزم آن است که چندین کنترلر Lambda را برای websocket در تعریف کنید. رویدادهای اتصال/داده/قطع اتصالمتفاوت از روش های معمول استفاده از آداپتور وب لامبدا برای عمل به عنوان نقطه پایانی سنتی HTTP.
مهمتر از آن، بخش کلاینت Streamlit دادهها را به API websocket ارسال میکند فریم های باینری، در حالی که Amazon API Gateway فقط از فریم های متنی پشتیبانی می کند. این باعث می شود غیر ممکن برای استفاده از Lambda به عنوان باطن Streamlit.
چرا EFS را انتخاب کنید اما دیگران را نه؟
در حالی که پایگاههای داده مانند RDS یا DynamoDB، راهحلهای ذخیرهسازی مانند ElasticCache و سرویسهای ذخیرهسازی مانند S3 انتخابهای رایجی برای مدیریت حالت هستند، آنها مجموعهای از پیچیدگیها و هزینههای خاص خود را دارند.
گزینه | جوانب مثبت | منفی |
---|---|---|
RDS | قابل اعتماد، قوی | راه اندازی پیچیده، هزینه بالا، محدودیت اقلام |
DynamoDB | مقیاس پذیر، سریع | راه اندازی پیچیده، هزینه بالا، محدودیت آیتم، سریال سازی باینری دستی |
ElasticCache | کش کارآمد | راه اندازی پیچیده، از دست دادن حالت در راه اندازی مجدد، به تونل برای محلی نیاز دارد |
S3 | مقرون به صرفه | تأخیر شبکه برای عملیات دریافت/تنظیم، مگر اینکه برای S3 VPC Gateway Endpoint پرداخت کنید |
EFS | راه اندازی آسان، مقیاس پذیر، پایدار، مقرون به صرفه | هزینه/تأخیر زمانی که به سطح سازمانی مقیاسبندی میشود به یک مسئله تبدیل میشود |
EFS ارائه می دهد ساده تر و مقرون به صرفه تر راه حل این یک سیستم فایل شبکه را فراهم می کند که می تواند باشد بر روی چندین گره ECS نصب شده است، تضمین می کند افزونگی در AZ و مقیاس پذیری. راه اندازی آسان و نسبتاً ارزان است، و آن را به گزینه ای ایده آل برای ذخیره سازی در حالت پایدار تبدیل می کند. مهمتر به عنوان فقط عملیات فایل درگیر است، تفاوت در تنظیمات محلی و ابری حداقل است.
شما به هزینه اشاره کردید اما بار متعادل کننده ها رایگان نیستند
درست است که Application Load Balancer (ALB) متحمل می شود یک هزینه ثابت. با این حال، مزایای استفاده از ALB – مانند توزیع خودکار ترافیک برنامه های ورودی، پشتیبانی از HTTP/2 و ادغام با سرویس های AWS- بیشتر از هزینه است. علاوه بر این، مقیاس پذیری و قابلیت اطمینان آن برای a بسیار مهم است برنامه آماده تولید. هزینه ALB با بهبود عملکرد و مدیریت پذیری آن توجیه می شود.
چرا این رویکرد؟
استقرار یک برنامه Streamlit در فضای ابری مستلزم بررسی دقیق مقیاس پذیری و حالت است. به طور پیش فرض، Streamlit's مدیریت حالت در حافظه برای یک محیط تولید برای چندین کاربر کافی نیست. صرفاً افزایش مقیاس یک ماشین مجازی کافی نیست. شما به راه حلی نیاز دارید که جلسات کاربر را در تمام طول انجام دهد رفرش می شود و سرور دوباره راه اندازی می شود.
راه حل شامل استفاده از مرورگر کاربر برای ذخیره یک کلید جلسه در حافظه محلی است streamlit-local-storage
بسته، در حالی که هر جلسه در یک پوشه در ذخیره سازی EFS نصب شده ذخیره می شود که مسیر آن با کلید جلسه ساخته شده است، زیرا ذخیره سازی محلی برای ذخیره داده های باینری بیش از حد مورد استفاده قرار نمی گیرد. این تضمین می کند که دادههای جلسه پایدار هستند و در چندین گره ECS همگامسازی میشوند.
به جای انتخاب کردن راه حل های پیچیده و پرهزینه پایگاه داده مانند RDS یا DynamoDB، یا برخورد با پیچیدگی های ElasticCache، EFS یک جایگزین ساده و کارآمد ارائه می دهد. این اجازه می دهد تا راه اندازی آسان، مقیاس پذیری و مقرون به صرفه، و آن را به انتخاب ایده آل برای این استقرار.
مهمترین زیبایی این رویکرد این است که کد شما در محیط ابری و محلی شما یکسان کار خواهد کرد – به عنوان بخش ماندگاری داده فقط است عملیات خواندن/نوشتن فایل ساده. بدون هیچ زحمتی برای راه اندازی پایگاه داده محلی.
یک الگوی پروژه برای برنامه Streamlit Stateful مقیاس پذیر
این یک ربات چت LLM مبتنی بر Amazon Bedrock است که تغییر مدل اولیه و بازنشانی مکالمه را ارائه می دهد. در پانل سمت چپ، میتوانید نام میزبان ECS Task که آخرین اجرای Streamlit شما را ارائه میکند، و همچنین شناسه جلسه خود را مشاهده کنید.
با مراجعه به اسکرین شات زیر از برنامه، می بینید که اگر دستورالعمل های من را در بخش آخر دنبال کنید:
من ابتدا مکالمه را در پنجره سمت چپ شروع کردم، یک پنجره جدید را شروع کردم (در حالی که کلید جلسه در فضای ذخیره سازی محلی باقی می ماند)، با بازیابی مکالمه خود مدیریت کردم در حالی که اجرای Streamlit توسط ECS Task دیگری انجام شد که توسط نام میزبان در پانل سمت چپ پیشنهاد شده است. .
کد شبه اسکریپت پایتون Streamlit
در اینجا یک شبه کد ساده شده از اسکریپت پایتون است که در برنامه Streamlit برای مدیریت داده های جلسه استفاده می شود:
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
دیکشنری محلی singleton برای ذخیره داده های جلسه استفاده می شود. - الف
session_id
از حافظه محلی تولید یا بازیابی می شود. - داده های جلسه از فایل سیستم بر اساس بارگیری می شوند
session_id
در طول اولیه سازی اسکریپت، در حالی که داده های جلسه در انتهای اسکریپت به سیستم فایل ذخیره می شوند. - از آنجایی که EFS بر روی تمام گرههای ECS نصب میشود، دادههای جلسه در تمام نمونههای کار ECS به اشتراک گذاشته میشوند و در فعالیتهای مقیاسبندی زنده میمانند، حتی زمانی که یک ECS Task جداگانه برای ارائه جلسه Streamlit موجود شما استفاده میشود.
بومی Streamlit session_state
همانطور که هست در رویکرد من استفاده نمی شود در حافظه و در چندین گره ECS به اشتراک گذاشته نمی شود. تحت یک محیط مقیاسبندی خودکار، این امکان وجود دارد که هر کار ECS در نقطهای به هر جلسه کاربر سرویس داده باشد، در دسترس قرار دادن دادههای جلسه در حافظه میتواند منجر به ناسازگاری دادهها و همچنین فرسودگی حافظه شود. رویکرد فعلی فقط نیاز به ذخیره کلید جلسه در حافظه دارد که مقدار ناچیزی از داده است.
آن را برای سازمان خود مستقر کنید
برای استقرار این چت ربات Streamlit مقیاس پذیر و حالت پذیر در AWS، این مراحل را دنبال کنید:
- کلون کردن مخزن من: با شبیه سازی مخزن من شروع کنید: https://github.com/gabrielkoo/scalable-stateful-streamlit-chatbot-on-aws/tree/main در دستگاه محلی خود.
-
استقرار پشته CloudFormation: استفاده کنید
template.yml
فایل برای استقرار زیرساخت AWS لازم. توصیه می شود از کنسول مدیریت AWS برای راه اندازی بصری استفاده کنید. -
ساخت و استقرار تصویر داکر: اجرا کنید
./deployment.sh
به:
- تصویر داکر را بسازید
- آن را به Amazon Elastic Container Registry (ECR) فشار دهید
- خدمات ECS را با تصویر جدید افزایش می دهد
- دسترسی به چت بات: پس از استقرار، از طریق URL ارائه شده توسط Application Load Balancer (ALB) یا از طریق URL CloudFront برای عملکرد بیشتر و پشتیبانی از HTTPS به چت بات دسترسی پیدا کنید.
- فعال کردن مقیاس خودکار: برای اینکه واقعاً از مقیاسپذیری این تنظیم استفاده کنید، مقیاس خودکار را برای سرویس ECS پیکربندی کنید. این مرحله تضمین می کند که برنامه شما می تواند بارهای مختلف را به طور موثر مدیریت کند.
توجه: مخزن من مرحله 5 را پوشش نمی دهد.
با دنبال کردن این مراحل، می توانید a را مستقر کنید نرم افزار Streamlit قوی، مقیاس پذیر و حالت دار در AWS، تجربه کاربری بدون درز را حتی در زیر بار سنگین تضمین می کند. این رویکرد همچنین یک راه حل مقرون به صرفه و کارآمد برای استقرار برنامه های Streamlit در یک محیط تولید ارائه می دهد، در مقایسه با روش بدون مغز “فقط ماشین مجازی خود را دو برابر کنید”.
مهمتر از آن، میتوانید روی ساخت برنامههای GenAI عالی با Streamlit به صورت محلی تمرکز کنید و فقط آن را بدون سردرد در AWS مقیاس کنید!