پست وبلاگ

کدام کارت گرافیک برای یادگیری عمیق مناسب است؟ (بخش اول)

کدام کارت گرافیک برای یادگیری عمیق مناسب است؟ (بخش اول)

بسم الله الرحمن الرحیم

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

بخش اول : کدام کارت گرافیک برای یادگیری عمیق مناسب است ؟

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

اوائل شروع یادگیری عمیق اجرای پردازش ها محدود به استفاده از کارتهای گرافیک بود. اما طی یکسال اخیر فعالیتهایی در جهت استفاده از سیستم های توزیع شده هم صورت گرفته که در کفی میشه به SparkCaffe و در جاوا به DeepLearning4J و احتمالا معروف تر از همه Tensorflow اشاره کرد. ذکر این نکته ضروریه که یک کارت گرافیک با قیمت متوسط مثل GTX960 یا حتی GTX1060 از یک سرور با پردازنده xeon هم به مراتب قوی تره. برای اطلاعات بیشتر بعنوان مثال میتونید اینجا و اینجا رو مشاهده کنید.

پس در حال حاضر ما برای اینکه بتونیم در یک زمان معقول یک شبکه عصبی عمیق رو آموزش بدیم نیازمند استفاده از پردازش موازی هستیم و برای اینکار از کارتهای گرافیک استفاده میشه. خب حالا از چه کارت گرافیکی استفاده باید کرد؟
در حال حاضر شرکت Nvidia برنده بی چون و چرای این حوزه است. تمامی کتابخونه ها و چارچوبها بدون استثنا از کارتهای انویدیا پشتیبانی میکنن و مبتنی بر Cuda و cudnn هستند. پشتیبانی از کارتهای AMD/Intel و متنفرقه یا مبتنی بر OpenCL یا وجود نداره و یا بشدت ضعیف هست بعنوان مثال AMD برنچی از کفی رو به OpenCL پورت کرد اما خیلی زود هم اونو کنار گذاشت و پشتیبانی ازش رو قطع کرد. هرچند در حال حاضر یک برنچ مبتنی بر OpenCL در کفی وجود داره (اینجا) که کسانی که کارت گرافیک AMD و یا Intel دارن میتونن ازش استفاده کنن اما از لحاظ سرعت و بروز رسانی قابل قیاس با ورژن اصلی و مبتنی بر Cuda/cudnn نیست.

مقایسه CPU و GPU در یادگیری عمیق

در تصویر بالا هم یک مقایسه بین CPU و GPU میبینید (در بخش دوم مقایسه خیلی کاملتری داریم انشاالله) به تعداد روزها دقت کنید!(۴۳ روز در برابر ۳ روز!)

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

به همین دلیل پیشنهاد اکید میشه در زمان خرید حتما یک کارت گرافیک انویدیا رو تهیه کنید.

خب آیا هر کارت انویدیایی قابل استفاده است  ؟

جواب خیر هست. با هر کارتی امکان آموزش شبکه های عمیق رو شما ندارید (البته اگر منظور استفاده از کتابخونه ها/فریم ورکهای معتبر باشه اگر خودتون بخوایید برنامه نویسی کنید که دستتون بازه) . در اینجا چند نکته است که باید بهش توجه بشه.

نکته اول قابلیت های کارت گرافیک شما است . شما ار هر کتابخونه و یا چارچوبی که قراره استفاده کنید باید به نیازمندی های سخت افزاری اون توجه کنید. بعنوان مثال اگر از کفی میخوایید استفاده کنید باید حتما کارت گرافیک شما compute capability 2.1 به بالا داشته باشه. اگر ار تنسورفلو میخوایید استفاده کنید (پکیج های آماده اش) باید حتما کارت گرافیک شما compute capability 3 به بالا داشته باشه. این قضیه برای torch هم صادقه. برای اینکه متوجه بشید کارت گرافیک مورد نظر شما این قابلیت ها رو داره میتونید از بخش ابزارها لیست و لینکهایی که برای این بخش قرار داده شده استفاده کنید.

در زیر کارتهای مختلف با compute capability 3 به بالا مشخص شدن (با بردن ماوس روی هر لیست اطلاعات compute capability اون رو میتونید مشاهده کنید)

 

خب تا به اینجا تصمیم گیری برای خیلی از شماها باید مشخص تر و راحت تر شده باشه. اما آیا اطلاعات بالا کافیه ؟ خیر!

سوال : چه اطلاعات دیگه ای باید داشته باشیم ؟

کارتهای بالا صرفا مشخص کننده یکسری حداقلها هستن. اما این اعداد به هیچ وجه نشون دهنده اینکه چقدر یک کارت برای کار من نوعی میتونه مفید باشه نیستند. من باید به چه چیزهای یک کارت گرافیک توجه بیشتری بکنم؟

سه موضوع زیر رو در نظر بگیرید

  1. حجم حافظه
  2. قدرت پردازش
  3. پهنای باند

این ها مواردی هست که باید در زمان تهیه یک کارت گرافیک لحاظ کنید. در درجه اول باید بدونید که تقریبا اکثر معماری های بسیار موفق که دقت بسیار بالایی رو ارائه میکنن خیلی عمیق هستن و این به معنای اشغال حجم زیادی از حافظه اس. بعنوان مثال معماری ساده و ابتدایی مثل AlexNet در زمان آموزش روی دیتاست ایمیج نت با اندازه تصاویر ۲۲۴ در۲۲۴ پیکسل به ۶ گیگابایت رم نیاز داشت. و یا معماری Vggnet و همینطور GoogleNet و یا ResNet به مراتب حجم های خیلی بیشتری رو نیاز دارن . البته میشه با روشهایی مثل کاهش اندازه بچ میزان حافظه مصرفی رو کاهش دادم و یا اندازه تصاویر ورودی رو کاهش داد اما هر دو این کارها تاثیر مستقیم روی دقت نهایی میزارن و باعث بدتر شدن اون میشن. خصوصا کاهش اندازه بچ در زمان آموزش (یا همون training ) تاثیرات خیلی بدی میتونه بزاره . به همین علت برای اینکه در آموزش و تحقیقاتتون دستتون باز باشه و به مشکل حافظه نخورید جدا پیشنهاد میشه از کارتهای با حجم حافظه بالا استفاده کنید. (در انتها توضیح بیشتری میدم)

نکته بعدی قدرت پردازش هست یا همون cuda cores در کارتهای گرافیک. هرچقدر قدرت پردازشی کارت شما بیشتر باشه آموزش شما سریعتر پیش میره و این نکته بشدت قابل اهمیتیه چرا که شما حتما تا جایی که ممکنه باید فاز آموزشی سریعی داشته باشید تا بتونید پارامترهای مختلف رو تنظیم کنید و اگر کارت شما از قدرت کافی برخوردار نباشه بشدت تو اینجا زمینگیر میشید و خیلی از ایده ها و نکات رو نمیتونید عملا پیاده و نتیجه اش رو ببینید و زمان زیادی رو از دست میدید .

نکته بعدی که ارتباط تنگاتنگی با مورد قبلی داره پهنای بانده . در شبکه عصبی بخاطر محاسبات زیادی که رخ میده پهنای باند نقش بشدت حساسی داره . و قابل ملاحظه ترین تاثیر رو میزاره . حتما در بازار دیدید که کارتهای گرافیکی هستن مثل GTX750 که با ۴ گیگ رم معرفی شدن! این کارت فوی ای هست اما نه اونقدر! و اگر شما مدلی داشته باشید که ۴ گیگ فضا رو اشغال کرده من بهتون قول میدم زمان خیلی زیادی رو باید برای آموزش اون سپری کنید. (نکته دوم در انتها رو بخونید) . به همین منظور کارتهای ۶۴ بیتی اصلا مناسب نیستند و همینطور کارتهای ۱۲۸ به بالا با توجه به معماری اونها باید انتخاب بشه . دقت کنید که با جدید شدن معماری ها و حافظه اونها پهنای باند کارتها هم خیلی دستخوش تغییر میشه و براحتی میشه دید که بعنوان مثال کارت ۱۲۸ بیتی مثل GTX960 از یه کارت با رابط ۲۵۶بیتی مثل GTX560 خیلی بیشتره!(در حد ۲ برابر !) برای مقایسه پهنای باند مدلهای مختلف میتونید از اینجا استفاده کنید.(دقت کنید مدلهایی M دارن از مدل دسکتاپ خیلی ضعیف تر هستن. بعنوان مثال ۹۶۰M (با ۸۰ گیگ) رو با ۹۶۰ معمولی(با ۱۱۲ گیگ پهنای باند) اینجا مقایسه کنید) پس در زمان خرید همیشه سعی کنید کارت های جدید تر رو بخرید و حتما حافظه کارت شما از نوع GDDR5 و یا جدیدتر باشه. به هیچ وجه کارتی که میخرید  DDR3 نباشه 

خب همه این صحبت ها شد حالا چه کارتهایی با توجه به بازار امروز پیشنهاد میشه ؟

من به ترتیب بر اساس قیمت/قدرت/آینده نگری پیشنهادات خودم رو عنوان میکنم و در ادامه باز توضیحات تکمیلی رو میدم .

  1. TitanX Pascal-12Gig
  2. TitanX Maxwell-12Gig
  3. GTX 1080 TI –10Gig
  4. GTX 10808Gig
  5. GTX 10708Gig
  6. GTX 980 TI-6Gig
  7. GTX 10606Gig
  8. GTX 980-4Gig
  9. GTX 960-4Gig
  10. GTX 950-4Gig
  11. *GTX 970-4Gig

اینها کارتهایی هستن که من پیشنهاد میکنم اگر کسی قصد کار کردن تو این حوزه رو داره تهیه کنه. اول پیشنهاد میشه ۱۰۸۰GTX تهیه کنید. باز هم پیشنهاد میکنم ۱۰۸۰GTX رو تهیه کنید. اگر بودجه اش واقعا وجود نداره حتما برید سراغ GTX1070 . همه سعیتون رو بکنید که این کارت رو تهیه کنید باز اگر نشد دوباره سعی کنید این کارت رو تهیه کنید! اگر باز دیدید نشد گزینه بعدی ۹۸۰TI هست اگر در بازار دست دومش رو گیر بیارید خوبه اگر نه GTx1060 با ۶ گیگ رم تهیه بشه. اینجا یه مکث خیلی معناداری هست به این معنی که از این به بعد اصلا پیشنهاد نمیشه . ۶ گیگ حجم حافظه حداقلی هست که برای معماری های جدید حساب میشه . بی برو برگرد سعی کنید این کارت تهیه بشه . از این پایین تر کارت قدرتمند GTX980 هست که از لحاظ قدرت و پهنای باند خیلی عالیه اما حافظه اون بشدت تاثیر منفی روی انعطاف شما میزاره و دست شما رو در تست معماری های عمیق تر و یا پیچیده تر میبنده.

یه نکته ای رو من تو پرانتز بگم . ممکنه بعضی از شماها بگید “من که نمیخوام از مدل خیلی عمیق استفاده کنم مثلا همین الکس نت یا VGGnet هم کار منو راه میندازه یا حتی مدلهای کم عمق تر و من تو اینترنت هم دیدم کسایی که حافظه ۴ گیگ و یا حتی ۲ گیگ هم داشتن تونستن تست کنن و مشکلی نبوده! پس اونقدرا هم حافظه مهم نیست!” ابدا اینطور فکر نکنید!

الزما با عمیق کردن نیست که حافظه مصرف میشه . استفاده از تکنیک های جدید و الگوریتم های جدید هم حتی اگر عمق شبکه شما زیاد نباشه باعث مصرف حافظه زیادی میشه . الگوریتم هایی مثل Batch-Normalization سربار حداقل ۳۰ درصدی به شبکه اضافه میکنن و مصرف حافظه افزایش پیدا میکنه خصوصا اگر قبل هرکدوم از لایه ها از این لایه استفاده شده باشه و یا استفاده از توابع غیرخطی مثل maxout و امثالهم و خیلی موارد دیگه . علاوه بر اون خیلی از همون افراد که یکیش خود من هم بودم مشکلات زیادی بابت این قضیه داشتن و اینم در نظر بگیرید که دو سه سال قبل با الان خیلی فرق میکنه هم از نظر معماری هایی که وجود داشت و هم الگوریتم های جدید و هم کارتهای گرافیکی . سه سال پیش اهمیت نداشت نگران چیزی بیشتر از الکس نت باشن!  هنوز خیلی ها استارت نزده بودن و با کمی تغییرات میشد دقت ها رو بهبود داد اما حالا معماری های عمیق تر الگوریتم های پیچیده تر وارد شدن که نیازمند اینه افراد با توجه به اینها پیش برن و حواسشون به آینده و دستاوردهای جدید هم باشه که مجبور به هزینه دوباره نشن تا بتونن از یک معماری یا الگوریتم جدید استفاده کنن! و اینم بدونید که خیلی ها هم که میبینید در مورد مثلا GTX750 یا کارتهای قدیمی تر سوال کردن بعدها عملا سویچ کردن رو کارتهای قویتر چون در عمل متوجه شدن و دیدن چه مشکلات و محدودیت هایی ایجاد میشه. بعضی از این افراد هم صرفا برای تست و آزمایشگاه از اون کارتها استفاده میکردن و تمام . بدون استثنا محققایی که میبینید تو این زمینه فعالیت میکنند بصورت جدی یا از TitanX استفاده میکنن و یا GTX1080 اون هم بصورت چندتایی (از لفظ SLI نمیشه استفاده کرد چون کارتها بصورت مجزا مورد استفاده قرار میگرن و فقط تنسورفلو هست که امکان مدیریت بهتر رو به برنامه نویس میده (خبری از SLI نیست)). نکته مهم دیگه بر اساس تجربه ای که من کسب کردم و خودم از کارت قدیمی و متوسطی مثل GTX750 با ۲ گیگ رم شروع کردم و بعدا به کارتی مثل GTX980 اپگرید کردم دقیقا میدونم یک فردی که استارت کارش رو بزنه با چه چیزهایی مواجه میشه . پس اینجا بمن اعتماد کنید و سعی کنید مشکلات آینده خودتون رو با پیشنهادی که دادم خدمتتون کم کنید.

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

نکته بعدی در مورد کارت GTX970 هست که من بعنوان آخرین کارت گذاشتم! در صورتی که رابط ۱۹۲ بیتی داره و بسیار قدرتمنده (بعد از GTX980 از بقیه قویتره) . این کارت در صورتی که شما حجم حافظه ای کمتر از ۳ تا ۳٫۵ گیگابایت اشغال کنید سرعتش عالیه اما به محض اینکه از محدوده ۳٫۵ گیگابایت گذشتید بشدت پرفورمنسش کاهش پیدا میکنه . این قضیه در اینجا کاملا مشخص هست (پهنای باند بین کارت ۹۸۰GTX و ۹۷۰GTX رو ببینید خصوصا زمانی که از ۳٫۵ گیگ میگذره ) این مشکل اختصاصی این کارت هست و برای همین هم اصلا پیشنهاد نمیشه برای اینکار.همونطور که گفتم GTX1070 و GTX1060 پیشنهاد میشن به همه .

 

خب فکر میکنم برای بخش اول همینقدر کافی باشه .

در بخش دوم ما در مورد اهمیت CPU و رم سیستم هم صحبت میکنیم و همینطور من سعی میکنم یک بنچمارک و قیاس عینی تر از تفاوت بین کارتها رو نشون بدم.

همینطور دوست دارم اگر فرصت شد در مورد نسل بعد و تغییراتی که در این زمینه قراره رخ بده صحبت کنم (FP16 و…) و همینطور cudnn و تفاوت کارایی در زمانی که ازش استفاده میشه و وقتی نمیشه!

 

سید حسین حسن پور متی کلایی

درباره ی سید حسین حسن پور متی کلایی

موسس و مدیر سایت. اطلاعات در مورد فعالیت های کاری و تحصیلی : linkedIn . برای ارتباط از بخش تماس با ما یا در باره من استفاده کنید.

مقالات مرتبط

14 دیدگاه در “کدام کارت گرافیک برای یادگیری عمیق مناسب است؟ (بخش اول)

  1. سلام.بسیار متشکرم بابت جمع اوری وانتشار این مطالب بسیار مفید.ممنون میشم در صورت امکان در مورد کاربرد پردازنده هایی مثله FPGA در شبکه های کانولوشن
    توضیحاتی بدید.

    1. سلام .
      کارتهای گرافیک در سیستم های کامپیوتری استفاده دارن اما وقتی شما بخوایید یک محصول ارائه کنید دیگه قرار نیست یه کارت گرافیک به همراه یک سیستم کامل هم در نظر بگیرید تنگ محصولتون! نه عملیه و نه عاقلانه! چون هزینه تمام شده محصولتون خیلی افزایش پیدا میکنه بکنار مسائل امنیتی و یا حتی مصرف توان هم چالش بزرگی میشه و از طرفی در بعضی موارد اصلا ممکن نیست
      برای همین در سیستم های توکار (embedded systems) خبری از این کارتهای گرافیک قدرتمند نیست. برای این جور سیستم ها تا جایی که من اطلاع دارم از بوردهای خاصی مثل Tesla K40 , Jetson TX1 , Tesla K80 و… از انویدیا و یا FPGA ها استفاده میشه و بصورت اختصاصی برای کار مورد نظر مورد استفاده قرار میگیره .
      البته این هم باید گفته بشه که FPGA ها محدودیت های پردازشی زیادی دارن برای همین اموزش یه شبکه عمیق و پچیده یا عملی نیست یا خیلی سخته برای همین یکسری معماری های جدید هم در این باره اومدن که شاید این مقاله خوندنش بد نباشه (تاکید روی بخش دوم و تاریخچه و کارهای انجام شده هست و خوندن مقالاتی مثل SqueezeNet )
      این قبیل موارد رو بچه های برق و خصوصا بچه های سخت افزار کامپیوتر خیلی خوب میدونن من وارد نیستم زیاد.
      از طرفی خوندن این مطلب و این مقاله و همینطور این لینک هم پیشنهاد میشه

  2. سلام
    ممنون از توضیحاتتون
    یه سوال داشتم. من الان می خوام شروع کنم برای بحث deep learning و احتمالا هم با شبکه های RNN , LSTM برای داده های sequential. در کل پیشنهادتون استاده از cloud هست یا خرید gpu? من با تنسورفلو کار میکنم.
    با تشکر

    1. سلام
      هزینه تمام شده برای خودتون رو باید ببینید. هرکدوم براتون صرفه بیشتری داره اونو انتخاب کنید.
      در مورد cloud هم الان سرویسی فعلا فعال نیست تو ایران ولی بنظرم قراره اگر مشکلی پیش نیاد یکی از شرکتا تا قبل عید یه کارایی بکنه .قیمتها و پلن هاشو ببینید بعد بهتر میتونید تصمیم بگیرید.

      1. سلام
        به خاطر تحریم هاست؟ همه کلودها؟! آمازون-مایکروسافت؟ میشه اطلاعاتی از دلیل این عدم دسترسی توی سایت هاشون به دست آورد؟

  3. سلام .
    بنابر گفته هاتون در مورد کارت ۹۷۰ در صورتی که از دوتای این کارت همزمان استفاده بشه ، چقدر تاثیر داره ؟‌

    1. سلام .
      از لحاظ سرعت پردازش و اموزش خیلی سریعتر میشه اما در حال حاضر هیچکدوم از کتابخونه ها و چارچوب های یادگیری عمیق حافظه ها رو تجمیع نمیکنن. یعنی شما بعنوان مثال در کفی میتونید مدلی رو آموزش بدید که در حافظه هر کارت گرافیک جا بشه.(محدودیت رو حافظه کمتر مشخص میکنه)
      بزارید یک مثال بزنم اگه دوتا کارت داشته باشید یکی ۴ گیگ یکی ۲ گیگ شما میتونید مدلی رو اجرا کنید که در ۲ گیگ جا بشه!
      اینطور بعنوان مثال کفی میاد شبکه رو بصورت موازی روی دوتا کارت اجرا میکنه (و اندازه بچ شما دو برابر میشه) و نتایج ترکیب و خروجی بشما داده میشه .
      تنها سودی که این کار داره سریعتر انجام شدن فاز اموزش هست .
      حالا شما میتونید همین نکته رو در مورد ۹۷۰ هم تعمیمش بدید. یعنی شما دوتا کارت ۹۷۰ استفاده کنید اولا کماکان همون محدودیت ۴ گیگ حافظه رو دارید. و حتما شبکه شما باید فضایی کمتر از ۳٫۵ گیگ اشغال کنه تا بمشکل نخورید .
      نکته مثبتش فقط این میشه که عملیات آموزش چند برابر سریعتر پیش میره
      به همین دلیل هم هست که همییشه پیشنهاد میشه بجای استفاده از چند کارت گرافیک با حافظه کم از یه کارت گرافیک قوی تر با حافظه زیاد استفاده کنید. (مگه اینکه بدونید معماریتون زیر ۴ گیگ خواهد بود و کارتها هم ارزون یا در دسترس هستن . در این حالت خب دندون اسب پیش کشی رو نمیشمارن! و از هرچی دارن استفاده میکنن)
      البته این نکته رو هم باید بگم که در بین فریم ورکها من تنها تنسورفلو رو دیدم که شما میتونید بار پردازشی رو مشخص کنید روی چه چیزی باشه . یعنی میتونید مشخص کنید کدوم بخش از کد شما روی کارت گرافیک ۱ کدوم روی سی پی یو و کدوم روی کارت گرافیک ۲ و الی اخر اجرا بشه
      البته در ظاهر این خیلی خوبه اما در عمل بکار گیری اون همچین بدون چالش و راحت هم نیست.

  4. من حدود یک سالی هست که تو این حوزه فعالیت میکنم من تقریبا سعی کردم توی چالش هایی که توسط kaggle برگزار میشه شرکت کردم ، اما به دلیل نداشتن کارت گرافیک درست حسابی نتونستم مدل های عمیق رو از scratch آموزش بدم و در بیشتر موارد از vgg16 و resnet استفاده کردم . هفته پیش یه مدل NLP رو روی اشعار حافظ آموزش دادم و نتایجی تقریبا خوبی گرفتم .

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

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *