با پیشرفتهای اخیر و شتابزده در یادگیری ماشینی (ML)، ماشینها میتوانند زبان طبیعی را بفهمند، در مکالمه شرکت کنند، تصاویر بکشند، ویدیو بسازند و موارد دیگر. مدلهای مدرن ML با استفاده از چارچوبهای برنامهنویسی ML، مانند TensorFlow، JAX، PyTorch و بسیاری دیگر، برنامهریزی و آموزش داده میشوند. این کتابخانهها دستورالعملهای سطح بالایی را به پزشکان ML ارائه میکنند، مانند عملیات جبر خطی (به عنوان مثال، ضرب ماتریس، کانولوشن، و غیره) و لایههای شبکه عصبی (به عنوان مثال، لایههای پیچشی دوبعدی، لایههای ترانسفورماتور). نکته مهم این است که پزشکان نباید نگران این باشند که چگونه مدل های خود را به طور موثر بر روی سخت افزار اجرا کنند زیرا یک چارچوب ML به طور خودکار مدل کاربر را از طریق یک زیربنا بهینه می کند. کامپایلر. بنابراین، کارایی بار کاری ML به میزان خوب بودن کامپایلر بستگی دارد. یک کامپایلر معمولاً برای حل مسائل پیچیده بهینهسازی به اکتشافی متکی است که اغلب منجر به عملکرد کمتر از حد مطلوب میشود.
در این پست وبلاگ، ما پیشرفت های هیجان انگیز در ML برای ML را ارائه می دهیم. به طور خاص، ما نشان می دهیم که چگونه از ML برای بهبود کارایی بارهای کاری ML استفاده می کنیم! کارهای قبلی، چه داخلی و چه خارجی، نشان داده اند که ما می توانیم از ML برای بهبود عملکرد برنامه های ML با انتخاب تصمیمات بهتر کامپایلر ML استفاده کنیم. اگرچه مجموعه داده های کمی برای پیش بینی عملکرد برنامه وجود دارد، آنها برنامه های فرعی کوچکی مانند بلوک های اصلی یا هسته ها را هدف قرار می دهند. ما «TpuGraphs: مجموعه دادههای پیشبینی عملکرد بر روی نمودارهای محاسباتی تانسور بزرگ» را معرفی میکنیم (ارائه شده در NeurIPS 2023)، که اخیراً آن را منتشر کردهایم تا تحقیقات بیشتری در ML برای بهینهسازی برنامه ایجاد کنیم. ما میزبان رقابت Kaggle بر روی مجموعه داده ها بودیم که اخیراً با 792 شرکت کننده در 616 تیم از 66 کشور به پایان رسید. علاوه بر این، در «یادگیری پیشبینی ویژگی نمودار بزرگ از طریق آموزش بخش نمودار»، ما یک روش جدید برای مقیاسبندی آموزش شبکههای عصبی گراف (GNN) برای مدیریت برنامههای بزرگ ارائهشده به صورت نمودار پوشش میدهیم. این تکنیک هم امکان آموزش نمودارهای بزرگ دلخواه را روی دستگاهی با ظرفیت حافظه محدود می دهد و هم تعمیم مدل را بهبود می بخشد.
کامپایلرهای ML
کامپایلرهای ML روال های نرم افزاری هستند که برنامه های نوشته شده توسط کاربر (در اینجا دستورالعمل های ریاضی ارائه شده توسط کتابخانه هایی مانند TensorFlow) را به فایل های اجرایی (دستورالعمل هایی برای اجرا بر روی سخت افزار واقعی) تبدیل می کنند. یک برنامه ML را می توان به عنوان یک نمودار محاسباتی نشان داد، که در آن یک گره یک عملیات تانسور (مانند ضرب ماتریس) را نشان می دهد، و یک یال نشان دهنده تانسوری است که از یک گره به گره دیگر جریان دارد. کامپایلرهای ML باید بسیاری از مسائل بهینه سازی پیچیده را حل کنند، از جمله در سطح نمودار و در سطح هسته بهینه سازی ها یک بهینهسازی در سطح نمودار برای تصمیمگیری بهینه به بافت کل نمودار نیاز دارد و بر این اساس کل نمودار را تغییر میدهد. یک بهینه سازی در سطح هسته، یک هسته (یک زیرگراف ذوب شده) را در یک زمان، مستقل از سایر هسته ها تبدیل می کند.
بهینه سازی های مهم در کامپایلرهای ML شامل بهینه سازی در سطح گراف و سطح هسته است. |
برای ارائه یک مثال عینی، یک ماتریس (تانسور دو بعدی) را تصور کنید:
می توان آن را در حافظه کامپیوتر ذخیره کرد [A B C a b c] یا [A a B b C c]، که به ترتیب به عنوان چیدمان حافظه اصلی ردیف و ستون شناخته می شود. یکی از مهمترین بهینهسازیهای کامپایلر ML، اختصاص طرحبندی حافظه به تمام تانسورهای میانی در برنامه است. شکل زیر دو پیکربندی مختلف چیدمان را برای یک برنامه نشان می دهد. بیایید فرض کنیم که در سمت چپ، چیدمان های اختصاص داده شده (قرمز) کارآمدترین گزینه برای هر اپراتور جداگانه است. با این حال، این پیکربندی چیدمان به کامپایلر نیاز دارد که a را وارد کند کپی ? عملیات تبدیل طرح حافظه بین اضافه کردن و پیچیدگی عملیات از سوی دیگر، پیکربندی سمت راست ممکن است برای هر اپراتور مجزا کمتر کارآمد باشد، اما نیازی به تبدیل حافظه اضافی ندارد. بهینه سازی تخصیص طرح باید بین راندمان محاسبات محلی و سربار تبدیل چیدمان معامله شود.
یک گره نشان دهنده یک عملگر تانسور است که با شکل تانسور خروجی آن حاشیه نویسی شده است [n0, n1, …]، جایی که nمن اندازه ابعاد است من. چیدمان {د0، د1، …} نشان دهنده ترتیب جزئی به بزرگ در حافظه است. پیکربندی های اعمال شده با رنگ قرمز و سایر تنظیمات معتبر با رنگ آبی مشخص می شوند. یک پیکربندی layout چینش ورودی ها و خروجی های عملگرهای تاثیرگذار را مشخص می کند (یعنی پیچیدگی و تغییر شکل). یک عملگر کپی در صورت عدم تطابق طرح درج می شود. |
اگر کامپایلر انتخاب های بهینه ای داشته باشد، می توان سرعت های قابل توجهی را ایجاد کرد. به عنوان مثال، ما در هنگام انتخاب یک پیکربندی چیدمان بهینه نسبت به پیکربندی کامپایلر پیشفرض در مجموعه محک XLA، تا 32 درصد افزایش سرعت داشتهایم.
مجموعه داده TpuGraphs
با توجه به موارد فوق، هدف ما بهبود کارایی مدل ML با بهبود کامپایلر ML است. به طور خاص، تجهیز کامپایلر می تواند بسیار موثر باشد با مدل هزینه آموخته شده که یک برنامه ورودی و پیکربندی کامپایلر را می گیرد و سپس زمان اجرا پیش بینی شده برنامه را خروجی می کند.
با این انگیزه، TpuGraphs را منتشر میکنیم، مجموعه دادهای برای یادگیری مدلهای هزینه برای برنامههایی که روی واحدهای پردازش تنسور سفارشی Google (TPU) اجرا میشوند. مجموعه داده دو پیکربندی کامپایلر XLA را هدف قرار می دهد: چیدمان (تعمیم ترتیب ردیف و ستون اصلی، از ماتریس ها، تا تانسورهای بعد بالاتر) و کاشی کاری (پیکربندی اندازه های کاشی). ما دستورالعمل های دانلود و کد شروع را در TpuGraphs GitHub ارائه می دهیم. هر نمونه در مجموعه داده شامل یک نمودار محاسباتی از حجم کاری ML، یک پیکربندی کامپایل، و زمان اجرای نمودار هنگام کامپایل شدن با پیکربندی است. نمودارهای موجود در مجموعه داده از برنامههای ML منبع باز جمعآوری شدهاند که شامل معماریهای مدل محبوب، مانند ResNet، EfficientNet، Mask R-CNN و Transformer است. مجموعه داده 25× نمودارهای بیشتری نسبت به بزرگترین مجموعه داده های پیش بینی ویژگی گراف (با اندازه های نمودار قابل مقایسه) ارائه می دهد و اندازه نمودار در مقایسه با مجموعه داده های پیش بینی عملکرد موجود در برنامه های ML به طور متوسط 770× بزرگتر است. با این مقیاس بسیار گسترده، برای اولین بار میتوانیم وظیفه پیشبینی در سطح نمودار را در نمودارهای بزرگ بررسی کنیم، که در معرض چالشهایی مانند مقیاسپذیری، کارایی آموزش و کیفیت مدل است.
مقیاس TpuGraphs در مقایسه با سایر مجموعه دادههای پیشبینی ویژگی گراف. |
ما مدل های هزینه آموخته شده پایه را با مجموعه داده خود ارائه می دهیم (معماری نشان داده شده در زیر). مدلهای پایه ما مبتنی بر یک GNN هستند، زیرا برنامه ورودی به صورت یک نمودار نمایش داده میشود. ویژگی های گره که در زیر به رنگ آبی نشان داده شده اند از دو قسمت تشکیل شده است. قسمت اول یک شناسه اپکد، مهمترین اطلاعات یک گره است که نوع عملکرد تانسور را نشان می دهد. بنابراین، مدلهای پایه ما، یک کد آپکد را به یک نگاشت میکنند تعبیه کد عملیاتی از طریق یک جدول جستجوی جاسازی سپس تعبیه کد عملیاتی با قسمت دوم، بقیه ویژگیهای گره، به عنوان ورودی به یک GNN الحاق میشود. ما جاسازیهای گره تولید شده توسط GNN را برای ایجاد جاسازی با اندازه ثابت نمودار با استفاده از کاهش ادغام گراف ساده (یعنی مجموع و میانگین) ترکیب میکنیم. سپس تعبیه گراف حاصل به صورت خطی توسط یک لایه پیشخور به خروجی اسکالر نهایی تبدیل می شود.
مدل هزینه آموخته شده پایه ما از یک GNN استفاده می کند زیرا برنامه ها می توانند به طور طبیعی به عنوان نمودار نمایش داده شوند. |
علاوه بر این، ما آموزش بخش گراف (GST) را ارائه میکنیم، روشی برای مقیاسبندی آموزش GNN برای رسیدگی به نمودارهای بزرگ روی دستگاهی با ظرفیت حافظه محدود در مواردی که وظیفه پیشبینی روی کل نمودار است (یعنی پیشبینی در سطح نمودار). بر خلاف آموزش مقیاسبندی برای پیشبینی در سطح گره یا لبه، مقیاسبندی برای پیشبینی سطح گراف مورد مطالعه قرار نگرفته است، اما برای حوزه ما بسیار مهم است، زیرا نمودارهای محاسباتی میتوانند شامل صدها هزار گره باشند. در یک آموزش معمولی GNN (“آموزش کامل نمودار”، در سمت چپ زیر)، یک مدل GNN با استفاده از یک نمودار کامل آموزش داده می شود، به این معنی که تمام گره ها و لبه های نمودار برای محاسبه گرادیان ها استفاده می شوند. برای نمودارهای بزرگ، این ممکن است از نظر محاسباتی غیرممکن باشد. در GST، هر نمودار بزرگ به بخشهای کوچکتر تقسیم میشود و یک زیرمجموعه تصادفی از بخشها برای بهروزرسانی مدل انتخاب میشود. جاسازیها برای بخشهای باقیمانده بدون ذخیره فعالسازیهای میانی آنها (برای جلوگیری از مصرف حافظه) تولید میشوند. سپس جاسازیهای همه بخشها برای ایجاد یک جاسازی برای نمودار بزرگ اصلی ترکیب میشوند که سپس برای پیشبینی استفاده میشود. علاوه بر این، ما جدول جاسازی تاریخی را برای به دست آوردن کارآمد جاسازیهای بخشهای گراف و حذف بخش برای کاهش کهنگی ناشی از تعبیههای تاریخی معرفی میکنیم. با هم، روش کامل ما زمان تمرین انتها به انتها را 3× سرعت می بخشد.
مقایسه آموزش نمودار کامل (روش معمولی) در مقابل آموزش بخش نمودار (روش پیشنهادی ما). |
مسابقه کاگل
در نهایت، «سریع یا آهسته؟» را اجرا کردیم. پیش بینی زمان اجرا مدل هوش مصنوعی» بر روی مجموعه داده TpuGraph. این مسابقات با حضور 792 شرکت کننده در 616 تیم به پایان رسید. ما 10507 ارسالی از 66 کشور داشتیم. برای 153 کاربر (از جمله 47 کاربر در 100 نفر برتر)، این اولین رقابت آنها بود. ما بسیاری از تکنیکهای جدید و جالبی که توسط تیمهای شرکتکننده استفاده میشود، یاد گرفتیم، مانند:
- هرس نمودار / فشرده سازی: به جای استفاده از روش GST، بسیاری از تیمها روشهای مختلفی را برای فشردهسازی نمودارهای بزرگ آزمایش کردند (مثلاً فقط زیرگرافهایی را نگه داشتند که شامل گرههای قابل تنظیم و همسایههای فوری آنها باشد).
- ارزش padding ویژگی: برخی از تیمها مشاهده کردند که مقدار padding پیشفرض 0 مشکلساز است، زیرا 0 با مقدار ویژگی معتبر در تضاد است، بنابراین استفاده از مقدار padding -1 میتواند دقت مدل را به طور قابل توجهی بهبود بخشد.
- ویژگی های گره: برخی از تیم ها مشاهده کردند که ویژگی های گره اضافی (مانند ابعاد انقباض نقطه کلی) مهم هستند. چند تیم دریافتند که رمزگذاری های مختلف ویژگی های گره نیز مهم است.
- توجه به پیکربندی متقابل: یک تیم برنده یک لایه ساده طراحی کرد که به مدل اجازه میدهد به طور صریح پیکربندیها را با یکدیگر «مقایسه کند». نشان داده شده است که این تکنیک بسیار بهتر از اجازه دادن به مدل استنباط برای هر پیکربندی جداگانه است.
در جلسه مسابقه در کارگاه آموزشی ML for Systems در NeurIPS در 16 دسامبر 2023، رقابت را شرح خواهیم داد و راهحلهای برنده را پیشنمایش خواهیم کرد. در نهایت، به همه برندگان تبریک میگوییم و از مشارکت شما در پیشرفت تحقیقات در ML برای سیستمها سپاسگزاریم!
نمایشگاه NeurIPS
اگر به تحقیقات بیشتر در مورد دادههای ساختیافته و هوش مصنوعی علاقهمند هستید، پانل NeurIPS Expo، Graph Learning Meets Artificial Intelligence را در 9 دسامبر میزبانی کردیم که مدلهای هزینه آموختهشده پیشرفته و موارد دیگر را پوشش میداد!
سپاسگزاریها
سامی ابوالحیجا (تحقیق گوگل) کمک قابل توجهی به این کار و نگارش کرد. تحقیق در این پست کار مشترک با بسیاری از همکاران دیگر از جمله مایک باروز، کایدی کائو، بهاره فاطمی، ژور لسکووچ، چاریت مندیس، داستین زله و یانکی ژو را توصیف میکند.