پردازش سریع داده‌ها با استفاده از فناوری GPUDirect شرکت NVIDIA

فناوری GPU-Direct که توسط NVIDIA توسعه یافته است به GPUها این امکان را می‌دهد تا به طور مستقیم با یکدیگر و با سایر بخش‌های سیستم ارتباط برقرار کنند بدون آنکه نیاز به عبور از کانال CPU وجود داشته باشد. این تکنولوژی با کاهش تاخیر و افزایش سرعت انتقال داده‌ها، بهره‌وری را در برنامه‌های محاسباتی با عملکرد بالا، یادگیری عمیق و هوش مصنوعی به طور قابل توجهی افزایش می‌دهد. با استفاده از GPU-Direct، داده‌ها می‌توانند مستقیماً بین حافظه‌های GPU و سایر دستگاه‌های ورودی/خروجی منتقل شوند که منجر به بهبود کارایی و کاهش مصرف منابع سیستمی می‌شود. این فناوری به خصوص در محیط‌های محاسباتی بزرگ و پیچیده که نیاز به پردازش همزمان حجم عظیمی از داده‌ها وجود دارد، مزایای بسیاری به همراه دارد. در ادامه معماری سطح بالا و عناصر مهم در استفاده از این فناوری را مرور می کنیم.

معماری سطح بالای GPUDirect شامل دو کاربرد مختلف است. یکی ارتباط مستقیم از استوریج به GPU بوده و دیگری ارتباط مستقیم از واسط شبکه به GPU است. همانطور که در شکل 1 نمایش داده شده است، با استفاده از فناوری GPUDirect دیگر نیازی به استفاده از حافظه اصلی سیستم و درگیر کردن CPU در خواندن/نوشتن روی استوریج نیست. بلکه این کار به صورت مستقیم و از طریق سوییچ PCIe به طور مستقیم انجام می گیرد (شکل سمت راست). اگر دسترسی به GPUDirect وجود نداشته باشد، لازم است تا اطلاعات ابتدا از استوریج به حافظه اصلی سیستم منتقل شده و سپس از طریق CPU در اختیار GPU قرار گیرند که در نتیجه سرعت و پهنای باند انتقال اطلاعات از طریق CPU خود گلوگاه شده و باعث می شود از ظرفیت پردازش بالا و موازی GPU نتوانیم به درستی بهره برداری کنیم (شکل سمت چپ).

شکل 1- معماری GPUDirect در ارتباط بین GPU و استوریج
شکل 1- معماری GPUDirect در ارتباط بین GPU و استوریج


مدل دوم که در دنیای واقعی مسائل بیشتری را حل می کند خواندن مستقیم اطلاعات از روی واسط شبکه است. همانطور که در شکل 2 نشان داده شده، دو کامپیوتر که هر کدام دارای GPU هستند، می توانند از طریق واسط شبکه با یکدیگر و به طور مستقیم ارتباط داشته باشند. به این صورت که هر کدام از GPUها از طریق سوییچ PCIe به کارت شبکه متصل شده و از طریق فناوری GPUDirect می توانند به صورت مستقیم اطلاعات تبادل کنند. این کار باعث می شود تا با افزایش پهنای باند ورودی بتوان اطلاعات را به طور مستقیم، بدون واسطه و با سرعت بالا روی GPUها پردازش کرد. در این مدل، فناوری GPUDirect به قابلیت RDMA یا همان Remote Direct Memory Access وابسته است. این فناوری توسط کارت های شبکه از خانواده ConnectX ارائه می شود.

شکل 2- معماری GPUDirect در اراتباط بین GPU و کارت شبکه با فناوری ConnectX
شکل 2- معماری GPUDirect در اراتباط بین GPU و کارت شبکه با فناوری ConnectX


دقت شود که در هر دو مدل معماری GPUDirect، لازم است تا GPUها از قابلیت GPUDirect که توسط NVIDIA ارائه شده، پشتیبانی نمایند. در ادامه لیستی از GPUهایی که این فناوری را پشتیبانی می کنند، ارائه می گردد:

  • RTX A6000, A5500, A5000, A4500, A4000
  • Quadro RTX 8000, 6000, 5000, 4000
  • Quadro GV100, GP100, P6000, P5000, P4000
  • Quadro M6000, M5000, M4000
  • Quadro K4000, K4200, K5000, K5200 and K6000
  • Quadro 4000, 5000, and 6000
  • Quadro M5000M equipped mobile workstations
  • Quadro K5100M equipped mobile workstations
  • A2, A10, A30, A16, A40, A100
  • GRID K1 and K2
  • Tesla T4
  • Tesla V100, P100, K10, K20, K20X, K40
  • Tesla C2075 and M2070Q

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

اجزای سخت‌افزاری:

  • واحدهای پردازش گرافیکی (GPUs): پردازش‌های سنگین محاسباتی و موازی‌سازی داده‌ها توسط GPUها انجام می‌شود. دو مدل از GPUهای متداول NVIDIA Tesla V100 و A100 هستند که معمولاً برای کاربردهای هوش مصنوعی و یادگیری عمیق استفاده می‌شوند.
  • کارت شبکه با پشتیبانی از RDMA: کارت‌های شبکه InfiniBand یا Ethernet با قابلیت RDMA به انتقال سریع داده‌ها کمک می‌کنند. این کارت‌ها، داده‌ها را مستقیماً به حافظه GPU منتقل می‌کنند که در آن نیازی به استفاده از CPU و حافظه اصلی سیستم نیست.
  • سرور میزبان: سرورهای قدرتمند مانند HP ProLiant DL580 Gen10 که قابلیت پشتیبانی از چندین GPU و کارت شبکه با پهنای باند بالا را دارند. البته بسته به پهنای باند مورد نیاز و همچنین استفاده از قابلیت PCIe نسل 4 و 5 ممکن است نیاز به نسل های جدید سرورهای HP یا سرورهای تخصصی هوش مصنوعی داشته باشید.
  • حافظه سیستم: حافظه رم (RAM) سرور برای ذخیره و مدیریت داده‌ها قبل و بعد از پردازش توسط GPUها قابل استفاده است.
  • استوریج با سرعت بالا: استوریج های با فناوری NVMe SSD برای دسترسی سریع به داده‌ها الزامی است در غیر این صورت، استوریج خود گلوگاه می شود.

اجزای نرم‌افزاری:

  • درایورهای NVIDIA: درایورهای مناسب برای کارت‌های گرافیک و بسته نرم‌افزاری CUDA که امکان برنامه‌نویسی روی GPU را فراهم می‌کند.
  • کتابخانه‌های نرم‌افزاری: کتابخانه‌های cuDNN و NCCL برای بهینه‌سازی پردازش‌ یادگیری عمیق و ارتباط بین GPUها به طور متداول مورد استفاده قرار می گیرد.
  • سیستم‌عامل: سیستم‌عامل بر مبنای لینوکس (مثل Ubuntu یا CentOS) که برای اجرای نرم‌افزارهای هوش مصنوعی و مدیریت منابع سخت‌افزاری بهینه شده است، توصیه می شود.
  • نرم‌افزارهای مدیریت و نظارت: نرم‌افزارهای مدیریت منابع مانند NVIDIA Management Library یا همان NVML و ابزارهای مانیتورینگ مانند Prometheus و Grafana.
شکل 3- مدل ارتباطی مبتنی بر RDMA بین GPU و سایر ابزارها از طریق پورت استاندارد PCIe
شکل 3- مدل ارتباطی مبتنی بر RDMA بین GPU و سایر ابزارها از طریق پورت استاندارد PCIe


شکل 3 نمای کلی از ارتباطات مبتنی بر RDMA بین GPU و ابزارهای استوریج و شبکه را نمایش می دهد که عموما از طریق PCIe انجام می شود. فناوری ConnectX مبتنی بر همین ارتباطات توسعه یافته است. انواع واسط های شبکه مورد استفاده از این خانواده در ادامه می آید. سری کارت‌های شبکه ConnectX شرکت NVIDIA برای ارائه عملکرد بالا، تأخیر کم و ویژگی‌های پیشرفته در برنامه‌های مختلفی از جمله رایانش ابری، مراکز داده، هوش مصنوعی، یادگیری ماشین و محاسبات با عملکرد بالا (HPC) طراحی شده‌اند. همه این کارت‌ها از قابلیت GPUDirect پشتیبانی می‌کنند اما در سرعت، عملکرد و پهنای باند متفاوت هستند:

  • کارت شبکه ConnectX-4 Lx: سرعت تا 25 گیگابیت بر ثانیه، پشتیبانی از Remote Direct Memory Access بر روی Ethernet، مناسب برای ارتباطات با تاخیر کم، مناسب برای ذخیره‌سازی، مراکز داده و محیط‌های ابری.
  • کارت شبکه ConnectX-5: سرعت تا 100 گیگابیت بر ثانیه، پشتیبانی از قابلیت‌های پیشرفته RDMA و GPUDirect، بهبود پشتیبانی از مجازی‌سازی و آفلودهای سخت‌افزاری برای NVMe over Fabric یا همان NVMe-oF و سایر پروتکل‌های ذخیره‌سازی.
  • کارت شبکه ConnectX-6 Lx: سرعت تا 25 گیگابیت بر ثانیه (25G) و 50 گیگابیت بر ثانیه (50G)، پشتیبانی از RDMA و امنیت پیشرفته شامل ویژگی‌های امنیتی مانند Secure Boot و رمزگذاری داده‌ها برای محافظت از داده‌ها در حین انتقال.
  • کارت شبکه ConnectX-6 Dx: سرعت تا 200 گیگابیت بر ثانیه، دارای ویژگی‌های امنیتی پیشرفته از جمله آفلودهای IPsec و TLS، عملکرد بهبود یافته RoCE و پشتیبانی پیشرفته از برنامه‌های ابری و مراکز داده.
  • کارت شبکه ConnectX-7: سرعت تا 400 گیگابیت بر ثانیه، آخرین مدل در این سری، با عملکرد برتر، تسریع NVMe بر روی TCP، قابلیت‌های پیشرفته GPUDirect و ویژگی‌های امنیتی قوی برای مراکز داده مدرن و بارهای کاری هوش مصنوعی.

برای استفاده از فناوری GPUDirect با بهره‌گیری از کتابخانه‌های CUDA، می‌توان از زبان‌های برنامه‌نویسی پایتون یا C استفاده کرد. در اینجا یک مثال ساده با هر دو زبان برای آشنایی بیشتر، تشریح می‌شود:

مثال زیر نحوه استفاده از GPUDirect RDMA را با زبان C نشان می‌دهد. این کد اجازه می‌دهد تا داده‌ها به صورت مستقیم بین حافظه GPU و دستگاه‌های دیگر انتقال یابند. در کد C یک آرایه از داده‌ها به اندازه 1024 عنصر در حافظه میزبان ایجاد و مقداردهی اولیه می‌شود. سپس حافظه‌ای در GPU برای این داده‌ها تخصیص داده شده و داده‌ها از حافظه میزبان به GPU انتقال داده می‌شوند. یک کرنل CUDA به نام kernel روی داده‌های GPU اجرا شده که در این کرنل، هر عنصر از آرایه دو برابر می‌شود. پس از اتمام محاسبات، داده‌های تغییر یافته از GPU به حافظه میزبان برمی‌گردند. در نهایت، حافظه تخصیص داده شده در GPU آزاد و حافظه میزبان نیز آزاد می‌شود.

شکل 4- پیاده‌سازی GPUDirect با استفاده از کد C و کتابخانه‌های CUDA
شکل 4- پیاده‌سازی GPUDirect با استفاده از کد C و کتابخانه‌های CUDA

مثال زیر کد مشابهی را به زبان پایتون نشان می‌دهد که از کتابخانه Numba استفاده کرده و یک محیط برنامه‌نویسی مبتنی بر CUDA فراهم می‌کند. در کد پایتون زیر از کتابخانه Numba برای برنامه‌نویسی CUDA استفاده شده است. ابتدا یک آرایه از داده‌ها به اندازه 1024 عنصر در حافظه میزبان (host) ایجاد و مقداردهی اولیه می‌شود. سپس این آرایه به حافظه دستگاه (device) یعنی GPU انتقال داده می‌شود. کرنل CUDA که به نام kernel تعریف شده، داده‌ها را دو برابر می‌کند. این کرنل با استفاده از تعداد مشخصی از بلوک‌ها و نخ‌ها اجرا می‌شود. در نهایت، داده‌های تغییر یافته از GPU به حافظه میزبان برگردانده و چاپ می‌شوند.

شکل 5- پیاده‌سازی GPUDirect با استفاده از کد پایتون و کتابخانه‌های Numpy
شکل 5- پیاده‌سازی GPUDirect با استفاده از کد پایتون و کتابخانه‌های Numpy


منابع: