
بررسی و مقایسه کارتگرافیکهای مناسب یادگیریعمیق (Deep Learning)

تعریف جی پی یو و کارتگرافیک
واحد پردازشگرافیکی یا Graphics processing unit) GPU) یک قطعه سختافزاری است، که به عنوان پردازندهگرافیکی شناخته میشود. یک مدارالکترونیکی ویژه که برای سریعترین تغییر و تعدیل حافظه به منظور ایجاد تصاویر و گرافیک در یک بافر فریم برای نمایشگر استفاده میشود است. این امرعمدتاً به کامپیوتر یا لپ تاپ کمک میکند تا گرافیک و تصاویر ایدهآل را به کاربر ارائه دهد. این مورد برای رمزگذاران، طراحان، ویرایشگران فیلم و تقریباً در مورد هر کسی که میخواهد تصاویر درجه یک داشته باشد، مناسب است.
به طور معمول در کامپیوترها، کنسولهای بازی، دستگاههای تلفن همراه و سایر دستگاههای الکترونیکی که نیاز به قابلیت پردازش گرافیکی دارند، یافت میشوند. آنها به ویژه برای وظایفی مانند بازیها، ویرایش ویدیو، مدلسازی سهبعدی و هوش مصنوعی (AI) که نیاز به قدرت پردازش معمولی بالا دارند، اهمیت زیادی دارند.
شما میتوانید بهترین کارت گرافیک (GPU) را برای یادگیری ماشین در کارت پلاگین پیدا کنید. این دستگاه در چیپست مادربرد رایانه واقع شده است. پردازنده یا واحد پردازش مرکزی به عنوان واحد اصلی عملکرد رایانه یا لپتاپ در نظر گرفته میشود اما عملکرد آن به کارت گرافیک بستگی دارد. به عبارت دیگر، جی پی یو یک قطعه سختافزاری است که عمدتاً برای رندرینگ گرافیک و تبدیل دیتا به سیگنال انجام وظایف پردازش موازی طراحی شده است.
تعریف یادگیری ماشین (Deep Learning)
یادگیری ماشین همچنین به عنوان یادگیری ساختاریافته عمیق نیز شناخته میشود بخشی از یک خانواده گستردهتر از روشهای ماشین لرنینگ براساس شبکههای عصبی مصنوعی با یادگیری نمایش است. یادگیری میتواند تحت نظارت، نیمه نظارت یا بدون نظارت باشد.
معماریهای یادگیری ماشین مانند شبکههای عصبی عمیق، شبکههای اعتقادی عمیق، یادگیری تقویت عمیق، شبکههای عصبی مکرر و شبکه های عصبی پیچیده در زمینه هایی از جمله دید کامپیوتر، تشخیص گفتار، پردازش زبان طبیعی، ترجمه ماشینی، بیو انفورماتیک، طراحی دارو، پزشکی برنامه های تجزیه و تحلیل تصویر، بازرسی محصولات و بازیهای رومیزی، جایی که آنها نتایج قابل مقایسهای با عملکرد متخصص انسان داشته و در برخی موارد پیشی گرفتن از آن.
حال به مبحث اصلی این مقاله می پردازیم که کدام پردازندههای گرافیکی در یادگیری ماشین مناسب ترند: یادگیری ماشین یک زمینه با الزامات محاسباتی شدید است و انتخاب GPU شما اساساً تجربه یادگیری ماشین شما را تعیین می کند. اما اگر بخواهید GPU جدید بخرید چه ویژگی هایی مهم است؟ رم جی پی یو، هستهها، هستههای تنسور؟
چگونه می توان یک انتخاب مقرون به صرفه انجام داد؟ این پست وبلاگ به بررسی این سوالات می پردازد، با عقاید غلط رایج مقابله می کند و به شما درک مستقیمی از نحوه فکر کردن در مورد GPU ها می دهد، به شما مشاوره می دهد تا انتخابی مناسب انجام دهید.
بررسی فوری یادگیری ماشین
ساختار این پست وبلاگ به روش زیر است که ابتدا توضیح خواهم داد که چه چیزی باعث سریع تر شدن جی پی یو است. من در مورد پردازنده های مرکزی در مقابل پردازنده های گرافیکی، هستههای تنسور، پهنای باند حافظه و سلسله مراتب حافظه GPUها و چگونگی ارتباط این ها با عملکرد یادگیری ماشین بحث خواهم کرد. این توضیحات ممکن است به شما کمک کند تا درک بصری بیشتری از آنچه در GPU جستجو میکنید، داشته باشید.
سپس برآورد نظری برای عملکرد GPU انجام میدهم و آنها را با برخی از معیارهای بازاریابی انویدیا هماهنگ میکنم تا دادههای عملکرد مطمئن و بیطرفانه بدست آورم. در مورد ویژگیهای منحصربه فرد سری جدید پردازنده گرافیکی NVIDIA RTX 30 Ampere بحث میکنم که کارت گرافیکی قابل تأمل است. از آنجا، من GPU را برای تنظیمات 1-2 ، 4 ، 8 GPU و خوشههای پردازنده گرافیکی توصیه میکنم.
مهم ترین مشخصات جیپییو(GPU) برای سرعت پردازش یادگیری ماشین (ML)
با کمک این بخش می توانید درک بصری بیشتری از نحوه کارکرد درباره عملکرد یادگیری ماشین ایجاد کنید. این درک به شما کمک می کند تا GPU های آینده را خود ارزیابی کنید.
درباره هستههای تنسور
- هستههای تنسور چرخههای مورد استفاده برای محاسبه عملیات ضرب و جمع را 16 برابر میکنند: در مثال برای یک ماتریس 32 × 32، از 128 چرخه به 8 چرخه.
- هستههای تنسور اعتماد به دسترسی تکراری حافظه مشترک را کاهش میدهند، بنابراین چرخه های اضافی برای دسترسی به حافظه ذخیره میشود.
- هستههای تنسور آن قدر سریع هستند که دیگر محاسبه گلوگاه نیست. تنها گلوگاه انتقال دادهها به هستههای تنسور است.
در حال حاضر GPUهای ارزان قیمت به اندازه کافی وجود دارد که تقریباً همه میتوانند جی پی یو با هستههای تنسور را تهیه کنند. به همین دلیل است که من فقط GPUهای دارای هسته تنسور را توصیه میکنم. درک نحوه کار آنها برای درک اهمیت این واحدهای محاسباتی ویژه ضرب ماتریس مفید است. در اینجا من یک مثال ساده از ضرب ماتریس A * B = C را به شما نشان میدهم، جایی که تمام ماتریس ها اندازه 32 × 32 دارند، یک الگوی محاسباتی با هستههای Tensor و بدون آن به نظر میرسد.
این یک مثال ساده است، نه روش دقیق نحوه نوشتن هسته ضرب ماتریس با عملکرد بالا، اما تمام اصول را دارد. یک برنامه نویس کودا (CUDA) این را به عنوان اولین “پیش نویس” در نظر میگیرد و سپس آن را گام به گام با مفاهیمی مانند بافرکردن دوگانه، بهینهسازی ثبت نام، بهینهسازی اِشغال، موازیسازی سطح دستورالعمل و بسیاری دیگر بهینه میکند، که من در این مرحله بحث نمیکنم.
برای درک کامل این مثال، باید مفاهیم چرخه ها را درک کنید. اگر پردازنده با سرعت 1GHz کار کند، میتواند 10 ^ 9 سیکل در ثانیه انجام دهد. هر چرخه فرصتی برای محاسبه است با این حال، بیشتر اوقات، عملیات بیش از یک چرخه طول میکشد. بنابراین خط لوله ای ایجاد میکند که برای شروع یک عملیات باید منتظر بماند تعداد چرخه های زمان لازم برای پایان عملیات قبلی به این عمل تأخیر عمل نیز میگویند.
در اینجا چند دوره مهم زمانی یا تاخیر برای انجام عملیات وجود دارد:
- دسترسی حافظه جهانی (حداکثر 48 گیگابایت): 200 ~ چرخه
- دسترسی به حافظه مشترک (حداکثر 164 کیلوبایت در هر پردازنده جریانی): 20 ~ چرخه
- ضرب و جمع ذوب شده (FFMA): 4 دوره
- ضرب ماتریس هسته تنسور: 1 چرخه
علاوه بر این، باید بدانید که کوچکترین واحدهای رشته در GPU ، یک بسته 32 رشتهای است، که اصطلاحاً warp نامیده میشود. تارها معمولاً به صورت الگویی همزمان عمل میکنند، رشتههای درون تار باید منتظر یکدیگر باشند. تمام عملیات حافظه در جی پی یو برای تاب دادن بهینه شده است. به عنوان مثال، بارگیری از حافظه جهانی با دانه بندی 32 * 4 بایت اتفاق میافتد، دقیقاً 32 شناور، به طور دقیق یک شناور برای هر نخ در تاب.
حداکثر 32 رشته = 1024 رشته در یک پردازنده چند جریان (SM)، معادل GPU هسته پردازنده را میتوانیم داشته باشیم. منابع یک SM بین همه تابهای فعال تقسیم میشود. این بدان معناست که گاهی اوقات میخواهیم برای داشتن ثبات/ حافظه مشترک/ منابع هسته تنسور به ازای هر تاب، تعداد کمتری تار را اجرا کنیم.
برای هر دو مثال زیر، تصور میکنیم که منابع محاسباتی یکسانی داریم. برای این مثال کوچک از ضرب ماتریس 32 × 32، ما از 8 SM (حدود 10٪ از RTX 3090) و 8 warp در هر SM استفاده میکنیم.
ضرب ماتریس بدون هستههای تنسور
اگر بخواهیم ضرب ماتریس A * B = C را انجام دهیم، جایی که هر ماتریس به اندازه 32 × 32 باشد، پس میخواهیم حافظه ای را بارگیری کنیم که بارها و بارها به حافظه مشترک دسترسی پیدا میکنیم زیرا تأخیر آن حدوداً ده برابر کمتر است (200 چرخه در مقابل 20 چرخه) بلوک حافظه در حافظه مشترک اغلب به عنوان یک کاشی حافظه یا فقط یک کاشی نامیده میشود.
قرار دادن دو شناور 32 × 32 در یک کاشی حافظه مشترک میتواند به طور موازی با استفاده از تارهای 2 * 32 اتفاق بیفتد. ما 8 SM با هر 8 warp داریم، بنابراین به دلیل موازیسازی، فقط باید یک بار متوالی از حافظه جهانی به حافظه مشترک انجام دهیم که 200 چرخه طول میکشد.
برای انجام ضرب ماتریس، اکنون باید بردار 32 عددی را از حافظه مشترک A و حافظه مشترک B بارگیری کرده و ضرب و جمع شدن ذوب شده (FFMA) را انجام دهیم. سپس خروجیها را در رجیسترها ذخیره کنید. ما کار را تقسیم میکنیم تا هر SM 8 محصولی نقطه ای (32 32 32) برای محاسبه 8 خروجی C انجام دهد.
چرا این دقیقاً 8 است (4 در الگوریتم های قدیمی تر) بسیار فنی است. این بدان معناست که ما 8 برابر حافظه مشترک با هزینه 20 سیکل و 8 عملیات FFMA (32 موازی) داریم که هزینه هر کدام 4 چرخه است. در کل، بنابراین ما هزینهای داریم:
200 چرخه (حافظه جهانی) + 8 * 20 چرخه (حافظه مشترک) + 8 * 4 چرخه (FFMA) = 392 چرخه
بیایید هزینه چرخه استفاده از هستههای تنسور را بررسی کنیم.
ضرب ماتریس با هستههای تنسور
احتمالا نسبت هزینه به کارایی جی پی یو مهمترین معیار انتخاب یک پردازنده گرافیکی است. نمودار زیر تجزیه و تحلیل نسبت هزینه به کارایی را نشان میدهد که دربرگیرنده مواردی نظیر پهنای باند حافظه، ترافلاپس (TFLOPs) و هستههای تنسور است.

