در حالی که پردازندههای گرافیکی بیشتر و بیشتر مورد استفاده قرار میگیردند، بسیاری از مردم به چگونگی استفاده درست از آنها فکر نمیکنند.
شگفتزده خواهید شد اگر بدانید که چگونه پردازندههای گرافیکی خیلی بیشتر از آن که ما فکر میکنیم بیکار هستند و چقدر آسان است که برای ما ناکارآمد باشند.
یکی از راههای افزایش بهره وری از پردازنده گرافیکی، اجرای بیش از یک برنامه در آن واحد است.
در ادامه درباره این صحبت خواهیم کرد که چرا استفاده کم تر از سطح توان پردازنده گرافیکی رایج است، و چرا اجرای برنامههای متعدد در یک پردازنده گرافیکی میتواند این مشکل را حل کند. و همچنین چرا این کار یک چالش واقعی است.
چرا باید توان پردازنده های گرافیکی را به اشتراک بگذارید؟
پردازندههای گرافیکی گران هستند و اغلب در حال کار نیستند.
خرید پردازنده گرافیکی و اجاره آن در فضای ابری، هر دو گران است؛ و هنگامی که شما پول زیادی برای سختافزاری پرداخت میکنید، میخواهید بدانید که آیا اندازه هزینهای که پرداخت کردهاید از آن استفاده میکنید؟
متاسفانه این یک کیس رایج برای پردازندههای گرافیکی نیست و بسیاری از تیمهای نرمافزاری و شرکتها اغلب پردازندههای گرافیکی خود را در حالت استراحت نگه میدارند.
بیایید زمانهایی را که یک پردازنده گرافیکی کار نمیکند تفکیک کنیم.
- پردازندههای گرافیکی وقتی افراد از آنها استفاده نمیکنند بیکار هستند.
- آنها در ساعات خارج از کار مانند شبها و تعطیلات آخر هفته، و زمانهایی که کارمندان برنامههای گرافیکی را قبل از خروج از محل کار اجرا نمیکنند بیکار هستند.
- آنها در بخشی از ساعتهای کاری نیز بیکار هستند. مانند تایم استراحت برای قهوه یا نهار.
در حالی که این حقیقت بسیار واضح و حتی خندهدار است، این اتفاق به کرات رخ میدهد و حقیقت این است که حذف این ساعات بیکاری آسان نیست.
علاوه بر این، پردازندههای گرافیکی در زمانهایی که استفاده کمی از قابلیت پردازش رزولوشن آنها صورت میگیرد بیکار هستند؛ که این موضوع سختتر قابل درک بوده و حتی ممکن است شگفتآور باشد.
پردازندههای گرافیکی وقتی که افراد از آنها استفاده میکنند هم بیکار هستند
یک نوت بوک Jupyter مثالی خوب برای این موضوع است. یک کاربر نوت بوک Jupyter، معمولا فرایند کدنویسی و اجرای آن بر روی پردازنده گرافیکی به منظور تست اجرا را به تناوب و به نوبت انجام میدهد. بنابراین پردازنده گرافیکی برای مدتی طولانی در طول این فرایند بیکار است. اگر کاربر در محیطی با چند پردازنده گرافیکی کار کند، حتی زمانهای بیکاری پردازندههای گرافیکی بیشتر هم میشود.
پردازندههای گرافیکی هنگامی که برنامهها از آنها استفاده میکنند هم بیکار هستند.
اکثر برنامههای کاربردی، در زمانهای مابین راه اندازی هستههای پردازنده گرافیکی، از CPU و I/O کار میکشند. میزان استفاده از تک پردازنده گرافیکی حتی با یادگیری کامل چگونگی استفاده کامل از آن، در بیشتر موارد بسیار کمتر از 100 درصد است.
به عنوان مثال در هر مرحله از مدلهای تصویربرداری پزشکی، CPU نیز برای چند دقیقه فعالیت میکند.
معماری سختافزاری خوب میتواند بازده این عملکرد را با تقسیم موازی و همسان وظایف بین CPU و پردازنده گرافیکی (GPU) بهبود ببخشد، اما همانطور که ممکن است حدس زده باشید، این کار نیاز به مقداری تلاش دارد.
پردازندههای گرافیکی خیلی بزرگ هستند
پردازندههای گرافیکی هر سال پیشرفت میکنند. آنها سریعتر و قویتر میشوند و در هر مدل جدید حافظه گرافیکی بیشتری دارند.
اما گاهی اوقات، حافظه گرافیکی بیشتر غیر ضروری است.
تجربهی یک مدل جدیدتر به ما اجازه میدهد و حتی گاهی اوقات ما را مجبور میکند که از هایپرپارامترهای کوچکتری (مانند تنظیم دستی رزولوشن، اندازه تصویر و …) استفاده کنیم، که در حالت عادی این باعث میشود که مدل جدید به حافظه گرافیکی کمتری احتیاج داشته باشد.
همچنین مدلهای زیادی وجود دارند که از 32 گیگابایت حافظه NVIDIA V100 استفاده نمیکنند؛ و به طور مثال این در وظایف مربوط به استنتاج و محاسبه دقیق داده ها مشهود است.
به طور کلی پردازنده گرافیکی بهتر و بزرگتر (از نظر اندازه حافظه) نیاز به تلاش بیشتری برای استفاده درست از آن دارد.
قدرت زیاد مسئولیت زیاد هم با خود به همراه دارد
با به اشتراک گذاشتن پردازندههای گرافیکی با اجرای برنامههای متعدد به طور همزمان میتوانید این زمانهای بیکاری را به حداکثر برسانید. از حافظه استفاده نشده پردازنده گرافیکی به درستی کار بکشید و بازده استفاده از پردازنده گرافیکی را به طور قابل توجهی افزایش دهید.
این کار میتواند به تیمها کمک کند و به طور قابل توجهی هزینه اجاره را برای شرکتها کاهش دهد. همچنین میتواند باعث شود که تعدادی از پردازندههای گرافیکی از سیستمها خارج شوند و به جای تعداد بیشتر از یک مدل پایینتر، تعداد کمتری از یک مدل بالاتر برای سیستمها خریداری شود.
اما دلیلی برای رایج نبودن این امر وجود دارد. و این دلیل آن است که انجام دادن این کار سخت است.
بیایید ببینیم چرا اینگونه است.
به اشتراک گذاری GPU سخت است
برنامههای کاربردی که در همان پردازنده گرافیکی اجرا میشوند، حافظه خود را به اشتراک میگذارند. هر بایت اختصاص داده شده به یک برنامه، مساوی یک بایت کمتر برای دیگر برنامهها است.
تنها راه برای اجرای چندین برنامه گرافیکی به طور همزمان، تعاملی کردن آنها است. برنامههای گرافیکی نباید از بخش اختصاص داده شده به خود تجاوز کنند و حافظه گرافیکی بیشتری را به خود اختصاص دهند. در غیر این صورت، این برنامهها میتوانند به یکدیگر آسیب بزنند، حتی به غلط!
یک نیاز کمتر اساسی در مورد فضاهای اشتراک (کنتاینر) یک پردازنده گرافیکی وجود دارد و آن این است که در یسیاری از محیطها، کنتاینرها نباید از وجود یکدگیر آگاه باشند؛ و در پی آن، یقیناً نباید قادر به برقراری ارتباط با یکدیگر باشند.
هنگامی که کاربران مختلف در حالت مفروض، یک پردازنده گرافیکی را به اشتراک میگذارند، باید درباره مقدار حافظه اختصاص داده شده به هر برنامه تصمیم بگیرند. و این یک مسئله لجستیکی و فنی است.
چرا اینطور است؟
علاوه بر این، بسیاری از برنامههای کاربردی فرض میکنند که تنها خودشان در حال اجرا بر روی پردازنده گرافیکی هستند و به طور پیش فرض کل حافظه GPU را به خود اختصاص میدهند. این یک استراتژی رایج در هنگام استفاده از یک واحد پردازش خارجی (به همراه CPU) است.
بنابراین تغییرات کد برای تغییر در این رفتار پیشفرض، لازم است.
این کار ممکن است آسان به نظر برسد، اما هر کاربری نمیتواند این کار را انجام دهد. زیرا ممکن است نیاز به دانش عمیق از کدنویسی داخلی برنامه و پیکربندی آن داشته باشد.
گاهی حتی ممکن است این کار امکان پذیر نباشد. به عنوان نمونه میتوان به دریافت یک تصویر Docker بدون کنترل برنامهای که در آن اجرا میشود و بدون دسترسی به پیکربندی آن اشاره کرد.
اشتراک گذاری GPU به صورت پویا سخت است
تصمیمگیری درباره اینکه چه مقدار حافظه GPU به هر برنامه اختصاص داده شود، ممکن است برای یک کاربر آسان باشد. زیرا تنها یک نفر است که تصمیم میگیرد.
یک تیم کوچک نیز ممکن است بتواند این کار را انجام دهد، اما به روشی بسیار ناکارآمد.
تیم میتواند یک خط مشی سختگیرانه تصویب کند که در آن هر یک از اعضا سهمی مساوی از GPU را دریافت کند. به عنوان مثال، در یک تیم سه نفره، هر یک از اعضا از یک سوم حافظه گرافیکی استفاده کنند.
این ممکن است عادلانه به نظر برسد، اما پردازنده گرافیکی احتمالاً در بسیاری از زمانها، کمتر از حد خود مورد استفاده قرار میگیرد.
زمانی که هر یک از اعضای تیم سهم خود از حافظه پردازنده گرافیکی را استفاده نکند، یک سوم او بلااستفاده نگه داشته میشود.
این حافظه GPU استفاده نشده، میتوانست به یکی دیگر از اعضای تیم اختصاص داده شود تا او امکان استفاده از حافظه بیشتر، یا اجرای برنامههای بیشتری را داشته باشد. (مثلاً در اجرای مدلهای بزرگتر یا بیشتر)
بهعلاوه، اعضای تیم بدون زیر پا گذاشتن توافقنامه و وارد کردن خطر شکست بر اثر کمبود حافظه (OOM) برای دیگر اعضای تیم، هیچگاه نمیتوانند بیش از سهمی که دارند استفاده کنند.
اشتراک گذاری GPU به طور منصفانه سخت است
تیمها و شرکتها میخواهند پردازنده گرافیکی را به طور مساوی بین کاربران و پروژهها به اشتراک بگذارند، نه بین برنامهها.
به کاربران برای اجرای برنامههای بیشتر نسبت به همکاران خود نباید حافظه GPU بیشتری تعلق گیرد.
مشکل این است که پردازنده گرافیکی هیچچیز در مورد کاربران و پروژهها نمیداند و فقط برنامهها (به بیان دقیقتر فرایندها) را میشناسد. بنابراین، همه برنامهها سهم نسبتاً مساوی از زمان محاسبه دریافت میکنند.
اشتراک گذاری چندین پردازنده گرافیکی بسیار سختتر است
تا به حال ما تنها در مورد یک پردازنده گرافیکی صحبت میکردیم. وقتی درمورد چندین پردازنده گرافیکی صحبت میشود، کار بسیار سختتر است.
بیایید دستهای از سیستمها را در نظر بگیریم که هر کدام دارای چند پردازنده گرافیکی هستند.
به این فکر کنید اشتراک همه این پردازندههای گرافیکی بین تعداد زیادی از کاربران، علیالخصوص با در نظر گرفتن همه موارد فوق چه چالش بزرگی است.
اکنون پردازندههای گرافیکی زیادی وجود دارند که باید برای حجم کاری یک کاربر اختصاص داده شوند و احتمالاً بیش از یک کاربر درگیر هستند. چالش لجستیکی مدیریت این تخصیصها اکنون بسیار بزرگتر است.
سیاستهای سختگیرانهای مانند آنچه که در بالا مورد بحث قرار گرفت، میتواند مورد استفاده قرار گیرد. اما در حال حاضر استفاده از چندین پردازنده گرافیکی مرسوم نیست.
همچنین به یاد داشته باشید که همه کاربران باید باید حجم کاری خود را به صورت تعاملی مدیریت کنند و از محدودیت حافظه GPU خود پا فراتر نگذارند.
وقتی درمورد چند پردازنده گرافیکی (که تعدادشان زیاد هم نیست) صحبت میکنید، به این فکر کنید که این فرایند تا چه حد مستعد ارور است.
حالا به این فکر کنید که وقتی درمورد شبکهای متشکل از صدها پردازنده گرافیکی و کاربر صحبت میکنید، این چالش چقدر بزرگتر است.
و موارد بیشتری وجود دارد.
موارد بیشتر
حتی اگر همه حجمهای کاری با یکدیگر در تعامل باشند و پردازندههای گرافیکی به صورت پویا به همه کاربران اختصاص داده شوند، تصمیمات غیر بهینه، تأثیر زیادی بر استفاده کلی از شبکه خواهد داشت.
به عنوان مثال، الگوریتمهای تخصیص غیر بهینه میتوانند باعث فراگمنت شدن (تکه تکه شدن) حافظه آزاد پردازنده گرافیکی بشوند. برنامهها ممکن است به میزان لازم از حافظه گرافیکی برای اجرا دسترسی پیدا نکنند، حتی اگر کل حافظه آزاد GPU در همه پردازندههای گرافیکی بیش از حد مورد نیاز باشد.
مثال دیگر موردی است که چندین برنامه از یک پردازنده گرافیکی استفاده میکنند، در حالی که پردازندههای گرافیکی آزادی در این کلاستر وجود دارند. این برنامهها به طور کاملاً بیهوده، با کاهش بازده عملکرد مواجه میشوند.
ما در این مقاله با نکات زیادی روبرو شدیم، بنابراین بیایید سعی کنیم که نکات کلیدی را خلاصه کنیم:
- پردازندههای گرافیکی تقریباً بیکار هستند، و همچنین در اکثر مواقع حافظه آزاد زیادی دارند.
- اجرای بیش از یک برنامه بر روی یک پردازنده گرافیکی میتواند مقداری از این بیکاری را جبران کند، زمان بیکاری را به حداقل برساند و استفاده از GPU را به شدت افزایش دهد.
- این موضوع به دلیل نحوه ساخت و کارکرد برنامههای گرافیکی و نحوه مدیریت پردازندههای گرافیکی توسط کاربران و شرکتها تبدیل به یک چالش بزرگ میشود.
Leave feedback about this