راز قدرت شگفت انگیز TPU در یادگیری ژرف چیست؟

[latexpage]

واحد پردازش تنسور (Tensor Processing Unit یا TPU) یک چیپ مدار مجتمع با کاربرد خاص (ASIC) است که از پایه توسط گوگل برای پردازش های یادگیری ماشین طراحی شده است. TPU ها قوای محرک کنونی سرویس های مختلف گوگل نظیر Translate، Photos، Search Assistant و Gmail هستند. سامانه ابری TPU امکان استفاده از TPU را به عنوان یک منبع محاسبات ابری سهل الاستفاده و مقیاس پذیر (Scalable) برای همه توسعه دهندگان و محققان علوم داده که به طراحی و توسعه مدل های یادگیری ماشین بدیع می پردازند، فراهم می آورد. در کنفرانس Google Next سال ۲۰۱۸، گوگل اعلام کرد که نسخه دوم سامانه ابری TPU برای همه کاربران در دسترس قرار گرفته و نسخه سوم آن نیز در مرحله آزمایش (در سطح alpha) است.

اما بسیاری از مردم می پرسند که تفاوت های بین CPU، GPU و TPU چیست؟ در این مطلب، تلاش می کنیم که برخی از شاخص ترین ویژگی های TPU را بررسی نماییم.

شبکه های عصبی چگونه کار می کنند؟

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

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

اگر یک تصویر از شبکه ای ۲۸ در ۲۸ از نقاط با طیف خاکستری (Grayscale) شکل گرفته باشد، می توان آن را به برداری با ۷۸۴ عضو تبدیل کرد. نورون مصنوعی ای که رقم $8$ را شناسایی می کند، مقادیر این ۷۸۴ عضو را گرفته و در مقادیر پارامترهای لایه (وزن ها)‌ ضرب می کند (خطوط قرمز رنگ در تصویر بالا).

پارامترها نقش فیلترهایی را ایفاء می کنند که ویژگی هایی را از داده ها که نشان گر مشابهت تصویر و شکل هندسی عدد $8$ است، استخراج می نمایند. درست مثل چیزی که در تصویر زیر نمایش داده شده است:

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

در بیان کوتاه، شبکه های عصبی به انجام حجم عظیمی از عملیات ضرب و جمع بین داده ها و پارامترها نیاز دارند. ما عموماً این عملیات را در قالب ضرب ماتریسی (Matrix Multiplication) سازماندهی می کنیم، که احتمالاً در دوران دبیرستان با آن برخورد داشته اید. بنابراین، مسأله این است که چطور می توانیم عملیات گسترده ضرب ماتریسی را به سریع ترین نحو ممکن و با کمترین مصرف انرژی به انجام برسانیم.

CPU چگونه کار می کند؟

CPU چگونه به مسأله پیش گفته ورود می کند؟ CPU یک پردازنده چند-منظوره (General Purpose) بر پایه معماری وان نیومن (von Neumann Architecture)‌ است. این بدان معنی است که CPU در ترکیب با نرم افزار و حافظه کار می کند. مثل تصویر زیر:

نحوه عمل CPU (این انیمیشن تنها برای نمایش مفهومی ساخته شده است و رفتار پردازنده های واقعی را نشان نمی دهد).

بهترین مزیت CPU انعطاف پذیری عملکرد آن است. با داشتن معماری وان نیومن، شما می توانید هر نوع نرم افزاری (ساخته شده برای میلیون ها کاربرد متفاوت) را بر روی آن بارگذاری کنید. از CPU می توان برای پردازشگرهای متن (Word Processing) در کامپیوترهای شخصی، کنترل موتور موشک ها، اجرای تراکنش های مالی بین بانکی، و یا طبقه بندی تصاویر به کمک شبکه های عصبی استفاده کرد.

اما، به دلیل انعطاف پذیری بسیار بالای CPU، سخت افزار عموماً نمی داند که محاسبه بعدی ای که باید انجام بدهد چیست مگر تا زمانی که دستورالعمل بعدی را از نرم افزار دریافت کند. CPU مجبور است که نتایج محاسبات را در حافظه داخلی خود (که به کش سطح ۱ یا L1 Cache مشهور است) برای هر یک محاسبه ذخیره کند. این نیاز به دسترسی به حافظه، نقطه ضعف معماری CPU است که با عنوان گلوگاه وان نیومن (von Neumann bottleneck) شناخته می شود. با وجود حجم عظیم محاسبات شبکه های عصبی، گام های بعدی این محاسبات همگی قابل پیش بینی هستند. لکن، واحدهای منطق ریاضی در CPU (یا ALU ها که متولی عملیات ضرب و جمع هستند) کماکان آن ها را یکی پس از دیگری اجرا می کند و در هر مرحله به حافظه مراجعه می نماید. این امر نرخ پردازش CPU را محدود می کند و مصرف انرژی قابل ملاحظه ای را نیز می طلبد.

‌GPU چگونه کار می کند؟

برای افزایش نرخ پردازش به فراتر از آن چه CPU قادر به آن است، یک GPU از راهبرد ساده ای استفاده می کند: چرا از هزاران ALU در یک پردازنده استفاده نکنیم؟ یک GPU مدرن معمولاً بین ۲۵۰۰ تا ۵۰۰۰ واحد ALU در خود جای داده است که به معنی توان اجرای هزاران عملیات ضرب و جمع به طور هم زمان است.

نحوه کار یک ‌GPU (این انیمیشن تنها برای نمایش مفهومی ساخته شده است و رفتار پردازنده های واقعی را نشان نمی دهد).

این معماری GPU در کاربردهایی که به میزان عظیمی از پردازش موازی (Parallelism)‌ نیاز دارند نظیر ضرب ماتریسی در شبکه های عصبی، بسیار خوب عمل می کند. در حقیقت، با استفاده از GPU شاهد نرخ پردازش چندین برابری در فرآیندهای معمول آموزش در یادگیری ژرف (Deep Learning) خواهیم بود. این دلیل محبوبیت GPU در میان توسعه دهندگان یادگیری ماشین در حال حاضر است.

اما، GPU نیز کماکان یک پردازنده چند-منظوره است که باید از کاربردها و نرم افزارهای متنوعی پشتیبانی کند. این مسأله GPU را نیز گرفتار مشکل بنیادین گلوگاه وان نیومن می کند. برای هر یک محاسبه در هزاران ALU تعبیه شده، GPU مجبور است به حافظه اشتراکی مراجعه کرده و نتایج میانی محاسبات را بخواند یا ذخیره نماید. به دلیل آن که GPU محاسبات موازی بیشتری را بر روی هزاران ALU خود به انجام می رساند، به همان نسبت به انرژی بیشتری برای دسترسی به حافظه و همچنین سیم کشی های میکروسکوپی پیچیده برای ایجاد ارتباط بین واحدهای منطق ریاضی و حافظه نیازمند است.

TPU چگونه کار می کند؟

گوگل معماری TPU را بر اساس نیازهای یک حوزه خاص طراحی نموده است. به این معنی که، به جای طراحی یک پردازنده چند-منظوره، TPU به عنوان یک پردازنده ماتریسی (Matrix Processor)‌ مخصوص بار پردازشی آموزش شبکه های عصبی طراحی شده است. TPU توان اجرای یک نرم افزار پردازشگر متن، کنترل موتور موشک ها و یا اجرای تراکنش های مالی بین بانکی را ندارد! در مقابل می تواند حجم عظیمی از عملیات ضرب و جمع ماتریسی در شبکه های عصبی را با سرعت های شگفت انگیز و در حالی که انرژی کمتری مصرف کرده و به لحاظ ساختار فیزیکی شکل پیچیدگی کمتری دارد، به انجام رساند.

عامل کلیدی این اتفاق، رفع گلوگاه وان نیومن است. وظیفه اصلی این پردازنده تنها پردازش های ماتریسی است و طراحان TPU تمام گام های مورد نیاز برای انجام عملیات محاسبات ماتریسی را از پیش می دانسته اند. به همین دلیل توانسته اند هزاران واحد ضرب و جمع کننده را در TPU تعبیه کرده و آن ها را به نحوی به هم متصل کنند که نسخه های فیزیکی و ماتریس شکل از این عملگرها بسازند. این حالت تحت عنوان معماری آرایه سیستولیک شناخته می شود. گوگل در Cloud TPU v2، دو آرایه سیستولیک با ابعاد ۱۲۸ در ۱۲۸، با جمعاً ۳۲،۷۶۸ واحد منطق ریاضی (ALU) برای مقادیر اعشاری ۱۶ بیتی را در یک پردازنده جای داده است.

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

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

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

هزینه ها تا یک پنجم کاهش خواهد یافت!

اما به لحاظ کمّی، سودی که از استفاده از TPU حاصل می شود چقدر است؟ جدول زیر قیمت استفاده از Cloud TPU v2 را در پایان سال ۲۰۱۸ نشان می دهد:

قیمت گذاری استفاده از Cloud TPU v2 در پایان سال ۲۰۱۸

دانشگاه استنفورد ابزاری به نام DAWNBench را عرضه کرده است که برای ارزیابی نحوه عمل سامانه های یادگیری ژرف طی آموزش و همچنین هنگام به کارگیری طراحی شده است. شما می توانید ترکیب های متنوعی از وظایف، مدل ها، پلتفرم های محاسباتی و نتایج ارزیابی مربوط به آن ها را نیز در DAWNBench بیابید.

در پایان سال ۲۰۱۸، کمترین هزینه محاسبه شده برای پردازنده های غیر TPU، برابر ۷۲.۴۰ دلار (برای آموزش شبکه ResNet-50 با ۹۳٪ دقت با استفاده از مجموعه داده ImageNet) بوده است. با بهره گیری از Cloud TPU v2، شما می توانید آموزش مشابه را با هزینه تنها ۱۲.۸۷ دلار به انجام برسانید که تقریباً یک پنجم هزینه استفاده از غیر TPU است.