استقرار یک مدل ML در Paperspace و ایجاد یک API

زمینه
من فکر میکردم که استقرار یک مدل و قابل دسترس کردن آن از طریق یک API به چندین مرحله پیچیده و سطح ترسناکی از دانش ML و DevOps نیاز دارد. اما وقتی فرآیند تبدیل ردیاب تصویر اسباببازی کوچکم را به یک API انجام دادم، از اینکه چقدر اجزای کمی در آن دخیل بودند متعجب شدم.
بنابراین فکر کردم که در صورتی که به شما در شروع کار کمک کند، سریع بنویسم و به اشتراک بگذارم. حداقل، به شما حسی از قطعات مختلف مورد نیاز برای دسترسی به یک مدل از طریق API می دهد.
هدف
شما یک مدل دارید که قبلاً آموزش دیده و دقیق تنظیم شده است و اکنون می خواهید از آن برای ایجاد یک API استنتاج استفاده کنید (به این معنی که نوعی پیش بینی را برمی گرداند).
پیش نیازها
- مدل: مدل شما آموزش دیده، صادر شده، (ترجیحا به صورت محلی تست شده) و آماده استفاده است.
- دانش پایه از پایتون.
بررسی اجمالی
- اسکریپت پایتون را برای رابط با مدل خود بنویسید (این قسمت API است)
- راه اندازی دستگاه Paperspace
- اسکریپت پایتون و مدل صادراتی خود را در دستگاه Paperspace خود کپی کنید
- اسکریپت پایتون خود را بر روی دستگاه Paperspace خود اجرا کنید (این نقطه پایانی API را نشان می دهد)
- API خود را تست کنید
مراحل
اسکریپت پایتون:
شما باید یک اسکریپت ایجاد کنید که نحوه استفاده از مدل خود را توضیح دهد. این ایده خوبی است که این اسکریپت را به صورت محلی تست کنید و قبل از استقرار مطمئن شوید که کار می کند. که عیب یابی را آسان تر می کند.
این اسکریپت به چند جزء نیاز دارد:
1. راه اندازی: پس از وارد کردن دسته ای از متدها و کتابخانه های مورد نیاز ما (برای مشاهده اسکریپت های من با تمام وارد کردن های من به اصل مطلب مراجعه کنید)، به چند خط کد نیاز داریم تا:
- Starlette را راهاندازی کنید، ابزاری که از آن برای ایجاد درخواستهای ناهمگام استفاده میکنیم
- مدل خود را بارگیری کنید – من استفاده می کنم
load_learner
از کتابخانه FastAI برای بارگذاری مدل من همانطور که به من داده شده است. عملکرد شما ممکن است بسته به نحوه ساخت مدل خود متفاوت باشد.
app = Starlette()
app.add_middleware(CORSMiddleware, allow_origins=['*'], allow_headers=['X-Requested-With', 'Content-Type'])
# Our model is our 'export.pkl' file which will be located in the same directory
learn = load_learner('export.pkl')
2. مسیرها را ایجاد کنید: برای API خود به مسیرهایی نیاز داریم. برای سادهتر کردن کارها، میخواهیم مسیری را تعریف کنیم که در آن میتوانیم درخواست POST را با اطلاعاتی دریافت کنیم.
@app.route('/analyze', methods=['POST'])
مثال من یک آشکارساز تصویر است، بنابراین اطلاعاتی که دریافت خواهد کرد پیوندی به یک تصویر است. در ادامه بیشتر در مورد آن
3. نحوه پاسخگویی به درخواست POST خود را تعیین کنید: بعد، باید به آن بگوییم که با این درخواست چه کار کند.
ما یک روش تجزیه و تحلیل ایجاد خواهیم کرد که دادههایی را که به آن میدهیم دستکاری میکند و پیشبینی را در مدل خود فراخوانی میکند تا یک پیشبینی به ما بدهد.
توجه: آنچه در این روش تجزیه و تحلیل اتفاق می افتد بستگی به این دارد که مدل شما چه کاری انجام می دهد و چه پیش بینی هایی را برمی گرداند. از آنجایی که مثال من یک آشکارساز تصویر است، میخواهم پیوندی به یک تصویر برای آن بفرستم و پیشبینی کنم که تصویر در چه دستهای قرار میگیرد.
برای استفاده از آشکارساز تصویر، ابتدا باید چند کار را روی تصویر انجام دهم، یعنی آن را به یک شی تبدیل کنم که بتوانم با پیش بینی از آن استفاده کنم. من از پیش بینی استفاده می کنم زیرا این روشی است که FastAI برای پیش بینی به من می دهد. بسته به مدل شما، روش های شما ممکن است متفاوت باشد.
یه بار زنگ میزنم predict
، من می خواهم آن نتیجه را بگیرم و آن را به JSON تبدیل کنم تا به عنوان پاسخ ارسال شود. پاسخ من به من دسته بندی تصویر را می دهد. این چیزی است که آخرین خط من است analyze
عملکرد انجام می دهد.
async def analyze(request):
img_data = await request.form()
img = Image.open(requests.get(img_data['file'], stream=True, timeout = 10).raw)
pil_img = PILImage.create(img)
prediction = learn.predict(pil_img)[0]
return JSONResponse({'result': str(prediction)})
4. فایل سرویس: در نهایت، باید روشی را فراخوانی کنم تا واقعاً این فایل را ارائه کند و آن را به صورت آنلاین در دسترس قرار دهد.
if __name__ == '__main__':
if 'serve' in sys.argv:
uvicorn.run(app=app, host="0.0.0.0", port=5500, log_level="info")
تنظیم Paperspace:
در مرحله بعد، ما همه چیز را روی سروری با استفاده از Paperspace که میزبان API شما خواهد بود، تنظیم می کنیم.
این بدان معناست که در Paperspace:
- یک ماشین ایجاد کنید
- هر وابستگی مورد نیاز API خود را روی آن دستگاه نصب کنید
- اسکریپت پایتون خود را روی آن ماشین میزبانی کنید
- مدل خود را روی آن دستگاه میزبانی کنید
بیایید با راه اندازی دستگاه خود شروع کنیم.
- کلیک *“یک ماشین ایجاد کنید.” *
- این 3 گزینه (از می 2023) در اختیار شما قرار می دهد: ML-in-a-Box، اوبونتو و ویندوز. بیایید همه چیز را ساده نگه داریم و اوبونتو را انتخاب کنیم.
- “نوع ماشین” خود را انتخاب کنید. شما گزینه های GPU، Multi-GPU و CPU را خواهید داشت. برای مدل اسباببازی کوچک ما، احتمالاً نیازی به برق GPU ندارید. اگر مدل را به صورت محلی روی دستگاه خود آزمایش کرده و اجرا کرده اید، احتمالاً به مشخصات قدرتمندتر از آنچه قبلاً دارید نیاز نخواهید داشت. بنابراین من با C5 رفتم که با 4 CPU و 8 گیگابایت RAM عرضه می شود.
- کلیک “ايجاد كردن“
- صبر کن. Paperspace باید نشان دهد که دستگاه شما را “تامین” می کند و آن را برای شما آماده می کند.
- پس از آماده شدن، روی “کلیک کنید”اتصال“و به شما دستوری می دهد که ssh را به دستگاه خود وارد کنید.
- اکنون لاگین خود را تنظیم کنید بنابراین می توانید از ترمینال محلی خود به دستگاه خود دسترسی داشته باشید. می توانید از SSH یا رمز عبور استفاده کنید. هنگامی که نحوه ورود به سیستم را تنظیم کردید، وارد می شوید!
میزبانی فایل های خود در دستگاه Paperspace
**1.نصب وابستگی ها: **قبل از نصب وابستگی ها، باید اجرا کنید sudo apt update
. سپس شما باید اجرا کنید sudo apt install python3-pip
برای نصب پیپ سپس باید آماده نصب وابستگی ها باشید.
هر وابستگی لازم را با اجرا نصب کنید pip install [DEPENDENCIES]
در ترمینال شما من برای خودم به موارد زیر نیاز داشتم: pip install aiohttp asyncio uvicorn fastai starlette timm
2. اسکریپت پایتون: من متوجه شدم که ساده ترین کار این است که فقط vim را در دستگاه Paperspace خود باز کنید و محتویات اسکریپت خود را کپی و پیست کنید. شما همچنین می توانید از دستور scp استفاده کنید که در زیر برای مدل خود استفاده می کنم.
3. مدل: یک راه متفاوت برای کپی کردن یک فایل استفاده از دستور scp است. در اینجا به نظر می رسد: scp [PATH OF FILE YOU'RE COPYING] paperspace@[PAPERSPACE MACHINE IP ADDRESS]:/home/paperspace/
. سپس دستورات موجود در ترمینال خود را دنبال کنید.
API خود را اجرا کنید
اکنون آماده اجرای API خود هستید.
- در ترمینال خود وارد کنید
python3 [FILENAME OF YOUR PYTHON SCRIPT] serve
برای اجرای اسکریپت و افشای نقطه پایانی API شما.
API خود را تست کنید
- استفاده کنید
curl
برای تست API خود از آنجایی که من تشخیص تصویر را انجام می دهم، به عنوان بخشی از درخواست POST خود پیوندی به یک تصویر ارسال می کنم. این چیزی است که من در ترمینال خود وارد کردم:curl -k -X POST -d "[IMAGE LINK]" https://[PAPERSPACE IP ADDRESS]:[PORT FROM PYTHON SCRIPT]/[API ROUTE FROM PYTHON SCRIPT]
اگر همه چیز به خوبی کار می کند، باید پاسخ JSON را با پیش بینی خود همانطور که توسط اسکریپت پایتون مشخص شده است، دریافت کنید. موفق باشید!