Screenshot-166

۷ عامل مهم در انتخاب یک کتابخانه مناسب برای یادگیری عمیق

 

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

آشنایی با کتابخانه‌های یادگیری عمیق پایتون

اما  اجازه دهید قبل از شروع بخش تجزیه و تحلیل،  با هر یک از آن‌ها به‌طور خلاصه آشنا شویم.

کتابخانه یادگیری عمیق کراس –  Keras

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

هدف این ابزار انجام آزمایش‌های سریع با استفاده از یادگیری عمیق است. این برنامه  که در 27 مارس 2015 توسط Francois Chollet توسعه یافته است، در واقع یک API برنامه نویسی سطح بالا است.

کتابخانه پای تورچ – Pytorch

PyTorch یک کتابخانه یادگیری ماشین اوپن سورس است که به زبان Python و C++ نوشته شده است و به عنوان یک برنامه منبع باز برای دانلود در دسترس عموم قرار دارد. گروه تحقیقاتی فیس بوک این فناوری را در اکتبر 2016 توسعه داد تا در برنامه هایی مانند پردازش زبان طبیعی، بینایی کامپیوتری و موارد دیگر مورد استفاده قرار گیرد. این برنامه در مقایسه با سایر همتایانش از لحاظ سطح بالا و سطح پایین،  جایی بین TensorFlow و Keras قرار می‌گیرد.

کتابخانه تنسورفلو –  TensorFlow

این کتابخانه که به راحتی با C++، جاوا و سایر زبان‌های کد یکپارچه می‌شود،  ابزار جامعی را برای توسعه دهندگان، شرکت‌ها و … برای ساخت برنامه های کاربردی مبتنی بر یادگیری ماشین فراهم می‌کند. در این کتابخانه ریاضی نمادین، مسائل مربوط به  یادگیری عمیق و یادگیری ماشین حل می‌شود. کتابخانه تنسورفلو که در 9 نوامبر 2015 توسط گوگل ایجاد شده است، در برنامه نویسی به عنوان یک API سطح پایین شناخته می‌شود.

بررسی عوامل تأثیرگذار بر انتخاب Framework یادگیری عمیق مناسب

1. معماری- Architecture

آموزش مدل‌های بزرگ و پیچیده فرایندی زمان بر است، بنابراین سرعت پردازش برای مدل‌های بزرگ و پیچیده کمتر خواهد بود. PyTorch در مقایسه با Keras، معماری پیچیده‌تری دارد که می‌تواند منجر به خوانایی کمتر شود. برندگان رقابت در این بخش TensorFlow و PyTorch بودند که هر دو فریمورک های شبیه سازی سطح پایین عملی هستند که  سرعت و زمان بالایی دارند.

2.سرعت- Speed

سرعت Keras بالاتر از حداقل نیست و سرعت این framework در مقایسه با سایر framework ها کندتر است. TensorFlow و Pytorch هر دو با حداکثر سرعت کار می‌کنند که به نوبه خود باعث نمایش عملکرد بالاتری می‌شود.

3- سطح API ها- Level of APIs

API های Keras اجازه دسترسی به Theano و CNTK را فراهم می‌کنند، بنابراین Keras را می‌توان در هر دو پلتفرم اجرا کرد. اما به دلیل API سطح پایین PyTorch، این کتابخانه تنها از آرایه Array) ) پشتیبانی می‌کند. با این‌حال اخیراً پای تورچ توجه زیادی را به خود جلب کرده است و به یک راه حل ترجیحی برای تحقیقات دانشگاهی و برنامه های یادگیری عمیق که نیاز به بهینه سازی بیان سفارشی دارند تبدیل شده است. TensorFlow علاوه بر ارائه API های سطح پایین، API های سطح بالا را نیز ارائه می‌دهد.

4. مبتدی دوست- Beginner-Friendly

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

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

5.دیباگینگ – Debugging

کارکردن با Keras معمولاً ساده است و حین کار با آن احتمالاً با هیچ مشکلی مواجه نخواهید شد. با این حال، از آنجایی که سطوح انتزاعی بسیار زیادی در بک‌اند دارد، دیباگینگ آن اغلب می‌تواند دشوار باشد. با Pytorch می‌توانید راحت‌تر از Keras یا TensorFlow دیباگینگ کنید. فرآیند دیباگینگ در TensorFlow نیز می‌تواند چالش برانگیز باشد.

6.روند محبوبیت- Trends Popularity

شبکه‌های عصبی مبتنی بر هسته شامل لایه‌های کانولوشنال و کاربردی به طور گسترده توسط Keras استفاده می‌شوند و Keras بیشتر در شرکت هایی مانند Nvidia، Uber، Amazon، Apple و Netflix استفاده می‌شود. استفاده داخلی از گوگل و هم نرم افزاری که برای ثبت تصاویر به طور خودکار از آن استفاده می‌کند، در معروفیت آن مؤثر بوده است.  تنسورفلو توسط گوگل، لینکدین، اسنپ، AMD، بلومبرگ، پی پال و کوالکام، بسیاری از شرکت‌های دیگر استفاده می‌شود.

Keras با ماژول NN، ماژول بهینه و ماژول autograd خود از برنامه های گرافیکی پرقدرت پشتیبانی می‌کند و تمایز خودکار آن در شبکه‌های یادگیری عمیق باعث محبوبیت آن شده است. از جمله شرکت‌های بزرگی که از Pytorch استفاده می‌کنند می‌توان به فیس‌بوک، ولز فارگو، Salesforce، Genentech، Microsoft و JPMorgan Chase اشاره کرد.

7.دیتا بیس-  DataSet

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

در حالی که اگرچه  TensorFlow و PyTorch فریمورک‌های سطح پایینی هستند، اما به دلیل سرعت بالایی که دارند می‌توانند با مجموعه داده‌های بزرگ به خوبی کار کنند. تسک هایی با کارایی بالا روی یک مجموعه داده با حجم بالا را می‌توان به خوبی با این ابزارها انجام داد.

نتیجه

ما برای مقایسه این 3 فریمورک، پارامترهای مختلفی را بررسی کردیم و شاهد این بودیم که مثلاً PyTorch کاربرپسند و ساده‌تر است یا TensorFlow به دلیل API ناکارا چندان راضی‌کننده به نظر نمی‌رسد. از طرف دیگر درست است که Keras و TensorFlow دیوارهایی دارند که از آجر و ملات ساخته شده‌اند، اما دهانه‌های کوچکی برای برقراری ارتباط باقی می‌گذارند، در حالی که PyTorch محکم به پایتون متصل است و می‌توانید آن را در بسیاری از پلتفرم‌های مختلف به کار بگیرید. 

آیا در یادگیری عمیق به GPU احتیاج داریم؟

به نظر می‌رسد در یادگیری عمیق همه استفاده از GPU را پیشنهاد می‌کنند، اما GPU چیست؟ می‌توان بدون آن یادگیری عمیق انجام داد؟ و اینکه دقیقا به درد چه کسی می‌خورد؟

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

اما GPU ها چه هستند؟ چه تفاوتی با CPU دارند؟ آیا من در پروژه های یادگیری عمیق خود به آن احتیاج دارم؟

اگر تا به حال این سوالات را از خود پرسیده اید، به خواندن ادامه دهید…..

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

یادگیری عمیق برای تداوم عملکرد به قدرت محاسبه بسیار زیادی نیاز دارد.

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

چرا برای یادگیری عمیق به سخت افزار بیشتر نیاز داریم؟

برای هرشبکه عصبی، فاز آموزش مدل یادگیری عمیق به منابع بسیاری نیاز دارد. در هنگام آموزش، شبکه‌ی عصبی داده‌ی ورودی را دریافت می‌کند، سپس در لایه‌های پنهان با استفاده از وزنه‌هایی که هنگام آموزش تنظیم شده‌اند پردازش می‌شوند و بعد یک پیش‌بینی بیرون می‌دهد. وزنه‌ها برای یافتن الگو‌ها تنظیم شده‌اند تا پیش‌بینی‌های بهتری انجام دهند. همه‌ی این عملیات‌ها اساسا ضرب ماتریس‌ها هستند. یک ضرب ماتریس ساده را می‌توان به کمک عکس زیر نمایش داد: در یک شبکه‌ی عصبی، (ما می‌توانیم) آرایه‌ی اول درونداد شبکه‌ی عصبی است در حالیکه آرایه‌ی دوم وزن آن را تشکیل می‌دهد.

آسان است، نه؟

بله، اگر شبکه‌ی عصبی شما حدودا 10,000 یا حتی 100,000 پارامتر داشته باشد. یک کامپیوتر همچنان می‌تواند این کار را در عرض چند دقیقه یا حداکثر چند ساعت انجام دهد. اما اگر شبکه‌ی عصبی شما بیش از 10 میلیارد پارامتر داشت چه؟ سال‌ها طول می‌کشد تا با استفاده از رویکرد سنتی این نوع سیستم‌ها را آموزش داد. کامپیوتر شما احتمالا پیش از آنکه به یک دهم راه رسیده باشید،‌ از کار می‌افتد.

به گفته‌ی یک دانشجوی دکترا در دانشگاه رایس: “یک شبکه‌ی عصبی که درون‌داد جستجوی را دریافت می‌کند و از 100 میلیون برون‌داد یا محصول پیش‌بینی می‌کند بطور معمول به 2,000 پارامتر برای هر محصول ختم می‌شود. پس اگر آن‌ها را ضرب کنید، اکنون لایه‌ی نهایی شبکه‌ی عصبی 200 میلیارد پارامتر خواهد داشت. و من کار پیچیده‌ای انجام نداده‌ام. من دارم در مورد یک مدل شبکه‌ی عصبی بسیار ساده صحبت می‌کنم.”

راهی برای آموزش سریع‌تر مدل‌های یادگیری عمیق

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

تفاوت عمده بین GPUها و CPUها این است که GPUها در مقایسه با CPUها به تناسب ترانزیستورهای بیشتری را به واحد‌های حساب و منطق و تعداد کمتری را به حافظه‌ی میانجی (caches) و کنترل جریان اختصاص می‌دهند. در حالیکه CPUها بیشتر برای مشکلاتی که به تجزیه یا تحلیل منطق پیچیده در کد نیاز دارند کاربردی است، GPU‌ها به منظور رندر کردن گرافیکی بازی‌های کامپیوتری طراحی شده‌اند که بعدها پیشرفت یافتند تا محاسبات هندسی دیگر را سرعت بخشند (بطور مثال، تبدیل کردن چندضلعی‌ها یا خطوط قائم دوار به سیستم‌ها‌ی مختصات مختلف مثل 3D). یک GPU کوچکتر از یک CPU است اما قادر است در مقایسه با CPU هسته‌های منطقی بیشتری داشته باشد (واحد‌های حساب و منطق یا ALUها، واحدهای کنترل و حافظه‌ی میانجی (caches)).

در نمودار بالا می‌توانید ببینید که GPUها (قرمز و سبز) می‌توانند بطور نظری 10 تا 15 برابر عمل‌های CPUها (آبی) را انجام دهند. این افزایش سرعت در عمل نیز تا حد زیادی قابل اعمال است. اگر CPU را مازراتی در نظر بگیرید، GPU را می‌توان به عنوان یک کامیون بزرگ در نظر گرفت.

CPU(مازراتی) می‌توانند مقادیر کمی از پکیج‌ها (3 تا 4 مسافر) را در RAM با سرعت جا به جا کند در حالیکه که یک GPU(کامیون) آهسته‌تر است اما می‌توانند مقادیر بیشتری از حافظه (حدودا 20 مسافر) را در یک نوبت جا به جا کند. این مفهوم در فیلم بطور مختصر بیان شده است:

چرا برای یادگیری عمیق GPUها را انتخاب کنیم؟

GPUها برای آموزش مدل‌های هوش مصنوعی و یادگیری عمیق بهینه‌سازی شده‌اند چرا که می‌توانند چندین محاسبه را بطور همزمان پردازش کنند. آنها تعداد زیادی هسته دارند که اجازه می‌دهد محاسبه‌ی چندین پردازش موازی بهتر صورت بپذیرد. بعلاوه، محاسبات در یادگیری عمیق با مقادیر بسیاری داده سر و کار دارند که باعث می‌شود پهنای باند حافظه‌ی GPU مناسب‌تر باشد. تعدادی پارامتر تعیین کننده برای معین کردن استفاده از CPU یا GPU برای آموزش مدل یادگیری عمیق وجود دارد:

پهنای باند حافظه

یکی از دلایل عمده که GPUها برای محاسبه سریع‌تر از CPU هستند،‌ پهنای باند می‌باشد. با وجود مجموعه داده‌های بزرگ، CPU حافظه‌ی زیادی را هنگام آموزش مدل اشغال می‌کند. محاسبه‌ی کارهای بزرگ و پیچیده تعداد زیادی چرخه‌ی ساعت در CPU را در برمی‌گیرد _ CPU کارها را به ترتیب انجام می‌دهد و نسبت به همتای خود یعنی GPU هسته‌های کمتری دارد. از سوی دیگر، ‌GPU مستقل دارای حافظه‌ی اختصاصی VRAM (Video RAM) است. بنابراین حافظه‌ی CPU می‌تواند برای انجام کارهای دیگر به کار رود.

اندازه‌ی مجموعه داده

آموزش یک مدل در یادگیری عمیق نیازمند مجموعه‌ داده‌ی بزرگی است، از این رو از لحاظ حافظه عملیات‌های محاسباتی بسیاری را در بر دارد. هر چقدر که محاسبات بیشتر باشد، مزیت GPU نسبت به CPU بیشتر احساس می‌شود.

بهینه‌سازی

بهینه‌سازی کارها در CPU بسیار آسان‌تر است. هسته‌های CPU کمتر اما قدرتمندتر از هزاران هسته‌ی GPU هستند. هر هسته‌ی CPU می‌تواند روی دستورالعمل‌های مختلف (معماری MIMD) کار کند، در حالیکه هسته‌های GPU که عموما در در بلوک‌های 32هسته‌ای مرتب شده‌اند، دستورالعمل‌های مشابه‌ را در یک زمان مشخص بصورت موازی انجام می‌دهد (معماری SIMD). این موازی سازی در شبکه‌های عصبی متراکم با توجه به زحمتی که در بر دارند، بسیار مشکل است. از این رو، اجرای تکنیک‌های بهینه‌سازی پیچیده در GPU در مقایسه با CPU دشوارتر است.

آیا باید از GPU استفاده کنم؟

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

            1. اگر شبکه‌ی عصبی شما تا حدودی در ابعاد کوچک باشد، می‌توانید آن را بدون GPU انجام دهید.

            2. اگر شبکه‌ی عصبی شما محاسبات زیادی را شامل صدها هزار پارامتر در بربگیرد، ممکن است بخواهید سرمایه‌گذاری نسبت به GPU را در نظر بگیرید.

طبق یک قاعده‌ی کلی، GPUها برای یادگیری ماشین امن‌تر هستند چون در باطن مدل در حال آموزش علم داده شامل محاسبات ماتریسی ساده است و اگر این محاسبات بصورت موازی انجام شوند، سرعت هر یک ممکن است به میزان زیادی بهبود پیدا کند.

نمونه‌های GPUی ابری

باید GPUهای ابری را نیز در نظر داشته باشید. اگر نمی‌خواهید تعدادی GPUی گران قیمت بخرید، می‌توانید در صورت تقاضا از GPUهای کمپانی‌هایی با فضای ابری استفاده کنید. در این صورت می‌توانید در هزینه‌‌های تهیه‌ی سخت‌افزار صرفه جویی کرده و از همه بهتر اینکه چندان گران قیمت نیستند، هزینه‌ها می‌تواند کمتر از 0.25 دلار برای هر ساعت استفاده از آنها باشد. زمانی که کارتان تمام شد، یادتان باشد که نمونه‌ی ابری خود را ببندید.

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

CPUها برای محاسبات واحد و پیچیده‌تر بصورت ترتیبی عالی هستند،‌ در حالیکه GPUها در انجام تعداد زیادی محاسبه‌ی ساده بصورت موازی بهتر عمل می‌کنند. نمونه‌های محاسبه‌ی GPU عموما دو تا سه برابر هزینه‌ی نمونه‌های محاسبه‌ی CPU می‌باشید، بنابراین پیشنهاد می‌کنم از CPUها استفاده کنید،‌ مگر اینکه در آموزش مدل‌های مبتنی بر GPUی خود عملکرد دو تا سه برابری مشاهده کنید.

حرف اخر

ما در مقاله قبل فهمیدیم GPU چیست و این مقاله ما را بیشتر با دنیای جذاب GPU آشنا کرد.و به عنوان محصولی جدید اهمیت بالایی در استفاده ما دارد