تکثیر مدلهای انتشار بزرگ برای تولید تصویر منجر به افزایش قابل توجهی در اندازه مدل و بار کاری استنتاج شده است. استنتاج ML روی دستگاه در محیط های تلفن همراه نیازمند بهینه سازی دقیق عملکرد و در نظر گرفتن معاوضه ها به دلیل محدودیت منابع است. اجرای استنتاج مدلهای انتشار بزرگ (LDM) بر روی دستگاه، به دلیل نیاز به کارایی هزینه و حفظ حریم خصوصی کاربر، چالشهای بزرگتری را به دلیل نیازهای حافظه قابل توجه و نیازهای محاسباتی این مدلها ارائه میکند.
ما به این چالش در کار خود با عنوان “سرعت تمام چیزی است که نیاز دارید: شتاب روی دستگاه مدل های انتشار بزرگ از طریق بهینه سازی های GPU-Aware” (که در کارگاه آموزشی CVPR 2023 برای یادگیری عمیق کارآمد برای بینایی کامپیوتری ارائه خواهد شد) با تمرکز بر روی بهینه سازی پرداخته ایم. اجرای یک مدل پایه LDM بر روی یک GPU موبایل در این پست وبلاگ، تکنیکهای اصلی را که برای اجرای موفقیتآمیز مدلهای انتشار بزرگ مانند انتشار پایدار با وضوح کامل (512×512 پیکسل) و 20 تکرار در گوشیهای هوشمند مدرن با سرعت استنتاج با عملکرد بالا از مدل اصلی بدون تقطیر کمتر از 12 ثانیه به کار گرفتهایم، خلاصه میکنیم. . همانطور که در پست وبلاگ قبلی ما بحث شد، استنتاج ML با شتاب GPU اغلب توسط عملکرد حافظه محدود می شود، و اجرای LDM ها نیز از این قاعده مستثنی نیست. بنابراین، موضوع اصلی بهینهسازی ما ورودی/خروجی حافظه کارآمد (I/O) است، حتی اگر به معنای انتخاب الگوریتمهای کارآمد حافظه نسبت به الگوریتمهایی باشد که کارایی واحد منطقی حسابی را در اولویت قرار میدهند. در نهایت، هدف اصلی ما کاهش تأخیر کلی استنتاج ML است.
![]() |
یک نمونه خروجی از یک LDM در GPU موبایل با متن درخواستی: “عکس واقعی و تصویری با وضوح بالا از یک توله سگ ناز با گل های اطراف”. |
ماژول توجه پیشرفته برای کارایی حافظه
یک موتور استنتاج ML معمولاً انواع عملیات ML بهینه شده را ارائه می دهد. با وجود این، دستیابی به عملکرد بهینه همچنان می تواند چالش برانگیز باشد زیرا مقدار سربار معینی برای اجرای اپراتورهای شبکه عصبی منفرد بر روی یک GPU وجود دارد. برای کاهش این سربار، موتورهای استنتاج ML از قوانین ترکیبی عملگر گسترده ای استفاده می کنند که چندین عملگر را در یک عملگر واحد ادغام می کند، در نتیجه تعداد تکرارها را در عناصر تانسور کاهش می دهد و در عین حال محاسبه در هر تکرار را به حداکثر می رساند. به عنوان مثال، TensorFlow Lite از ادغام اپراتور برای ترکیب عملیات محاسباتی گران قیمت، مانند کانولوشن، با توابع فعال سازی بعدی، مانند واحدهای خطی اصلاح شده، در یک واحد استفاده می کند.
یک فرصت واضح برای بهینهسازی، بلوک توجه به شدت مورد استفاده است که در مدل حذفکننده در LDM به کار گرفته شده است. بلوکهای توجه به مدل اجازه میدهند تا با اختصاص وزنهای بالاتر به مناطق مهم، روی بخشهای خاصی از ورودی تمرکز کند. راههای مختلفی وجود دارد که میتوان ماژولهای توجه را بهینه کرد، و بسته به اینکه کدام بهینهسازی بهتر عمل میکند، بهطور انتخابی یکی از دو بهینهسازی توضیح داده شده در زیر را به کار میگیریم.
اولین بهینه سازی که به آن می گوییم softmax تا حدی ذوب شده، نیاز به نوشتن و خواندن حافظه گسترده بین softmax و ضرب ماتریس در ماژول توجه را برطرف می کند. اجازه دهید بلوک توجه فقط یک ضرب ماتریسی ساده از فرم باشد Y = سافت مکس(ایکس) * دبلیو جایی که ایکس و دبلیو ماتریس های دوبعدی شکل هستند آ×ب و ب×ج، به ترتیب (در زیر در نیمه بالایی نشان داده شده است).
برای ثبات عددی، T = سافت مکس(ایکس) معمولاً در سه پاس محاسبه می شود:
- حداکثر مقدار را در لیست تعیین کنید، یعنی.، برای هر ردیف در ماتریس ایکس
- تفاوت های نمایی هر آیتم لیست و حداکثر مقدار را (از پاس 1) خلاصه کنید.
- نمایی اقلام منهای حداکثر مقدار را بر مجموع پاس 2 تقسیم کنید
انجام ساده این پاس ها منجر به نوشتن حافظه عظیمی برای تانسور میانی موقت می شود. تی خروجی کل تابع softmax را نگه می دارد. اگر فقط نتایج پاس های 1 و 2 را با برچسب ذخیره کنیم، این نوشتن حافظه بزرگ را دور می زنیم متر و سبه ترتیب که بردارهای کوچکی هستند با آ عناصر هر کدام، در مقایسه با تی که دارای a·b عناصر. با استفاده از این تکنیک، میتوانیم دهها یا حتی صدها مگابایت از مصرف حافظه را با چندین مرتبه بزرگی کاهش دهیم (در نیمه پایینی نشان داده شده است).
![]() |
ماژول های توجه بالا: یک بلوک توجه ساده، متشکل از یک SOFTMAX (با هر سه پاس) و یک MATMUL، به یک حافظه بزرگ برای نوشتن تانسور میانی بزرگ نیاز دارد. تی. پایین: بلوک توجه کارآمد حافظه ما با softmax نیمه ذوب شده در MATMUL فقط به ذخیره دو تانسور متوسط کوچک برای متر و س. |
بهینه سازی دیگر شامل استفاده از FlashAttention است که یک الگوریتم توجه دقیق و آگاه به I/O است. این الگوریتم تعداد دسترسیهای حافظه با پهنای باند بالای GPU را کاهش میدهد و آن را برای موارد استفاده محدود با پهنای باند حافظه مناسب میکند. با این حال، ما متوجه شدیم که این تکنیک فقط برای SRAM با اندازه های خاص کار می کند و به تعداد زیادی ثبات نیاز دارد. بنابراین، ما فقط از این تکنیک برای ماتریسهای توجه با اندازه معین در مجموعهای از پردازندههای گرافیکی منتخب استفاده میکنیم.
کانولوشن سریع وینوگراد برای لایه های پیچشی 3×3
ستون فقرات LDM های رایج به شدت به لایه های پیچشی 3×3 (پیچش هایی با اندازه فیلتر 3×3) متکی است که بیش از 90 درصد از لایه های رسیور را تشکیل می دهد. علیرغم افزایش مصرف حافظه و خطاهای عددی، ما دریافتیم که پیچش سریع Winograd در سرعت بخشیدن به پیچیدگی ها موثر است. متمایز از اندازه فیلتر 3×3 مورد استفاده در کانولوشن، اندازه کاشی به اندازه یک ناحیه فرعی از تانسور ورودی است که در یک زمان پردازش می شود. افزایش اندازه کاشی، کارایی کانولوشن را از نظر استفاده از واحد منطق حسابی (ALU) افزایش میدهد. با این حال، این بهبود به قیمت افزایش مصرف حافظه تمام می شود. آزمایشهای ما نشان میدهد که اندازه کاشی 4×4 به تعادل بهینه بین بازده محاسباتی و استفاده از حافظه دست مییابد.
استفاده از حافظه | |||
اندازه کاشی | پس انداز FLOPS | تانسورهای میانی | وزن ها |
2×2 | 2.25× | 4.00× | 1.77× |
4×4 | 4.00× | 2.25× | 4.00× |
6×6 | 5.06× | 1.80× | 7.12× |
8×8 | 5.76× | 1.56× | 11.1× |
تاثیر وینوگراد با اندازه های مختلف کاشی برای پیچش 3×3. |
فیوژن تخصصی اپراتور برای کارایی حافظه
ما کشف کردیم که استنباط عملکردی LDM در یک GPU تلفن همراه به پنجرههای همجوشی بسیار بزرگتری برای لایهها و واحدهای رایج در LDMها نسبت به موتورهای استنتاج ML شتابدهنده GPU موجود در دستگاه نیاز دارد. در نتیجه، ما پیادهسازیهای تخصصی را توسعه دادیم که میتوانند طیف وسیعتری از عملگرهای عصبی را نسبت به قوانین فیوژن معمولی که اجازه میدهند، اجرا کنند. به طور خاص، ما روی دو تخصص تمرکز کردیم: واحد خطی خطای گاوسی (GELU) و لایه نرمال سازی گروه.
تقریب GELU با تابع مماس هذلولی مستلزم نوشتن و خواندن از هفت تانسور میانی کمکی (در شکل زیر به صورت مستطیل های گرد نارنجی روشن نشان داده شده است)، خواندن از تانسور ورودی است. ایکس سه بار و نوشتن روی تانسور خروجی y یک بار در هشت برنامه GPU که هر کدام عملیات برچسب گذاری شده را اجرا می کنند (مستطیل های آبی روشن). یک پیاده سازی سفارشی GELU که هشت عملیات را در یک سایه زن انجام می دهد (در زیر در پایین نشان داده شده است) می تواند تمام ورودی/خروجی حافظه را برای تانسورهای میانی دور بزند.
![]() |
پیاده سازی GELU بالا: یک پیاده سازی ساده با عملیات داخلی به 8 نوشتن حافظه و 10 خواندن نیاز دارد. پایین: GELU سفارشی ما فقط به 1 حافظه خوانده شده (برای ایکس) و 1 بنویسید (برای y). |
نتایج
پس از اعمال همه این بهینهسازیها، آزمایشهای Stable Diffusion 1.5 (رزولوشن تصویر 512×512، 20 تکرار) را بر روی دستگاههای تلفن همراه پیشرفته انجام دادیم. اجرای انتشار پایدار با مدل استنتاج ML شتابدار GPU ما از 2093 مگابایت برای وزنهها و 84 مگابایت برای تانسورهای میانی استفاده میکند. با جدیدترین گوشی های هوشمند سطح بالا، Stable Diffusion را می توان در کمتر از 12 ثانیه اجرا کرد.
![]() |
Stable Diffusion در گوشی های هوشمند مدرن در کمتر از 12 ثانیه اجرا می شود. توجه داشته باشید که اجرای رمزگشا پس از هر بار تکرار برای نمایش خروجی متوسط در این GIF متحرک منجر به کاهش سرعت ~2× می شود. |
نتیجه
ثابت شده است که انجام استنتاج ML روی دستگاه در مدلهای بزرگ یک چالش اساسی است، که شامل محدودیتهایی در اندازه فایل مدل، نیازهای حافظه زمان اجرا گسترده و تأخیر استنتاج طولانی است. با به رسمیت شناختن استفاده از پهنای باند حافظه به عنوان گلوگاه اصلی، ما تلاش های خود را به سمت بهینه سازی استفاده از پهنای باند حافظه و ایجاد تعادل ظریف بین کارایی ALU و کارایی حافظه هدایت کردیم. در نتیجه، ما به تاخیر استنتاج پیشرفتهای برای مدلهای انتشار بزرگ دست یافتیم. شما می توانید در مورد این کار در مقاله بیشتر بدانید.
قدردانی
مایلیم از Yu-Hui Chen، Jiuqiang Tang، Frank Barchard، Yang Zhao، Joe Zou، Khanh LeViet، Chuo-Ling Chang، Andrei Kulik، Lu Wang، و Matthias Grundmann تشکر کنیم.