مقدمه
آیا از برنامهی جدید و یا اپلیکیشن خود که با استریملیت (Streamlit) نوشتهاید، هیجان زده هستید؟ برای مثال، آیا یک مدل یادگیری ماشین برای پیشنهاد فیلم (recommendation system) یا یک مصورسازی ساده برای نمایش الگوها از دادههای خود ساختهاید؟ هدف از ساختن اینگونه برنامهها به اشتراک گذاشتن آنها با دیگران و بهرهمند نمودن آنها از مزایای مثبت اینچنین اپهایی میباشد. در این مقاله، نحوهی استقرار یک برنامهی نوشته شده با استریملیت را با کمک کانتینرهای داکر بررسی خواهیم کرد.
مثال: شناسایی موجودیتهای نامدار
برای نشان دادن فرآیند کانتینرایز نمودن یک برنامهی استریملیت، مثالی ساده از تشخیص موجودیتهای نامدار (Named-entity recognition) که در ادامه آنرا با NER خطاب خواهیم نمود، در نظر خواهیم گرفت.
شناسایی موجودیتهای نامدار (Named-entity recognition) بخشی از استخراج اطلاعات است که موجودیتهای نامدار را در یک قطعه متن شناسایی میکند. سپس، نامها به دستهبندیهای از پیشتعریف شده مانند نام افراد، مکانها، سازمانها و دیگر دستهها تقسیم میشوند. در این مدل، ما از کتابخانه spaCy برای ایجاد یک مدل پردازش زبان طبیعی (NLP) ساده استفاده خواهیم کرد.
در شکل زیر ظاهر اپلیکیشن مطرح شده که قصد پیادهسازی آنرا داریم مشاهده خواهید نمود:
اسپیسی (spaCy) یک کتابخانه پیشرفته و منبع باز NLP است که به طور معمول در وظایف استخراج اطلاعات استفاده میشود. این کتابخانه یک مجموعه از قابلیتها مانند شناسایی موجودیتهای نامدار و برچسبگذاری اجزای گفتاری را ارائه میدهد که این دلایل، این کتابخانه را به عنوان یکی از ابزار محبوب در حوزهی NLP بین دانشمندان داده تبدیل کرده است.
در این دمو، ما از مدل آماری ‘en_core_web_sm’ در کتابخانهی اسپیسی استفاده خواهیم کرد که یک شبکه عصبی کانولوشنی (CNN) است که برای شناسایی اجزای زبان انگلیسی آموزش دیده شده است. اطلاعات بیشتر در مورد مدلهای آماری اسپیسی در مستندات spaCy قابل دسترس است.
داکر چیست؟
داکر (Docker) یک ابزار مدیریت ظروف (کانتینر) است که کد، تنظیمات و وابستگیهای هر برنامه را بستهبندی میکند. این یک روش برای استقرار برنامههای نوشته شده با استریملیت است.
چرا باید یک اپلیکیشن استریملیت را توسط داکر کانتینرایز کرد؟
فرض کنید شما یک غذای لذیذ اسپاگتی برای دوستانتان درست کردهاید. دوستان شما واقعن از این غذا لذت بردند و میخواهند آن را برای خودشان بازتولید کنند. راحتترین راه برای به اشتراک گذاشتن دستور پخت با چند نفر از دوستان شما نوشتن آن و ذخیره آن در یک پلتفرم قابل دسترس عمومی است. حال هر وقت یکی از دوستان شما میخواهد اسپاگتی شما را درست کند، میتواند به دستور پخت ذخیره شده در پلتفرم دسترسی پیدا کرده و اسپاگتی را برای خودشان بازتولید کنند.
از نظر برنامههای نرمافزاری، دستورپخت به تصویر داکر (Docker Image) و پلتفرم عمومی به Docker Hub (یا سایر ثبتکنندههای کانتینر مانند Google Cloud Platform یا Amazon Web Services) اشاره دارد. فرآیند به صورت زیر است:
نصب داکر
داکر دسکتاپ (Docker Desktop) یک رابط کاربری ساده و کاربرپسند برای شروع کار با داکر فراهم میکند. برای نصب این نرمافزار مراحل زیر را طی نمائید:
- با توجه به بحث تحریم برای کاربران ایرانی، ابتدا DNSهای شکن را برای خود طبق آموزشی که در صفحهی اصلی سایت شکن (یا هر مورد مشابه) است تنظیم نمائید و مطمئن شوید که کار بدرستی انجام شده. در خصوص شکن اگر کار را بدرستی انجام داده باشید پیام «تبریک! شما در حال استفاده از شکن هستید» در گوشهی سمت چپ و پائین سایت شکن باید قابل رویت باشد.
- به سایت داکر بروید و داکر دسکتاپ را دانلود و نصب نمائید.
- به داکر هاب بروید و یک اکانت برای خود بسازید.
- حال داکر دسکتاپ را در سیستم خود اجرا نموده و با اکانت ساخته شده لاگین کنید. البته با بالا آمدن داکر دسکتاپ فرایند بطور خودکار انجام خواهد شد. شما تنها تائیدهای لازم را بدهید.
ساختن یک داکرفایل
مرحله بعد ایجاد یک فایل ساده به نام “Dockerfile” است که به داکر میگوید چگونه یک تصویر (ایمیج یا دستورپخت) برای برنامه ایجاد کند. توجه بفرمائید که داکرفایل نباید پسوندی داشته باشد.
ار ادامه توضیح هر دستور در فایل Dockerfile که در بالا آمده است را خواهیم دید:
دستور FROM به Docker میگوید که یک لایهی پایه ایجاد کند. در این مورد، ما از تصویر Python v3.7 در داکر هاب به عنوان تصویر پایه استفاده کردهایم که بر روی آن برنامه ما ساخته خواهد شد.
دستور EXPOSE، شمارهی پورت در شبکه را مشخص میکند که برنامهی ما در آن اجرا خواهد شد. کتابخانهی استریملیت به خصوص با پورت 8501 سازگار است.
دستور WORKDIR، دایرکتوری کاری را در تصویر داکر تنظیم میکند. در این مورد، یک پوشه به نام “app” ایجاد میشود که تمام فایلها در آن ذخیره میشوند.
دستور COPY، فایل requirements.txt محلی را کپی میکند (که حاوی نام و نسخهی بستههای مورد نیاز برای برنامهی مدل و یا اپلیکیشن است) و آن را به پوشهی “app” در تصویر داکر منتقل میکند.
دستور RUN، دستورات خط فرمانی را که درون کانتینر داکر اجرا خواهد شد مشخص میکند. در این داکرفایل، تمام بستهها و وابستگیها از فایل requirements.txt نصب میشود و تعدادی دستور اضافی برای دانلود مدل “en_core_web_sm” از وب اضافه شده است.
دستور CMD، دستوراتی را که در هنگام شروع کانتینر داکر اجرا خواهد شد را مشخص میکند.
ایجاد یک داکر ایمیج
داکر دسکتاپ را باز نموده و از لاگین بودن اطمینان حاصل نمائید.
در رابط خط فرمان (CLI)، به داخل پوشهی پروژه بروید. در این مورد، پوشهی پروژه در پوشه “Documents” قرار دارد و دستور زیر را باید وارد کنید:
cd Documents/named_entity_recognition
**توجه: در داکر نام پوشهی پروژه باید به صورت حروف کوچک و با آندرلاین باشد. قبل از ساخت برنامه در مرحله بعد، حتمن از این موضوع اطمینان حاصل کنید.
با دستور زیر برای اپ NER خود یک داکر ایمیج بسازید:
docker build -f Dockerfile -t named_entity_recognition:latest .
- پرچم (فلگ) f- برای مشخص کردن نام داکرفایل برای ساخت تصویر استفاده میشود.
- پرچم t- برای نامگذاری و/یا برچسبگذاری تصویر استفاده میشود. در این مورد، ایمیج داکر با برچسب ‘latest’ برچسبگذاری میشود.
برای دیدن لیست کاملی از پرچمهای موجود برای دستور “build” در داکر، میتوانید به مستندات داکر مراجعه کنید.
نکته: نقطه در انتهای دستور باید وجود داشته باشد. این نشان میدهد که داکر برای ساخت تصویر (image) از فایلهای موجود در دایرکتوری فعلی استفاده کند.
بعد از ساخته شدن ایمیج، شما باید این تصویر را در داکر دسکتاپ خود نیز ببینید:
برای اطمینان از درست بودن ساخت تصویر، میتوانیم از طریق وارد کردن دستور زیر در خط فرمان (CLI)، برنامه را از داخل کانتینر داکر اجرا کنیم
docker run -p 8501:8501 named_entity_recognition:latest
- پرچم p- برای نگاشتن (map) پورت کانتینر به پورت میزبان (هاست) استفاده میشود. دقت کنید که استریملیت بهطور خاص بر روی پورت ۸۵۰۱ بهتر کار میکند.
برای دیدن لیست کاملی از پرچمهای موجود برای دستور docker run، میتوانید به مستندات داکر مراجعه کنید.
بعد از اجرای دستور فوق باید در قسمت ‘Containers/Apps’ تصویر زیر را مشاهده نمائید:
انتقال به داکرهاب
داکر هاب (Docker Hub) یک پلتفرم برای ذخیرهی تصاویر (ایمیج) کانتینرهاست که هر کسی در اینترنت (حداقل مخازن عمومی) میتواند به آنها دسترسی داشته باشد. داکرهاب در واقع بزرگترین مخزن تصاویر کانتینرها در جهان است.
اگرچه گزینههای زیادی برای ذخیرهی تصویر کانتینر وجود دارند (مانند AWS، GCP)، ما تصویر کانتینر خود را در داکرهاب ذخیره میکنیم تا هر کسی که نیاز دارد به آن دسترسی داشته باشد.
مراحل زیر چگونگی آپلود تصویر کانتینر محلی خود به داکرهاب را شرح میدهند:
1- به صفحه داکرهاب رفته و با اکانتی که ساختهاید لاگین کنید. حال مشابه با تصویر زیر یک ریپازیتوری جدید بسازید:
2- ایمیج محلی ساخته شدهی خود را به ریپازیتوری خالی تگ کنید
docker tag named_entity_recognition ishaterdal/streamlit_app_docker
3- ایمیج را به ریپازیتوری داخل داکرهاب پوش نمائید (انتقال از سیستم محلی به سیستم ابری)
docker push ishaterdal/streamlit_app_docker
نکته: اگر فرایند پوش (ارسال) برای شما انجام نشد، برای اولین بار یک تگ به اپلیکیشن خود اختصاص دهید. برای اینکار ابتدا بنویسید “Docker images” تا بدینوسیله تمامی ایمیجهای موجود در سیستم خود را ببینید. سپس از لیست ظاهر شده “Container ID” کانتینری را که قصد ارسال آنرا دارید بیابید. سپس کد زیر را اجرا کنید:
docker tag <container ID> YOUR_REPO_NAME:new_tag
کد فوق تگ “new_tag” را به این کانتینر تخصیص خواهد داد. حال مجدد کد زیر را که اینبار یک تگ به آن افزوده شده را اجرا نمائید
docker push ishaterdal/streamlit_app_docker:new_tag
و حالا داکرایمیج شما در داکر هاب به این صورت قابل دسترسی و مشاهده است
تست: بیرون کشیدن یک داکرایمیج
در این نقطه، برنامهی استریملیت در یک کانتینر داکر قرار گرفته است و تصویر آن در رجیستری داکرهاب ذخیره شده است تا هر فرد یا سازمانی بتواند به آن دسترسی پیدا کند. حال بیایید ببینیم چگونه اشخاص میتوانند تصویر را از رجیستری داکرهاب برداشته و با آن تعامل داشته باشند.
1- استخراج داکر ایمیج از داکرهاب (توجه بفرمائید که برای اینکار به 1.3 گیگ حجم اینترنتی نیاز خواهید داشت)
docker pull ishaterdal/streamlit_app_docker
2- حال کانتینر داکر را بطور محلی (روی سیستم خود) با نوشتن کد زیر اجرا کنید
docker run -p 8501:8501 ishaterdal/streamlit_app_docker
3- مرورگر خود را باز کنید و به پورت 8501 بروید، در واقع آدرس localhost:8501 را باز نمائید تا اپلیکیشن را مشاده نمائید.
4- تمام! از دنیای بینظیر داکر و استقرار وب-اپلیکیشنهای مختلف نهایت لذت و بهره را ببرید.
نکته: برای دیدن اینکه چگونه بطور مستقیم یک وب-اپلیکیشن استریملیت را در فضاهای ابری مستقر نمائیم، کافیست که این لیست پخش را که در آن یک پروژهی واقعی علم داده از صفر تا بکارگیری مدل در کلود انجام میگردد را مشاهده نمائید.
منبع:
Deploying a Streamlit App with Docker