ویرگول
ورودثبت نام
سهیل کوهی
سهیل کوهی
خواندن ۱۲ دقیقه·۳ سال پیش

پروژه های اوپن سورس ماشین لرنینگ، کلید بهشت یا دروازه جهنم

فرض کنید به عنوان یه مهندس یادگیری ماشین موفق شدید با کلی تلاش و جلسات مختلف و سر و کله زدن با کارفرما‎ها، یه پروژه بگیرید که مربوط به تشخیص الفبای زبان اشاره از روی تصویره. کارفرما به شما میگه دیتای خاصی برای این کار نداره و از صفر تا صد پروژه رو باید خودتون انجام بدید. سخت شد نه؟


توی کورس های دانشگاهی یا آنلاین ماشین لرنینگ روند کار اینجوریه که یه سری دیتاست تر و تمیز بهمون میدن و ما هم به لطف Google Colab به یه سری GPU خوب دسترسی داریم و یکی از مدل های معروف مثل ResNet رو انتخاب میکنیم و باهاشون مدلمون رو ترین می‌کنیم. ولی وقتی این ماه عسل تموم میشه و وارد فضای کار می‌شیم، با این واقعیت تلخ روبرو می‌شیم که خیلی از پروژه‎‎‌های واقعی اینجوری نیستن. یعنی یا اصلا دیتایی موجود نیست یا میزان دیتای در دسترس خیلی کمه. البته این موضوع خیلی طبیعیه، چون هزینه گردآوری دیتا زیاده و پیچیدگی های خاص خودش رو داره، و عموما شرکت ها توی فاز اولیه صرفا دنبال اینن که ببینن ایدشون کار میکنه و ماشین لرنینگ می‌تونه راه‌حلی بهشون ارائه بده یا نه، و همچین هزینه هایی رو برای چیزی که ازش مطمئن نیستن نمیپردازن.

خب حالا توی این شرایط فرضی اولین راه حلی که به ذهن شما میرسه چیه؟ طبق چیزایی که توی دانشگاه و کورس های مختلف بهمون یاد دادن مهندس ماشین لرنینگ یا دیتا ساینتیست کسیه که نشسته صبح تا شب داره مدل ترین (train) میکنه، هایپرپارامتر‌ها (hyperparameters) رو دست کاری میکنه و کارای این تیپی تا به یه مدل خوب برسه. حالا ما که دیتا نداریم چیکار می‌کنیم؟ خب واضحه دیگه، میریم توی اینترنت سرچ میکنیم ببینیم دیتایی برای مسئله ما هست یا نه؟ خوشبختانه برای پروژه ای که گرفتیم یعنی تشخیص الفبای زبان اشاره یه سری دیتاست پیدا میکنیم که میشه ازش استفاده کرد. ایول! ولی یه لحظه صبر کنید، بیاید با هم یکم دقیق‌تر این فرآیند رو بشکافیم.

خب ما یه سری دیتاست پیدا کردیم. کار بعدی اینه که یه مدل پیدا کنیم که بشه این دیتا رو روش ترین (train) کرد. اونم کار زیاد سختی نیست (حداقل برای مسئله ما). هر کلسیفایر عمومی ای مثل ResNet یا VGG احتمالا مناسبه. حالا باید دیتاست‌ها رو طوری که مدل انتظار داره مرتب کنیم. مثلا یه سری مدل ها دیتا رو توی یه سری فولدر، که هر فولدر معرف یه کلاسه، میگیرن. یه سری دیگه نه، باید یه فایل تکست بهشون بدی که توش آدرس هر دیتا و لیبلش رو مشخص کرده باشیم. یا هزار مدل دیگه. حالا چالش بعدی یک دست کردن دیتاست های مختلفه. مثلا یه دیتاست عکساش سیاه سفیده، یه دیتاست دیگه رنگی. یا حتی یه دیتاست پیدا کردیم که جای عکس، ویدئو رو لیبل زدن. حالا با هزار بدبختی اینارو تبدیل به یه دیتاست تجمیع شده کردیم و بالاخره ترین رو شروع کردیم. کلی آزمایش باید بکنیم، هزار تا فرضیه رو تست بکنیم، تا به یه مدل نسبتا قابل قبول برسیم.

کافیه این پلن رو به کارفرما بگیم تا تمام موهای سر و تنش بریزه. حق هم داره، اون ما رو استخدام کرده تا مثلا توی نهایت یک ماه به یه راه حل اولیه برسیم ولی الان پلنی که ما داریم میذاریم جلوش سه یا چهار ماه کار تمام وقته.

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

پس چیکار باید بکنیم؟

شغلمون رو عوض کنیم؟

با مشتری سر و کله بزنیم؟

دست به خشونت بزنیم؟

هوش مصنوعی همه اش یه دروغه؟

نه یه لحظه صبر کنید!

تقریبا من میتونم با اطمینان زیاد بهتون بگم که درصد زیادی از مسئله هایی که به ما می‌سپرند، چه طبقه بندی باشه، Object detection باشه، Activity recognition باشه یا هر چیز دیگه ای، قبل از ما کلی آدم دیگه سعی کردند حل کنند و راه حل هاشون و مدل های ترین شده رو سخاوت‌مندانه با ما به اشتراک گذاشتند. کافیه برای هر موضوعی که بهش علاقمندید بریم توی گیتهاب یه سرچ بکنیم تا با دنیایی از پروژه ها و راه حل ها روبرو بشیم.

مثلا برای همین مثالمون، من رفتم توی گیتهاب عبارت "Sign Language Recognition" رو سرچ کردم. همونطوری که می‌بینید نزدیک 1000 تا پروژه هست که یا دقیقا مربوط به همین موضوعه، یا مرتبطه باهاش.

خب پس تا اینجا فهمیدیم که نیاز نیست چرخو دوباره اختراع کنیم، کارفرما رو دیوونه کنیم و خودمون رو از کار بی‌کار کنیم.

ولی سوالی که اینجا باز به وجود میاد اینه که خب از بین این هزار تا پروژه، کدومش مناسب کار منه؟


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

مطلبی که در بالا درباره راه حل پیشنهادی و قبول نکردن کارفرما گفتم یک تجربه واقعی از یکی از پروژه های قبلیم بود و مطالبی که در ادامه میخونید هم حاصل 4-5 سال سر و کله زدن من با پروژه های اوپن سورسه. جا داره اینجا بگم که همه این پیشنهادات صرفا از تجربیات شخصی من میاد و هیچ کدومش وحی مُنزل نیست.

کجا دنبال این پروژه ها بگردم؟

من سایت هایی که می‌تونید ازشون برای پیدا کردن پروژه های اوپن سورس استفاده کنید رو دو بخش میکنم:

  1. سایت هایی که فقط مدل های pretrained ارائه میدن (یا model zoo ها)
  2. سایت هایی که پروژه های کامل از کد گرفته تا مدل رو ارائه میدن

دسته اول چند تا سایت و سرویس خیلی خوب براشون هست که لیستش رو اینجا میارم:

  1. TensorFlow Hub
  2. Huggingface models
  3. modelzoo.co
سایت TensorFlow Hub
سایت TensorFlow Hub


توجه کنید که این سایت ها فقط یه سری مدل از پیش آموزش دیده (Pretrained) رو به همراه یه اسکریپت یا یه نوت بوک که بتونید مدل رو برای ورودی مورد نظر ران کنید در اختیار قرار میدن و برای تست های اولیه خوبن.

ولی اگه دنبال یه سری پروژه کامل هستید که کد های ترینینگ داشته باشن بهتره به سایت‌های دسته دوم سر بزنید:

  1. Papers with Code
  2. Hugging Face
  3. GitHub

من خودم برای هر پروژه اولین جایی که سر می‌زنم Papers with Code هستش. این سایت یه دسته بندی خیلی خیلی مفصل و جذاب داره و برای هر موضوعی یه سری جدول و نمودار ارائه میده که نشون میده هر مقاله چه دقتی رو داره و نسبت به بقیه رقبا چند مرده حلاجه. از طرف دیگه هم خود مقاله‌ها رو در اختیار قرار میده، و هم یه لیست از همه پیاده سازی های هر مقاله داخل گیتهاب.

سایت Papers with Code
سایت Papers with Code


خب تا اینجا فهمیدیم از چه منابعی میشه پروژه های ماشین لرنینگی رو پیدا کرد. حالا برگردیم به سوال اولمون چجوری بین 20-30 تا پروژه که مربوط به کار ماست بتونیم 2-3 تا رو انتخاب کنیم؟

معیار های اولیه

وقتی مثلا توی یه سایتی مثل گیتهاب یا Papers with Code دارید دنبال پروژه می‌گردید، خوبه که به چند تا نکته اولیه توجه کنید. اول اینکه اگه یه پروژه ای پیاده سازی یه مقاله است، خوبه که چکیده مقاله رو بخونید تا بفهمید چقدر راه حلی که ارائه میده به درد مسئله شما میخوره. مثلا توی همین مثال خودمون، یه سری ها روی تشخیص زبان اشاره از روی ویدئو کار میکنن، یه سری روی عکس های تکی. یا یه سری زبان اشاره یه کشور خاص رو روش کار کردن که ممکنه به کار شما نیاد. پس حتما توجه کنید که اون پروژه چه مسئله ای رو حل کرده و روی چه دیتایی کار کرده.

معیار بعدی جدید بودن مقاله است، البته این میتونه یه جاهایی نقض بشه ولی خب بر اساس یه قانون من درآوردی پروژه هایی که مال بیشتر از 3-4 سال قبل هستن احتمالا به کار نیان و پروژه های جدیدتر شانس بیشتری دارن که مسئله مارو بهتر و دقیق تر حل کنن.

معیار بعدی میتونه دقتی که مقاله ریپورت کرده باشه. اینجا Papers with Code خیلی به کمک ما میاد. توی این سایت یه سری جدول و نمودار هست که مقاله ها و پروژه های مختلف رو بنچ مارک کرده. اونجا خیلی راحت میتونید پروژه‌ها رو با هم مقایسه کنید.

بنچ مارک سایت Papers with Code  برای یکی از تسک های تشخیص زبان اشاره
بنچ مارک سایت Papers with Code برای یکی از تسک های تشخیص زبان اشاره


اقبال کامیونیتی

یه موضوع مهم دیگه اینه که از تجربه بقیه افراد برای انتخاب پروژه استفاده کنید. یعنی بعد از اینکه با معیار های قسمت قبل مثلا 7-8 تا پروژه رو انتخاب کردید برید توی صفحات گیتهاب اون پروژه ها و تعداد star ها، تعداد fork ها و تعداد pull request های پروژه ها رو با هم مقایسه کنید. اینها معیار های خوبی هستند که ببینید آدم های قبلی ای که از این پروژه ها استفاده کردن چقدر راضی بودن.

پاسخگو بودن گردانندگان پروژه

یه نکته خیلی مهم که ممکنه در نگاه اول به چشم نیاد اینه که چقدر گردانندگان اون پروژه نسبت به سوالات و مشکلاتی که کاربر‌ها بهش برمی‌خورند پاسخگو هستند. بررسی این مسئله دو چیز رو تضمین میکنه: اول اینکه فیدبک‌های کاربرها مورد توجه قرار گرفته و مشکلات احتمالی اولیه حل شده و دوم اینکه اگر شما هم در طول کار کردن با اون پروژه به مشکل یا سوالی بر بخورید میتونید امیدوار باشید که جوابتون رو میگیرید.

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

دسترسی به مدل pre-trained و کدهای training

دو تا چیز مهم هست که خوبه توی README پروژه دنبالش بگردید اول این که آیا مدل های آماده رو در دسترس قرار دادند یا نه؟ و بعد هم آیا کد برای ترین کردن مدل روی دیتاست های شخصی موجود هست یا نه؟ بودن این دو تا به شما کمک میکنه که هم بتونید بدون نیاز به ترین کردن و دسترسی به سخت افزار قوی صرفا مدل های از پیش ترین شده رو روی دیتای خودتون آزمایش کنید، تا ببینید اصلا این پروژه به درد شما میخوره یا نه، و همچنین با وجود کد های ترینینگ میتونید بعدا اگر خواستید با دست باز، این مدل رو روی دیتاست اختصاصی خودتون ترین کنید و یا هر تغییری که دوست داشتید رو اعمال کنید.

بررسی وجود مدل pretrained و کد training در یک پروژه
بررسی وجود مدل pretrained و کد training در یک پروژه

داکیومنتیشن کامل

موضوع بعدی که واقعا مهمه و اگه بهش توجه نکنید در طول کار کردن با پروژه خیلی اذیت می‌شید اینه که آیا این پروژه داکیومنتیشن خوبی داره یا نه؟

کافیه چند خط یا پاراگراف از README رو بخونید و ببینید باهاش ارتباط برقرار میکنید یا نه؟ آیا نحوه استفاده از همه بخش های پروژه واضح بیان شده یا نه؟

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

ساختن environment

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

حتما توی README دنبال پکیج های پیش نیاز پروژه بگردید. ببینید هر پکیج به همراه ورژن مورد نیازش قید شده یا نه. اگر پروژه فایل requirement.txt داشته باشه خیلی خوبه. ازون بهتر اگه پروژه Docker file داشت بدونید که شانس باهاتون یار بوده و بچسبید به اون پروژه و ولش نکنید.

لایسنس

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

یه سری لایسنس هستند که اگه اونارو دیدید با خیال راحت هر کاری خواستید با پروژه بکنید؛ مثل لایسنس Apache یا MIT. ولی یه سری لایسنس هستند که استفاده تجاری از اون پروژه رو بدون دریافت مجوز از صاحبان پروژه منع می‌کنند. در مجموع سعی کنید قبل از کار کردن با هر پروژه لایسنس اون پروژه رو مطالعه کنید و در جریان محدودیت های استفاده ازش قرار بگیرید و این موضوعات رو به کارفرماتون منتقل کنید.

نوع و فایل لایسنس در یک پروژه گیتهاب
نوع و فایل لایسنس در یک پروژه گیتهاب


و در آخر

نکته پایانی ای که خیلی وقت ها من رو اذیت کرده اینه که یه سری از پروژه هایی که از طریق دانشگاه ها تولید میشن خیلی از ملاحظات دنیای عملی رو رعایت نمی‌کنند. مثلا داکیومنت های مناسبی برای پروژه نمی‌نویسند، یا سوالات رو جواب نمیدند و باگ ها رو برطرف نمی‌کنند. واسه همین اگه یه مقاله خوندید که بهترین نتایج قرن رو گرفته بود، یا بدیع ترین ایده ها رو توش داشت فکر نکنید که این بهترین پروژه برای کار منه. توجه داشته باشید که خیلی از نکات عملی که در بالا گفتم می‌تونند خیلی خیلی مهم تر از دقتی باشند که یه مقاله گزارش کرده.

همیشه سعی کنیم وقتی کارمون با یک پروژه تموم شد، اگر ازش راضی بودیم حتما بریم به صفحه گیتهاب پروژه و بهش star بدیم. اگر ایمیلی از گردانندگان اون پروژه موجود بود، بهشون ایمیل بزنیم و تشکر کنیم و تجربه استفاده از پروژشون رو باهاشون در میون بذاریم. همچنین اگر باگی در پروژه پیدا کردیم و خودمون حل کردیم، و یا فیچری به پروژه اضافه کردیم اونو در قالب یه Pull Request برای پروژه ارسال کنیم تا بقیه هم از کار ما بهره‌مند بشن. این کارها باعث میشه فقط مصرف کننده نباشیم و خودمون هم در جهت بهبود پروژه ها گامی برداریم.

کلام پایانی

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

من توی این پست سعی کردم تجربیات خودم رو توی این حوزه باهاتون در میون بذارم. امیدوارم برای کسایی که دغدغشون بوده مفید بوده باشه. اگر دوست داشتید شما هم تجربیاتتون رو زیر این مطلب با من و دوستان در میون بذارید.

هوش مصنوعییادگیری ماشیناوپن سورس
علاقمند و فعال در حوزه هوش مصنوعی
شاید از این پست‌ها خوشتان بیاید