آشنایی با هسته ی tensor و کاربردهای آن در پردازنده های گرافیکی

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

انویدیا از سه سال پیش تاکنون، تراشه های گرافیکی مجهز به هسته های افوده ای را تولید می کند که درکنار هسته های عادی مخصوص سایه زنی (Shader) استفاده می شوند. هسته های جدید که تنسور (Tensor) نام دارند، امروزه در بسیاری از کامپیوترهای رومیزی، لپ تاپ ها، ورک استیشن ها و دیتا سنترهای سرتاسر جهان به کار می روند. ساختار این هسته ها چگونه است و آن ها چه کاربردهایی دارند؟ آیا واقعا در کارت گرافیکی لزوما به هسته ی تنسور نیاز داریم؟ درادامه ی مطلب، به همین پرسش ها پاسخ می دهیم.

آموزش کوتاه ریاضی

برای درک عملکرد و کاربرد هسته های تنسور، ابتدا باید ماهیت آن ها را درک کنیم. باید بدانیم هسته های تنسور دقیقا چیست. در ابتدا، باید بدانید ریزپردازنده ها صر ف نظر از ساختار و فرم، برای انجام عملیات ریاضی روی اعداد (جمع، ضرب و…) ساخته می شوند. برخی اوقات اعداد باید با یکدیگر گروه بندی شوند؛ چون معنای خاصی برای یکدیگر دارند. به عنوان مثال، وقتی تراشه ای مشغول پردازش داده برای رندرکردن جلوه های گرافیکی می شود، شاید برای محاسبه ی عامل مقیاس با اعداد صحیح مانند ۲، ۱۱۵ و… سروکار داشته باشد. همین تراشه برای محاسبه ی موقعیت یک نقطه در فضای سه بعدی با اعداد اعشاری کار می کند. در وضعیت آخر، برای رسیدن به موقعیت دقیق به سه قطعه داده نیاز پیدا می کنیم.

تنسور مفهومی ریاضیاتی محسوب می شود که ارتباط بین دیگر مفاهیم ریاضی متصل به یکدیگر را شرح می دهد. این اعداد عموما به صورت آرایه ای از اعداد نشان داده می شوند.

کوچک ترین تنسور تصورپذیر صفر بُعد دارد و تنها یک مقدار را شامل می شود. نام دیگری که برای این تنسور به  کار می رود، اسکالر (عددی) است. با افزایش تعداد بُعدها، با ساختارهای مرسوم دیگر ریاضی رو به رو می شویم:

  • تنسور یک بُعدی: برداری (Vector)
  • تنسور دو بُعدی: ماتریسی (Matrix)

به بیان ساده، هر تنسور اسکالر ساختار 0x0 دارد و تنسور برداری 0x1 و تنسور ماتریسی 1×1 است. درنهایت، برای آسان شدن مفاهیم و ارتباط دادن آن ها به هسته های تنسور در پردازنده های گرافیکی، تنها تنسورهایی در فرم ماتریس را بررسی می کنیم. ضرب یکی از انواع مهم عملیات ریاضی است که روی ماتریس ها انجام می شود.

پاسخ نهایی ضرب ماتریس ها، تعداد سطر برابر با ماتریس اول و تعداد ستون برابر با ماتریس دوم دارد.

ضرب دو ماتریس ساده شامل تعداد زیادی عملیات ضرب و جمع می شود. همه ی پردازنده های کنونی موجود در بازار می توانند همه ی این کارها را انجام دهند؛ درنتیجه هر کامپیوتر رومیزی یا لپ تاپ می تواند تنسورهای ساده را مدیریت کند و وظیفه ی محاسبه ی آن ها را انجام دهد.

هسته ی تنسور به طور خلاصه برای محاسبه های ماتریسی کاربرد دارد

مثال بالا، شامل ۶۴ ضرب و ۴۸ جمع می شود. هر ضرب کوچک مقداری را حاصل می شود که باید در جایی نگه داری و سپس با حاصل سه ضرب بعدی جمع شود. درنهایت، همه ی آن ها باید به تنسور نهایی تبدیل شوند که در جایی دیگر ذخیره خواهد شد. اگرچه ضرب ماتریسی ازلحاظ ریاضیاتی ساده به نظر می رسد، ازلحاظ پردازشی فعالیتی سنگین محسوب می شود. مقادیر زیادی باید در انجام این فرایند ذخیره شوند و حافظه ی کش باید فعالیت های متعدد نوشتن و خواندن را مدیریت کند.

در سال  های متمادی، پردازنده های AMD و اینتل افزونه های متعددی برای مدیریت و محاسبه ی اعداد اعشاری بسیار زیاد در لحظه معرفی کرده اند که ازجمله ی آن ها می توان به MMX و SSE و اخیرا AVX اشاره کرد. همه ی این افزونه ها در دسته  ی SIMD یا «دستورالعمل تکی برای چندین داده» قرار می گیرند؛ درنتیجه، افزونه ها تمامی نیازهای محاسباتی و پردازشی برای ضرب ماتریسی را ارائه می کنند. با وجود قابلیت های مناسب CPU برای مدیریت تنسورها، نوع دیگری از پردازنده وجود دارد که به صورت اختصاصی برای مدیریت وظایف SIMD توسعه می یابد. بله، درست حدس زدید. پردازنده ی گرافیکی یا GPU کاملا مخصوص این فرایندها است.

پردازنده ای بسیار باهوش تر از ماشین حساب

در دنیای جلوه های گرافیکی، باید مجموعه های عظیم داده ای در فرم برداری را در یک لحظه جابه جا و پردازش کرد. توانایی پردازش موازی پردازنده های گرافیکی آن ها را برای برعهده گرفتن پردازش تنسورها به انتخاب های عالی تبدیل می کند. همچنین، همه ی آن ها امروزه از مفهوم جدیدی به نام GEMM یا General Matrix Multiplication پشتیبانی می کنند که عملیاتی پیچیده تر را انجام می دهد. در این عملیات، دو ماتریس در هم ضرب و حاصل آن ها با ماتریس جدیدی جمع می شود. البته سه ماتریس حاضر در عملیات مذکور، محدودیت هایی ازلحاظ تعداد سطر و ستون دارند.

الگوریتم هایی که برای انجام عملیات روی ماتریس ها توسعه پیدا کردند، در محاسبه ی ماتریس های مربعی عملکرد بهتری دارند (به عنوان مثال، ماتریس 10×10 بهتر از 50×2 خواهد بود). همچنین، ماتریس های کوچک تر برای انجام محاسبه بهتر هستند. به هرحال الگوریتم ها زمانی بهترین عملکرد را دارند که در سخت افزاری مخصوص انجام چنین محاسباتی اجرا شوند.

انویدیا در سال ۲۰۱۷ کارت گرافیکی با معماری کاملا جدیدی به نام ولتا (Volta) معرفی کرد. محصول جدید با هدف گیری بازارهای حرفه ای طراحی و ساخته شده بود و تا امروز هیچ یک از پردازنده های گرافیکی GeForce مبتنی بر آن ساخته نشده است. نکته ی بسیار مهم در پردازنده ی جدید، مجهز بودن آن به هسته های مخصوص محاسبه های تنسور بود.

هسته های تنسور انویدیا برای انجام ۶۴ عملیات GEMM در هر چرخه ی کلاک روی ماتریس های 4×4 طراحی شده بودند که اعداد اعشاری تا ابعاد ۱۶ بیتی را شامل باشند (FP16). به بیان دیگر، هسته ها قابلیت انجام ضرب FP16 و جمع با FP32 را داشتند. چنین تنسورهایی بسیار کوچک هستند؛ درنتیجه، وقتی دیتاست هایی با ابعاد واقعی را پردازش می کنند، بلوک های کوچک ماتریس های بزرگ تر را وارد عملیات پردازش می کنند تا به مرور به پاسخ نهایی برند.

کمتر از یک سال بعد، انویدیا معماری تورینگ را معرفی کرد. این بار پردازنده های جی فورس نیز به هسته های تنسور مجهز شده بودند. سیستم به گونه ای به روزرسانی شده بود که فرمت های داده ای (مانند INT8 یا اعداد صحیح هشت بیتی) را هم پشتیبانی می کرد؛ البته به جز به روزرسانی های مذکور ساختار عملیاتی معماری جدید تفاوت زیادی با ولتا نداشت.

در ابتدای سال جاری، انویدیا معماری امپر را در پردازنده های گرافیکی A100 مخصوص دیتا سنتر معرفی کرد. این بار بهره وری و قدرت هسته ها افزایش پیدا کرد و به جای ۶۴ عملیات، ۲۵۶ عملیات GEMM در هر چرخه انجام می شود. به علاوه، فرمت های داده ای جدید هم به مجموعه ی پشتیبانی شده اضافه شد و هسته های جدید توانایی محاسبه و مدیریت سریع تنسورهای کم پشت (ماتریس هایی با تعداد زیاد رقم صفر) را با سرعت بسیار سریع پیدا کردند.

هسته های تنسور در یادگیری عمیق و شبکه ی عصبی کاربرد بسیار زیادی دارند

برنامه نویسان برای دسترسی به هسته های تنسور در تمامی انواع معماری ولتا و تورینگ و امپر کار دشواری در پیش ندارند. کد برنامه باید از یک نشان (Flag) استفاده کند تا به API و درایورها بگوید قصد دارد از هسته ی تنسور استفاده کند. البته نوع داده نیز باید از نوعی باشد که هسته ها پشتیبانی می کنند و ابعاد ماتریس هم باید مضربی از هشت باشد. درنهایت، سخت افزار تمامی کارهای دیگر را انجام می دهد.

توضیحات اولیه نشان داد هسته های تنسور بسیار مناسب هستند و عملکردی چشمگیر دارند. اکنون این سؤال مجددا مطرح می شود که آن ها در انجام فعالیت های GEMM چقدر بهتر از هسته های عادی پردازنده ی گرافیکی عمل می کنند؟ زمانی که معماری ولتا معرفی شد، رسانه ی معتبر آناندتک بررسی کلی و مقایسه ی ریاضی بین سه کارت گرافیک انویدیا انجام داد: یک کارت با معماری جدید ولتا و یک کارت مبتنی بر معماری پاسکال و یک کارت قدیمی مبتنی بر مکسول.

اصطلاح Precision به تعداد بیت   هایی اشاره می کند که برای اعداد اعشاری در ماتریس استفاده می شوند. double برای نشان دادن ۶۴ و Single برای نشان دادن ۳۲ استفاده می شود و Half نیز ۱۶ بیت را نشان می دهد. محور افقی نشان دهنده ی حداکثر عملیات اعشاری است که در هر ثانیه انجام می شود که به  طور خلاصه با اصطلاح فلاپس (FLOPS) می شناسیم (فراموش نکنید هر GEMM به اندازه ی سه FLOP بود).

حال به راحتی می توانید تأثیر هسته های تنسور را در مقایسه با زمان استفاده از فقط هسته های CUDA درک کنید؛ درنتیجه، امروز به طور حتم می دانیم هسته های جدید برای انجام محاسبات این چنینی عالی هستند. اکنون سؤال دیگری داریم: با هسته های تنسور چه کارهایی می توان انجام داد؟

استفاده از ریاضی برای بهبود همه چیز

انجام محاسبه در دنیای تنسور در کاربردهای فیزیک و مهندسی بسیار کارآمد خواهد بود؛ خصوصا در مکانیک سیالات و الکترومغناطیس و فیزیک نجومی، از تنسورها برای حل اکثر مسائل پیچیده استفاده می شود. البته همیشه کامپیوترهایی که برای پردازش این نوع از اعداد استفاده می شدند، عملیات ماتریسی را در مجموعه های عظیم CPU انجام می دادند.

از حوزه های دیگری که قطعا از هسته های تنسور استفاده ی بسیار زیادی خواهد داشت، می توان به یادگیری ماشین اشاره کرد؛ به ویژه در زیرمجموعه ی شبکه ی عصبی، تنسورها کاربرد بسیار زیادی دارند. پردازش های مرتبط در حوزه های مذکور، همگی به مدیریت مجموعه های عظیم داده نیاز دارند که در آرایه های بسیار بزرگ به نام شبکه های عصبی دیده می شوند. در این مفاهیم، ارتباط بین مقادیر گوناگون داده وزن خاصی دارند که اهمیت ارتباط را نشان می دهد.

در ساختاری که گفتیم، وقتی نوبت به محاسبه و مدیریت چگونگی تعامل صدها و هزارها ارتباط می رسد، باید هر تکه از داده را در شبکه با وزن های متفاوت از هر ارتباط ضرب کنید. به بیان دیگر، باید دو ماتریس در هم ضرب شوند که همان عملیات ریاضی تنسور را نشان می دهد؛ به همین دلیل، تمامی اَبَر کامپیوترهای عظیم یادگیری عمیق از پردازنده های گرافیکی متعدد استفاده می کنند که اغلب هم ساخت انویدیا هستند. ناگفته نماند برخی شرکت ها برای نفع نیازهای خاص خود یک قدم فراتر رفته اند و پردازنده های مخصوص هسته ی تنسور تولید کرده اند. به عنوان مثال، گوگل اولین واحد پردازش تنسور (TPU) خود را در سال ۲۰۱۶ معرفی کرد؛ اما این تراشه ها به قدری مخصوص هستند که هیچ کاری به جز محاسبه های ماتریسی انجام نمی دهند.

هسته های تنسور در پردازنده های گرافیکی مصرف کننده (GeForce RTX)

اکنون که به کاربرد هسته های تنسور در پردازش های پیچیده پی برده اید، هنوز این سؤال را مطرح می کنید: کارت گرافیک مصرف کننده مانند GeForce RTX چه استفاده ای از هسته ها می برد؟ به بیان دیگر، آیا کاربر عادی که با پردازش های سنگین فیزیک نجومی یا یادگیری ماشین کاری ندارد، واقعا به این هسته ها نیاز پیدا می کند؟

به طور کلی، هسته های تنسور برای کاربردهایی مانند رندر عادی یا انکود و دیکود ویدئو استفاده نمی شوند؛ پس ظاهرا پول خود را برای قابلیتی هزینه کرده اید که کاربردی ندارد. البته انویدیا از سال ۲۰۱۸ هسته های تنسور را در محصولات مصرف کننده اضافه کرد و اولین محصولات نیز در دسته ی Turing GeForce RTX عرضه شدند و در همان زمان، قابلیت DLSS یا Deep Learning Super Sampling هم در پردازنده ها افزوده شد.

فرضیه ی پایه ای در عملکرد فناوری های جدید در پردازنده های گرافیکی ساده است: ابتدا یک فریم در رزولوشن پایین رندر می شود و پس از پایان رندر، رزولوشن به اندازه ای افزایش پیدا می کند تا به ابعاد نمایشگر برسد (به عنوان مثال، ابتدا در رزولوشن 1080p رندر و سپس به 1400p مقیاس دهی می شود). با چنین روشی، به  دلیل پردازش کردن پیکسل های کمتر و سرعت و کارایی بهتر می شود؛ اما درنهایت، باز هم با تصویری با کیفیت مناسب روی نمایشگر رو به رو می شوید.

کنسول ها از سال ها پیش رویکردی مشابه مراحل بالا را انجام می داده اند. بسیاری از بازی های امروزی دنیای کامپیوتر شخصی نیز همین قابلیت را ارائه می کنند. به عنوان مثال، در بازی Assassin’s Ceeed: Odyssey می توانید رزولوشن رندر را حداکثر ۵۰ درصد ابعاد نمایشگر کاهش دهید؛ ولی متأسفانه نتیجه آن چنان عالی نمی شود.

اجرای بازی در رزولوشن بیشتر، یعنی بافت ها بهتر نمایش داده شوند و جزئیات خوبی هم داشته باشند. متأسفانه آن  همه پیکسل برای تبدیل شدن به تصویر نهایی به پردازش بسیار زیاد نیاز دارند.

برای رفع مشکل یادشده، فناوری DLSS از انویدیا کاربرد پیدا می کند. در نسخه ی اولیه ی این فناوری، تعداد محدودی از بازی ها تحلیل شدند که در حالت های گوناگون با رزولوشن های کم و زیاد و فعال و غیرفعال بودن Anti-Aliasing مقایسه شدند. حالت های گوناگون تصاویر بسیار زیادی تولید کردند که همگی وارد اَبَر کامپیوترهای مخصوص شدند تا با استفاده از شبکه ی عصبی، بهترین روش برای تبدیل کردن تصویر 1080p به تصویری با رزولوشن بیشتر پیدا شود.

فناوری DLSS 1.0 عملکرد آن چنان خوبی نداشت؛ زیرا جزئیات در استفاده از فناوری عموما از بین می رفتند یا در برخی مواقع، با لرزش های عجیب دیده می شدند. به علاوه، فناوری مذکور از هسته های تنسور موجود در کارت گرافیک کامل استفاده نمی کرد. درنهایت، تمامی بازی ها به پشتیبانی DLSS نیاز داشتند تا انویدیا تحلیل اختصاصی روی آن ها شود و الگوریتم مقیاس دهی را بسازد.

نسخه ی دوم DLSS که در ابتدای سال جاری معرفی شد، با بهینه سازی های بسیار زیادی همراه بود. مهم ترین نکته این بود که اَبَر کامپیوترهای انویدیا فقط برای ساختن الگوریتم های مقیاس دهی عمومی استفاده شدند. در نمونه ی جدید DLSS، داده ها از فریم های رندرشده برای پردازش پیکسل ها استفاده می شدند که از هسته ی تنسور پردازنده ی گرافیکی استفاده می کرد.

درحال حاضر، توانایی های DLSS 2.0 بسیار جذاب و درخور توجه هستند؛ اما تعداد محدودی از بازی ها از آن پشتیبانی می کنند که اکنون جمعا به ۱۲ عنوان می رسند. قطعا توسعه دهندگان بیشتری در نسخه های بعدی از بازی های خود به پشتیبانی از این قابلیت فکر می کنند. در بحث عملکرد و قدرت، بهبودهای چشمگیری پیدا می شوند که در هر نوع مقیاس دهی احساس خواهند شد؛ درنتیجه، می توان ادعا کرد DLSS مسیر تکاملی درخور ملاحظه ای در پیش دارد.

خروجی بصری DLSS در همه ی موقعیت ها عالی نیست و عملکرد و قدرت پردازش گرافیکی نیز بهبود پیدا می کند و توسعه دهندگانمی توانند جلوه های بصری بیشتری ارائه کنند. آن ها می توانند به سمتی پیش بروند که جلوه های گرافیکی در مجموعه ی گسترده تری از پلتفرم ها خروجی یکسان داشته باشند.

در اغلب مواقع، DLSS درکنار قابلیت رهگیری پرتو و در بازی های RTX enabled دیده می شود. پردازنده های گرافیکی انویدیا GeForce RTX با واحدهای پردازشی اضافه ای به نام هسته های RT عرضه می شوند. این واحدهای منطقی مخصوص شتاب دهی به پردازش های ray-triangle در پرتوهای نور و BVH هستند. به بیان ساده، دو نوع پردازش مذکور برای رندرکردن و محاسبه ی جلوه ی برخورد نور به دیگر اجسام موجود در صحنه استفاده می شوند و زمان زیادی هم برای پردازش نیاز دارند.

پردازش رهگیری پرتو فشار زیادی به پردازنده وارد می کند؛ درنتیجه، توسعه دهندگان برای ارائه ی تجربه ی مناسب بازی باید تعداد پرتوها و بازتاب های موجود در صحنه را کاهش دهند. این فرایند شاید به ایجاد تصاویر با نویز فراوان منجر شود؛ بنابراین، استفاده از الگوریتم کاهش نویز نیز احساس می شود. درمجموع، باز هم فشار و پیچیدگی پردازش افزایش خواهد یافت. در چنین موقعیتی، هسته های تنسور با استفاده از کاهش نویز مبتنی بر هوش مصنوعی به بهبود عملکرد کمک می کنند. البته چنین کاربردی هنوز به مرحله ی اجرا نرسیده است و اکثر اپلیکیشن های کنونی از هسته های CUDA برای پردازش مذکور استفاده می کنند. گفتنی است با تکامل پیداکردن DLSS و حضور DLSS 2.0 به عنوان روش مقیاس دهی مطمئن، هسته های تنسور می توانند به خوبی برای تقویت نرخ فریم پس از اجرای رهگیری پرتو در صحنه استفاده شوند.

برنامه های متعدد دیگری هم برای هسته های تنسور در کارت های GeForce RTX وجود دارد؛ ازجمله حرکت بهتر شخصیت ها یا شبیه سازی لباس ها. درنهایت، مانند وضعیتی که برای DLSS 1.0 داشتیم، تا رسیدن به وضعیتی که صدها بازی از محاسبه های مخصوص ماتریسی در پردازنده های گرافیکی استفاده کنند، زمان زیادی نیاز داریم.

امید به آینده فناوری

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

اینتل و AMD در پردازنده های گرافیکی خود هسته های تنسور ندارند؛ اما شاید در آینده فناوری مشابهی عرضه کنند. AMD اکنون سیستمی برای شارپ کردن و افزایش جزئیات در فریم های کامل شده دارد که تأثیر کمی هم بر سرعت و بهره وری پردازش می گذارد. شاید تیم قرمز روی همان فناوری متمرکز بماند؛ زیرا مزایای درخور توجهی هم دارد. به عنوان مثال، نیازی نیست توسعه دهندگان آن را در کدهای خود ادغام کنند و تنها با کمی تغییر در درایور اجرا می شود.

برخی اعتقاد دارند فضای قالب در تراشه های گرافیکی باید هرچه بهتر برای اضافه کردن هسته های سایه زنی استفاده شود. انویدیا این کار را در تراشه های اقتصادی مبتنی بر تورینگ انجام داد. محصولاتی همچون GeForce GTX 1650 اصلا به هسته های تنسور مجهز نبودند و درعوض، هسته های سایه زنی FP16 بیشتری داشتند.

درپایان باید بگوییم اگر به دنبال انجام پردازش ها و محاسبه های سریع روی عملیات GEMM هستید، دو راه بیشتر پیش روی شما نخواهد بود: ۱. استفاده از تعداد زیادی CPU به صورت تجمیعی؛ ۲. استفاده از پردازنده ی گرافیکی مجهز به هسته های تنسور.

منبع: زومیت.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

4 × پنج =

لطفا پاسخ عبارت امنیتی را در کادر بنویسید. *