آپلود مدل

به طور کلی دو روش برای آپلود مدل در بازارچه هوش مصنوعی ماتریکس وجود دارد

  1. استفاده از کیت توسعه نرم افزار ماتریکس (Matrix SDK)
  2. استفاده از API

کیت توسعه نرم افزار (SDK) چیست؟

در ابتدا به تفاوت بین مفهوم و کاربرد API و SDK میپردازیم تا هدف نهایی Matrix SDK مشخص شود. همانطوری که میدانید API مخفف Application Programming Interface میباشد و ابزاری است که ارتباط بین اپلیکیشن های مختلف را با استفاده از سرویس های مختلفش امکان پذیر میکند. برای مثال یک برنامه اندروید با درخواست پردازش به API ماتریکس و بدون هیچ دانشی از مدل های موجود در ماتریکس می تواند داده خود را پردازش کند.

از طرفی دیگر (Software Development Kit (SDK مجموعه ای از ابزارها، مثالها و قطعه کدهایی برای توسعه دهندگان است که بر روی یک یا چند API ساخته می شود تا توسعه دهندگان پیاده سازی و استفاده از API را از ابتدا شروع نکنند. SDK ماتریس را می توان به سه بخش تقسیم کرد.

۱- پایپ لاین ماتریکس 

بخش اول پایپ لاین ماتریکس است که منحصرا برای ساده کردن کار توسعه دهندگان هوش مصنوعی که می خواهند مدلهای خود را در ماتریس قرار دهند ساخته شده است. در این بخش توسعه دهنده هوش مصنوعی میتواند کد اجرای مدل خود را توسط SDK ماتریکس با اجرای دستورات مناسب داخل سیستم ماتریکس آپلود کرده، مدل خود را تست کند و در صورتی که مدل خطا نداشته باشد API استفاده از مدل را داخل سیستم ماتریکس ایجاد کند. 

۲- کانفیگ پروژه

این بخش برای مدیریت پروژه توسعه دهندگان هوش مصنوعی ایجاد شده است تا بتوانند پروژه خود را به بهترین شکل بر روی سیستم ماتریکس مستقر و ارائه کنند. در این بخش در صورتی که توسعه دهنده هوش مصنوعی با کدنویسی پایتون آشنایی خوبی داشته باشد میتواند پروژه خود را در قالب مشخص شده به طور دلخواه تنظیم و کدنویسی کند اما به جهت سهولت کار توسعه دهندگان، پایپ لاین ماتریکس با پشتیبانی از کتابخانه های معروف هوش مصنوعی پایتون (مانند pytorch و tensorflow) در دسترس توسعه دهندگان قرار گرفته است.

۳- کیت ارتباط با API

این بخش مختص اجرای مدل های هوش مصنوعی است. هدف از این بخش، استفاده از کدهای از پیش نوشته شده برای اجرا و استفاده از API مدل های ماتریکس است. در کیت ارتباط با API تمامی اند پوینت ها و بخش های API پوشش داده شده و تنها با استفاده از صدا زدن چند متد ساده می توانید مدل های ماتریکس را بر روی نرم افزار خود اجرا کنید. 

آپلود مدل توسط SDK

مرحله اول: نصب SDK

جهت نصب کیت توسعه ماتریکس ابتدا باید یک محیط مجازی پایتون (Virtual Environment) داخل سیستم خود بسازید. اگر از آناکوندا برای مدیریت پکیج های خود استفاده میکنید نیازی به ساخت محیط مجازی نیست. اگر با محیط مجازی آشنایی ندارید می توانید آموزش ساخت محیط مجازی را مشاهده کنید.

پس از مشخص شدن Interpreter پایتون، دستور زیر را جهت نصب SDK داخل ترمینال پایتون خود وارد کنید:

pip install matrix-sdk

پس از اجرای این دستور تمامی پکیج های مورد نیاز برای استفاده از کیت ماتریکس نصب خواهند شد. 

جهت حذف پکیج ماتریکس نیز می توانید از دستور زیر استفاده کنید:

pip uninstall matrix

مرحله دوم: ساخت پروژه

پس از نصب ماتریکس و در حالی که محیط مجازی فعال است، با استفاده از دستور matrix-admin --startproject می توانید ساختار کلی پروژه و یا پایپ لاین ماتریکس را فراخوانی کنید. 

پس از وارد کردن این دستور ، باید نام پروژه خود را وارد کنید. این نام همان نامی است که پس از آپلود پروژه داخل سیستم ماتریکس، جهت استفاده از API مدل مورد استفاده قرار می گیرد.

(.venv) matrix:/$ matrix-admin --startproject
Enter a name for your project:

مرحله ی بعد تعیین نوع پروژه است. هر توسعه دهنده دو انتخاب برای شروع پروژه خود دارد، انتخاب اول استفاده از پایپالین از پیش ساخته شده است که مزیت های آن بررسی خواهد شد و انتخاب دوم نیز استفاده از یک ساختار دلخواه در چهارچوب تعیین شده است که آزادی عمل بیشتری به برنامه نویس می دهد ولی میزان کدنویسی را نیز افزایش میدهد.

در صورتی که Yes یا y وارد شود پروژه ای با پایپالین پیش فرض ساخته می شود و در غیر این صورت اگر  No یا n وارد شود پروژه با ساختار دلخواه ولی در چهارچوب خاصی برای شما ایجاد می شود. توجه شود که حالت پایپالین کدنویسی کمتری خواهد داشت.

You want to setup a Pipeline-based project(Enter yes/y) or a custom project(Enter No/n)? 

در قسمت بعد باید نوع فریمورک مورد نظر خود  را تعیین کنید، این بخش مشخص می کند که فایل های docker و requirements.txt چگونه باید تنظیم شوند. انتخاب ها شامل pt برای pytorch ، tf برای tensorflow و oth برای دیگر فریمورک ها مثل sklearn است.

پس از وارد کردن نوع فریمورک، پروژه شما در پوشه ای با نامی که در قسمت اول وارد کردید ساخته می شود. ساختار فایل های پروژه به این صورت است:

├── Dockerfile
├── __init__.py
├── main.py
├── manage.py
├── models
│   └── model.py
├── requirements.txt
├── samples
│   ├── input1.txt
│   └── matrix.jpg
├── settings.py
├── utils
│   ├── conf.yaml
│   └── pipeline.py
└── weights

مرحله سوم: آماده سازی فایل های مدل

پس از لود شدن فایل های اصلی پروژه، باید مدل مد نظر خود را در قالب این پروژه آماده کنید. اگر فایل وزن های مدل شما در دسترس است، در مرحله اول وزن های مدل آموزش دیده را داخل پوشه weights قرار دهید. 

به طول کلی فایل های حجیم و سنگین پروژه باید داخل پوشه weights قرار بگیرند. این پوشه داخل سیستم ماتریکس طوری طراحی شده است که فایل های حجیم را با سرعت بالا لود کند. 

پس از  قرار دادن وزن ها و ملزومات خود داخل پوشه weights باید نحوه فراخوانی مدل را تعریف کنید. برای این منظور باید تابع load_model موجود در مسیر /utils/pipeline.py را تکمیل کنید. این تابع، تنظیمات موجود داخل فایل utils/conf.yaml را به عنوان ورودی دریافت کرده و مدل لود شده را به عنوان خروجی ارسال میکند. 

پس از تعیین نحوه لود مدل، ورودی های خود را داخل پوشه /samples قرار دهید. سپس نوع ورودی های خود را داخل آرایه INPUT_TYPES موجود در فایل settings.py به این صورت مشخص کنید:

# OPTIONS: ["text", "image", "video", "audio", "json", "pdf", "generic"]
INPUT_TYPES = ["text", ]

پس از مشخص کردن ورودی ها، جهت ارتباط با ‌API ماتریکس باید از طریق وبسایت یک API Token دریافت کنید و آن را در فایل envدر متغیر MATRIX_TOKEN  قرار دهید که امکان ارتباط با سرور ماتریس برای شما برقرار شود.

به صورت کلی هنگام دریافت هرگونه درخواست برای اجرای مدل شما از طرف کاربر این روند طی می شود:

ابتدا فایلهای کاربر در پوشه dir_input قرار داده می شوند. در صورتی که فایل text باشد نیز  در فایل txt قرار داده می شود. سپس دستور اجرای main داده می شود و در نهایت انتظار می رود شما نتیجه پردازش هرچه که باشد را در پوشه dir_output نوشته باشید. توجه کنید حتی اگر خروجی شما text است باید آن را در فایل txt بنویسید.

main.py اسکریپت اصلی کل پروژه است و اسکریپتی است که به صورت اتوماتیک توسط agent ماتریس به هنگام درخواست برای مدل شما اجرا خواهد شد. نحوه اجرای آن نیز به صورت زیر خواهد بود:

python main.py --input_dir /path/to/input/dir \
               --output_dir /path/to/output/dir \
               --device device # Choices: cpu, gpu or an integer: gpu number \
               --framework framework # pt, tf, oth

در صورتی که هنگام ساخت پروژه از گزینه پایپ لاین استفاده کرده اید، نیازی به تغییر در main.py ندارید. ولی روند آن به صورت است که پس از لود مدل و تعیین نوع ورودی ها تابع auto_file_loader تمام فایلهای داخل input_dir را برای شما بارگذاری میکند و در قالب یک دیکشنری به پایپ لاین میدهد، این داده ها سپس مراحل پایپ لاین را که در بخش بعد توضیح داده شده اند طی می کند.

در حال حاضر  این نوع از داده ها به عنوان ورودی پشتیبانی شده اند:

a dictionary of shape {"type":list(), ...}
image -> list of cv2 numpy arrays
text -> list of strings
video -> list of cv2 capture objects
audio -> list of tuples -> (np array, sampling rate)
json -> list of dictionaries 

اگر نوع ورودی غیر از  موارد ذکر شده باشد مسیر absolute به فایل برگردانده می شود و شما باید در  preprocess خودتان آن فایل را لود کنید.

در صورتی که میخواهید خطاهای اجرا به هنگام درخواست برای api به شما گزارش شود، بخش Try Except در فایل main.py را تغییر ندهید. این خطاها توسط این exception دریافت خواهد شد و به شما ایمیل می شوند.

در صورتی که نوع پروژه custom باشد، شما باید نحوه اجرای مدل خود را در main.py تکمیل کنید. به یاد داشته باشید main.py اسکریپت نهایی است که توسط ماتریکس اجرا می شود. ساختار آن مشابه حالت پایپ لاین است با این تفاوت که دیگر پایپ لاینی در کار نیست و برنامه نویس باید بخش هایی که با TODO مشخص شده است را تکمیل کند.

مرحله چهارم: تنظیمات ایمیج و وابستگی های مدل

براساس نوع فریمورک انتخاب شده، برای پروژه شما یک Dockerfile ایجاد می شود و معمولا نیازی به تغییر آن نیست. ماتریکس از ایمیج 20.04 ubuntu به صورت بیس استفاده می کند ولی می توانید بر حسب نیاز آن را تغییر دهید ولی بیلد آن طولانی تر خواهد شد. داکرفایل به صورت پیش فرض آخرین ورژن هر فریمورک را نصب می کند ولی در صورتی که میخواهید ورژن دیگری نصب شود، آن را به صورت خاص در requirements.txt قرار دهید.

توجه: از سه کتابخانه matrix-sdk، omegaconf و python-dotenv جهت ساخت ایمیج شما استفاده می شود. این کتابخانه ها را از فایل requirements.txt حذف نکنید.

مرحله پنجم: تنظیمات کلی پروژه

داخل فایل settings.py عنوان فارسی پروژه خود را داخل متغیر TITLE مشخص کرده و اسم ایمیج پروژه را داخل متغیر DOCKER_TAG مشخص کنید. این تنظیمات برای ساخت مدل اجباری هستند. الباقی تنظیمات را بر حسب نیاز خود تکمیل کنید.

مرحله ششم: ساخت و تست مدل توسط manage.py

این اسکریپت وظیفه مدیریت و کمک به شما در تست پروژه را دارد. در صورتی که تست لوکال شما با این اسکریپت با موفقیت انجام شود، به احتمال بسیار زیاد مدل شما بر روی ریپازیتوری ماتریس نیز مشکلی نخواهد داشت. همچنین وطیفه دیگر این بخش کمک به شما برای آپلود مدل و تبدیل آن به api در ماتریس است. دستورات این اسکریپت برای شما توضیح داده خواهند شد.

۱- این دستور داکر ایمیج را برای پروژه شما میسازد:

python3 manage.py --build_local

۲- دستور زیر به صورت لوکال روی سیستم شما پروژه را تست می کند. روندی که طی می کند به صورت این صورت است که ابتدا فایلهای موجود در پوشه samples را لود می کند سپس Imageی که از پروژه شما در بخش ۱ ساخته شد را اجرا می کند. در صورتی که خطایی باشد آن را نمایش میدهد.

python3 manage.py --test_gpu 

۳- دستور زیر همان کار دستور ۲ را این بار بر روی cpu انجام می دهد. بهتر است هر دو بخش تست شوند.

python3 manage.py --test_cpu

۴- پس از عبور از تست های لوکال این دستور محتوای پوشه پروژه شما را بر روی ریپازیتوری ماتریس آپلود می کند. دستور زیر در صورت هرگونه بروز مشکلی پس از قطع آپلود، میتواند به آپلود ادامه دهد.

python3 manage.py --commit

۵- دستور زیر نیز پروژه شما را به یک api تبدیل میکند. در صورت خطا داشتین نیز خطا را برای شما ایمیل میکند. در صورت موفقیت نیز پیام موفقیت ایمیل می شود و در لیست repositoryها پابلیش می شود. از طریق ماتریس client میتوانید لیست تمام ریپازیتوری ها را ببنید.

python3 manage.py --build

۶- این دستور نیز ریپازیتوری و api مدلی با اسم تعیین شده در settings.py در متغیر DOCKER_TAG را حذف میکند.

python3 manage.py --delete