آیا دیپ لرنینگ به کارت گرافیک احتیاج دارد؟

هر دیتا ساینتیست حداقل یکبار این جمله را شنیده که دیپ لرنینگ احتیاج به سخت افزار قوی‌ دارد. بعضی افراد مدل های دیپ لرنینگ را روی لپتاپ بدون کارت گرافیک خود آموزش می‌دهند که این کار می‌تواند روز ها به طول بینجامد.این باعث شده تا یک سری افسانه درباره دیپ لرنینگ ایجاد شود. افراد تازه کار فکر می‌کنند برای ورود به این حوزه، حتما باید یک کامپیوتر قدرتمند داشته باشند و بدون آن نمی‌توانند دیپ لرنینگ کار کنند.در این مطلب می‌خواهیم دلیل احتیاج دیپ لرنینگ به سخت افزار قوی را بررسی کنیم و ببینیم آیا همیشه برای آموزش یک مدل دیپ لرنینگ، به یک کامپیوتر قدرتمند احتیاج هست یا نه.در این مطلب خواهید خواند:۱- تعریف هادیپ لرنینگ چیست؟واحد پردازش گرافیکی به چه معناست؟۲- مقایسه کلی CPU و GPU۳-چرا دیپ لرنینگ احتیاج به سخت افزار قوی دارد؟۴- کارت گرافیک در دیپ لرنینگبرنامه نویسی برای کارت گرافیکمقایسه CPU و GPU در دیپ لرنینگ۵- آیا واقعا به کارت گرافیک در دیپ لرنینگ احتیاج دارم ؟تعریف هادیپ لرنینگ چیست؟دیپ لرنینگ یکی از بخش های هوش مصنوعی است که تلاش می‌کند طرز کار مغز انسان را در پردازش اطلاعات و تصمیم گیری شبیه سازی کند. با پیشرفت روزافزون تکنولوژی، روزانه حجم انبوهی از داده ها ایجاد می‌شوند. این داده را که کلان‌داده می‌نامند، در منابعی مانند شبکه های اجتماعی، موتور های جستجو، پلتفرم های تجارت الکترونیک،سایت های پخش فیلم و... تولید می‌شود. حجم این داده ها به قدری زیاد است که پردازش آن توسط مغز انسان دهه ها طول خواهد کشید. همزمان با پیشرفت روز افزون تکنولوژی، دیپ لرنینگ هم پیشرفت کرد تا بتوانیم با استفاده از آن، این حجم از داده را پردازش کنیم و اطلاعات به درد بخوری از آن استخراج کنیم.دیپ لرنینگواحد پردازش گرافیکی به چه معناست؟واحد پردازش گرافیکی ( Graphics Processing Unit ) که به اختصار GPU می‌گویند، برای رندرینگ گرافیک ساخته شده است. اما بخاطر عملکرد بسیار خوب و هزینه پایین آن، تبدیل به یک استاندار جدید در پردازش تصویر شده است. اگر در گوگل این کلمه را جستجو کنیم، با این تعریف روبرو خواهیم شد:واحد‌پردازش‌گرافیکی یک تراشه کامپیوتری است که محاسبات ریاضی را سریع و با هدف رندرینگ تصاویر انجام می‌دهدحوزه های کاربرد GPU ها عبارتند از: ترمیم تصویر ( Image Restoration )، تقسیم بندی تصویر ( Image Segmentation )، کاهش نویز تصویر ( Image De-noising )، بازسازی تصویر ( Image Reconstruction ) و فیلتر کردن ( Image Filtering ). وبلاگ انویدیا محاسبات GPU را چنین تعریف می‌کند:استفاده از GPU به همراه CPU برای افزایش سرعت در کار های علمی، تحلیلی، مهندسی، خرید و فروش و تجارتهمچنین عنوان می‌کند:اگر CPU مغز کامپیوتر باشد، GPU روح آن استواحد پردازش گرافیکی از هسته های متعدد و معماری محاسبات موازی تشکیل شده است. هر کدام از این هسته ها، از تعدادی واحد های عملگر مانند واحد محاسبه و منطق ( ALU ) تشکیل شده است. هر کدام از این هسته ها برای پردازش ریسمانی از دستورات استفاده می‌شوند. به این گروه از واحد های عملگر که به ریسمان کمک می‌کنند، عملگر های ریسمانی می‌گویند. تمام عملگر های ریسمانی در هسته GPU، یک مجموعه دستورات را اجرا می‌کنند چون واحد کنترل کننده آنها یکسان است. این به این معناست که GPU می‌تواند یک مجموعه دستورات را روی یک پیکسل عکس به صورت موازی اجرا کند. معماری های GPU پیچیده و بسته به سازنده آنها، متغیر هستند. دو شرکت اصلی سازنده GPU ها، Nvidia و AMD نام دارند. شرکت Nvidia عملگر های ریسمانی خود را CUDA (Compute Unified Device Architecture) و AMD آنها را SP (Stream Processors) نامگذاری کرده است.مقایسه کلی CPU و GPUدر اینجا سعی می‌کنیم اول با یک مثال این مقایسه را انجام دهیم و سپس یک مقایسه کلی بین عملکرد CPU و GPU انجام دهیم.فرض کنید CPU یک ماشین پرسرعت و قدرتمند و GPU یک کامیون بزرگ است که هر دو می‌خواهند کالا هایی را به یک مقصد برسانند. CPU که سریع است، می‌تواند تعداد کمی کالا را در مدت زمان کمی جابجا کند. در حالی‌که GPU می‌تواند تعداد بیشتری کالا جابجا کند اما سرعت کمتری دارد.پردازش در CPU بصورت متوالی و با استفاده از تعداد ریسمان کمی انجام شود ( منظور از متوالی این است که اول یک پردازش انجام می‌شود و سپس دیگری ). همچنین CPU تعداد هسته کمی دارد. این در حالی‌ است که GPU هسته های زیادی دارد و می‌تواند پردازش را با استفاده از هزاران ریسمان، بصورت موازی انجام دهد. تفاوت عملکرد CPU و GPUدر دیپ لرنینگ، کد های میزبان ( Host Code ) روی CPU و کد های CUDA روی GPU اجرا می‌شوند.انجام عملیات پیچیده مثل رندرینگ گرافیک سه بعدی و محاسبات برداری، توسط CPU به GPU سپرده می‌شود.اگرچه که CPU می‌تواند از پس عملیات پیچیده و طولانی بربیاید اما GPU ممکن است با مشکل گلوگاه شدن Bandwitdh مواجه شود. برای مثال انتقال تعداد زیادی از داده ها به GPU ممکن است طولانی باشد.در GPU ها Bandwidth بهینه سازی شده است و در CPU ها تاخیر ( زمان دسترسی به حافظه ) در قسمت های بعدی مطلب، به مقایسه این دو در دیپ لرنینگ خواهیم پرداخت.چرا دیپ لرنینگ احتیاج به سخت افزار قوی دارد؟در هر شبکه عصبی، آموزش مدل دیپ لرنینگ مرحله‌ای است که بیشترین احتیاج را به سخت افزار دارد.در هنگام آموزش، یک شبکه عصبی ورودی ها را می‌گیرد، آنها را در لایه های پنهان ( Hidden Layers ) پردازش می‌کند و یک سری وزن ( Weights ) به آنها نسبت می‌دهد و سپس، مدل یک پیش‌بینی انجام می‌دهد. وزن ها باعث می‌شوند تا الگو ها بهتر پیدا شوند و روند پیش‌بینی بهتر انجام شود.همه این کارها در واقع ضرب ماتریس هستند. در شکل زیر می‌توانید یک ضرب ماتریس را مشاهده کنید. در یک شبکه عصبی، ماتریس اول همان ورودی و ماتریس دوم وزن آن است.ضرب ماتریساگر شبکه عصبی شما چیزی بین ده هزار تا صد هزار پارامتر داشته باشد، کامپیوتر شما همچنان می‌تواند در چند دقیقه یا نهایتا چند ساعت محاسبات آن را انجام دهد. اما اگر میلیون ها پارامتر داشته باشد چطور؟ آنوقت شاید روز ها طول بکشد تا مدل شما آموزش ببینید.اینجاست که کارت گرافیک به کمک ما می‌آید. کارت گرافیک به ما کمک می‌کند تا محاسبات سریع‌تر انجام شوند.کارت گرافیک در دیپ لرنینگیک سوال بزرگ برای کسانی که در حوزه ماشین لرنینگ و دیپ لرنینگ کار می‌کنند این است که آیا به GPU احتیاج پیدا خواهند کرد یا نه. اگر تا به حال یک مدل ماشین لرنینگ یا دیپ لرنینگ را آموزش داده باشید، می‌دانید که GPU می‌تواند روند آموزش را از روز ها و ساعت ها به دقایق و ثانیه تبدیل کند. اما آیا واقعا به آن نیاز داریم؟ جواب کوتاه بله است. کارت های گرافیک برای آموزش مدل نیاز هستند و هیچ چیزی نمی‌تواند جایگزین آنها شود. اما این را بدانید که برای استفاده درست از آنها، باید طوری برنامه نویسی کنید تا بهترین استفاده از کارت گرافیک انجام شود و همه کتابخانه های برنامه نویسی برای این کار بهینه نیستند.برنامه نویسی برای کارت گرافیکبرنامه نویسی برای کارت گرافیک کار راحتی نیست. همانطور که گفتیم، فقط یک شرکت کارت گرافیک تولید نمی‌کند. دو تا از معروف ترین فریم ورک ها برای این نوع برنامه نویسی عبارتند از:فریم ورک CUDA: مخفف Compute Unified Device Architecture مختص شرکت Nvidiaفریم ورک OpenCL: در کارت های گرافیک دیگر شرکت ها مانند AMD استفاده می‌شودهمانطور که اشاره شد، CUDA را فقط در کارت های گرافیک شرکت Nvidia میتوان استفاده کرد در حالیکه OpenCL یک استاندارد برای محاسبات موازی روی دستگاه های مختلف مثل GPU، CPU و FPGA ها است.فریم ورک CUDA به زبان C نوشته شده است اما در پایتون می‌توان با استفاده از کتابخانه PyCuda و در جاوا از JCuda از آن استفاده کرد. اما یادگیری و برنامه‌نویسی در آنها کمی سخت است. همچنین باید بدانید که CUDA و واحد های سازنده آن مانند cuDNN و cuBLAS چگونه عمل می‌کنند.نمونه های آسان تری هم مانند Deeplearning4J و ND4J وجود دارند که از GPU استفاده می‌کنند. ND4J را می‌توان معادل کتابخانه Numpy در پایتون، برای جاوا در نظر گرفت.کتابخانه Rapids برای افزایش سرعت کار های مربوط به دیتا ساینس با کمک GPU طراحی شده است. این کتابخانه در سطوح پایین خود، برای پیاده سازی الگوریتم ها و محاسبات سریع مبتنی بر GPU ، از CUDA و در سطوح بالاتر از پایتون استفاده می‌کند.زیبایی Rapids اینجاست که با کتابخانه های مربوط به دیتا ساینس سازگار است. دیتافریم های کتابخانه Pandas را به راحتی می‌توان با استفاده از Rapids به کارت گرافیک انتقال داد. کتابخانه های Rapids عبارتند از:کتابخانه cuDF: پردازش دیتافریم به کمک GPU در پایتون. این کتابخانه تمام کار هایی که Pandas انجام می‌دهد را انجام می‌دهد.کتابخانه cuML: ماشین لرنینگ به کمک GPU در پایتون. این کتابخانه تمام الگوریتم های ماشین لرنینگ را که در کتابخانه Scikit-Learn وجود دارد، در خود جای داده است.کتابخانه cuGraph: پردازش گراف به کمک GPU در پایتون. اکثر الگوریتم های تحلیل گراف مانند PageRank در این کتابخانه گنجانده شده‌آند.مقایسه CPU و GPU در دیپ لرنینگبالاتر یک مقایسه کلی بین CPU و GPU انجام دادیم. حال می‌خواهیم عملکرد این دو را در دیپ لرنینگ مقایسه کنیم.پهنای باند حافظه: پهنای باند حافظه یا Memory Bandwidth یکی از اصلی ترین دلایل سرعت بالای GPU در برابر CPU است. در دیتاست های بزرگ، CPU حافظه زیادی را برای آموزش مدل اشغال می‌کند. اما GPU خود مجهز به حافظه اختصاصی VRAM است. به همین خاطر می‌توان از حافظه اختصاصی کارت گرافیک برای آموزش مدل و از حافظه CPU برای دیگر کار ها استفاده کرد. البته اینجا با یک مشکل روبرو می‌شویم. انتقال دیتاست های بزرگ از CPU به GPU خود یک چالش است.محاسبات بزرگ و پیچیده احتیاج به سرعت بالای CPU دارد. علت این امر ،همانطور که بالاتر گفتیم، متوالی انجام شدن عملیات در CPU است. CPU برای این کار هسته های کمتری نسبت به GPU دارد.اگرچه GPU ها سریع تر هستند اما انتقال داده های بزرگ از CPU به GPU، بسته به معماری پردازنده،می‌تواند مدت زمان زیادی طول بکشد. بهترین CPU ها چیزی در حدود 50GB/s پهنای حافظه دارند. این در حالی است که این عدد در GPU ها چیزی در حدود 750GB/s است.مقایسه پهنای باند حافظه در CPU و GPUدیتاست: آموزش یک مدل در دیپ لرنینگ احتیاج به یک دیتاست یا مجموعه داده بزرگ دارد. هرچقدر که دیتاست بزرگ تر باشد، احتیاج به حافظه بیشتری داریم. در اینجا یکی از برتری های GPU به CPU نمایان شود چون کارت های گرافیک مجهز به حافظه اختصاصی هستند.محاسبات موازی: در مثالی که زدیم، اگر بطور همزمان از کامیون های بیشتری استفاده کنیم، می‌توانیم از زمانی که برای بارگذاری کامیون ها صرف می‌کنیم، استفاده بهینه کنیم. ( به این صورت که اگر مثلا بارگذاری هر کامیون یک ساعت طول بکشد، با افزایش تعداد کامیون ها به 100 تا، می‌توانیم در یک ساعت به جای یک کامیون، 100 کامیون را بارگذاری کنیم ) از این رو می‌توان زمان تاخیر ( بارگذاری ) را پنهان کرد.کارت های گرافیک پهنای باند بیشتری را ارائه می‌دهند و تاخیر ( Latency ) خود را با محاسبات موازی جبران می‌کنند. پس، در مواقعی که به حافظه بیشتری احتیاج داریم، کارت های گرافیک بیشترین پهنای حافظه را در اختیار ما می‌گذارند و در عین حال، بخاطر انجام محاسبات به صورت موازی، تقریباً یک تجربه بی‌نقص را ارائه می‌دهند.بهینه سازی: بهینه سازی فعالیت ها برای CPU آسان تر از GPU است. هسته های CPU، اگرچه کم هستند اما قدرتمند تر از هزاران هسته GPU هستند. هر هسته CPU می‌تواند دستور های متفاوت را انجام دهد ( معماری MIMD ). در برابر، هسته های GPU می‌توانند یک دستور را به صورت موازی انجام دهند. ( معماری SIMD ).برای درک بهتر این دو معماری، به این دو مثال توجه کنید. بازیکنان یک تیم فوتبال مانند معماری MIMD هستند. هر کدام از بازیکنان وظیفه های منحصر به فرد خود را دارند اما در نهایت، نتیجه همه این وظایف به یک هدف منجر می‌شود. یک تیم قایق رانی هم مانند معماری SIMD است. همه پاروزن ها دقیقا یک وظیفه یکسان دارند.این موازی کاری در شبکه های عصبی ( Neural Network ) بسیار پیچیده است. در نتیجه پیاده سازی تکنیک های بهینه سازی در GPU سخت تر از CPU است.هزینه: برای آموزش شبکه های کوچکتر با دیتاست های کوچکتر و در مواقعی که زمان انجام این کار مهم نباشد، می‌توان از CPU استفاده کرد چون برق مصرفی GPU بیشتر از CPU است.خلاصه این مقایسه: پهنای باند بالا و پنهان شدن تاخیر زیر سایه محاسبات موازی، باعث سریعتر بودن GPU نسبت به CPU است.با توجه به دلایل بالا، اگر می‌خواهیم مدل را روی یک دیتاست کوچک آموزش دهیم، می‌توانیم از CPU استفاده کنیم. استفاده از GPU برای آموزش سیستم های دیپ لرنینگ در دیتاست های بزرگ که زمان طولانی احتیاج دارد، مناسب است. CPU در آموزش یک مدل دیپ لرنینگ کند اما GPU سریع است. در نتیجه اگر می‌خواهید در زمان خود صرفه جویی کنید، از GPU استفاده کنید.آیا واقعا در دیپ لرنینگ به کارت گرافیک احتیاج دارم؟در اینجا می‌خواهیم این موضوع را در ۴ سناریوی مختلف بررسی کنیم.سناریوی اول: اول ببینید کاری که می‌خواهید انجام دهید به چه منابعی احتیاج دارد. اگر قرار است با یک دیتاست کوچک کار کنید یا کاری که می‌کنید با پردازش متوالی CPU قابل انجام است، پس احتیاج به یک کارت گرافیک برای آموزش مدل خود ندارید. سناریوی دوم: اگر کاری که انجام می‌دهید از سناریوی اول کمی بزرگتر است و دیتاست بزرگتری در اختیار دارید، یک کارت گرافیک معقول هم می‌تواند کار شما را راه بیندازد. مثلا می‌توان از کارت گرافیک یک لپ‌تاپ استفاده کرد.کارت گرافیک در دیپ لرنینگسناریوی سوم: اگر اغلب اوقات کاری که می‌کنید پیچیده است یا اگر شرکتی هستید که در سرویس های خود از دیپ لرنینگ استفاده می‌کند، بهتر است یک کامیپوتر مناسب دیپ لرنینگ خریداری کنید یا از سرویس های ابری مانند AWS استفاده کنید.سناریوی چهارم: اگر کار شما به طور معمول در مقیاس بزرگی است و به طور تخصصی در حوزه دیپ لرنینگ کار می‌کنید و بودجه خوبی هم دارید، می‌توانید چند کارت گرافیک بخرید و برای محاسبات خود استفاده کنید. البته گزینه های دیگری هم مانند استفاده از TPU و FPGA وجود دارد.Resources:How you can accelerate your Data Science on GPUBasics of GPU Computing for Data ScientistsIs GPU Really Necessary for Data Science Work?Why are GPUs necessary for training Deep Learning models?Do we really need GPU for Deep Learning? - CPU vs GPUWhat is a GPU and do you need one in Deep Learning?