پاس های HLO

این سند بهینه سازی ها و تبدیل های HLO را در کامپایلر XLA تشریح می کند.

مقدمه

یک HLO Pass می تواند از یک یا چند بهینه سازی و تبدیل کامپایلر تشکیل شده باشد و XLA صدها چنین پاسی را ارائه می دهد. HLO فقط بر روی شکل (مثلاً یک ماتریس 3x4) و معنای عملیاتی آرایه‌ها تمرکز می‌کند تا بهینه‌سازی یا تبدیل را آسان‌تر کند.

به عنوان مثال:

  • AlgebraicSimplifier : پاسی که تعدادی از ساده سازی ها و بهینه سازی های عمدتاً ریاضی را انجام می دهد. از جمله:

    • هنگام تقسیم بر یک ثابت، یک بهینه سازی برای تبدیل عملیات به ضرب در وارونگی ثابت انجام می شود.
  • HloRematerialization : عبوری که عبارات انتخاب شده را در محاسبات مجدداً محاسبه می کند تا فشار حافظه ناشی از دامنه زنده مقادیر آرایه شکل را کاهش دهد.

جزئیات توسعه دهنده

کلاس پایه برای پاس های HLO را می توان در xla/hlo/pass/hlo_pass_interface.h پیدا کرد. پاس HLO نباید مستقیماً این کلاس را گسترش دهد، بلکه باید HloModulePass گسترش دهد.

همچنین XLA HLO Pass Framework را ببینید.

ابزار و تست

XLA دارای چندین ابزار خط فرمان از جمله ابزار hlo-opt است. این ابزار اجازه می دهد تا یک پاس جداگانه مستقل از مراحل کامپایل پلت فرم داده شده را اجرا کنید. برای اطلاعات بیشتر به Tooling مراجعه کنید.

برای اطلاعات در مورد نوشتن تست های واحد برای پاس های HLO به تست پاس های HLO مراجعه کنید.

نمونه های عبور HLO مستقل از سخت افزار

این بخش چند نمونه از پاس های به اشتراک گذاشته شده در پشتیبان های XLA را شرح می دهد. برخی از پاس ها ممکن است برای backend های خاص تخصصی باشند، اما عملکرد سطح بالا مشابه است.

پاس های مشترک یا پاس های مستقل از سخت افزار را می توان در xla/hlo/transforms یافت.

مادی شدن مجدد

HloRematerialization نیز ببینید.

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

ساده ساز جبری

AlgebraicSimplifier نیز ببینید.

کیسه‌ای از ساده‌سازی‌ها، بهینه‌سازی‌ها و متعارف‌سازی‌ها. مشابه با پاس instcombine LLVM .

تاشو دائمی

HloConstantFolding نیز ببینید.

عباراتی را که می توان در زمان کامپایل ارزیابی کرد با معادل ثابت آنها جایگزین می کند.

حذف کد مرده

HloDCE نیز ببینید.

عملیات با نتایج استفاده نشده را حذف می کند (اجرای سریع).

Call Graph Flattening

همچنین به FlattenCallGraph مراجعه کنید.

یک مجوز قانونی که نمودار فراخوانی HLO را با شبیه سازی محاسبات به درخت تبدیل می کند. لازم است زیرا حافظه به طور ایستا به عملیات HLO اختصاص داده می شود و بر اساس زمینه تماس پویا نیست.

تغییر شکل Mover

ReshapeMover نیز ببینید.

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

حذف HLO با اندازه صفر

ZeroSizedHloElimination نیز ببینید.

HLO از آرایه هایی با اندازه صفر پشتیبانی می کند (یک یا چند بعد دارای مرز صفر است). این پاس با جایگزینی عملیات اندازه صفر با ثابت های صفر، نمودار را ساده می کند.

نمونه های عبور HLO مخصوص TPU

پاس های مخصوص به باطن TPU.

موازی سازی مدل

پارتیشن بندی یک برنامه XLA در چندین هسته در سطح HLO انجام می شود و خط لوله TPU HLO شامل تعدادی پاس برای پشتیبانی از اجرای چند هسته ای است.

پارتیشن بندی فضایی

ShardingPropagation نیز ببینید.

برای پشتیبانی از عملیات تقسیم بین دستگاه‌ها در ابعاد غیر دسته‌ای پاس کنید.

مدیریت bfloat16

همچنین به BFloat16ConversionFolding ، BFloat16MixedPrecisionRemoval و BFloat16Propagation مراجعه کنید.

TPU ها از bfloat16 به عنوان یک نمایش نقطه شناور با دقت پایین تر و فشرده تر از شناورهای 32 بیتی پشتیبانی می کنند. استفاده از bfloat16 باعث کاهش ردپای حافظه و پهنای باند حافظه می شود. خط لوله TPU HLO شامل مسیرهای مختلفی برای جایگزینی شناورها با bfloat16 در برنامه و انتشار دقت در نمودار است.

قانونی شدن می گذرد

همچنین به GatherExpander و BatchNormExpander مراجعه کنید.

پاس‌هایی که HLO پشتیبانی‌نشده را به شکلی تبدیل می‌کنند که backend می‌تواند منتشر کند یا برای آن بک‌اند کاهش کارآمدتری ایجاد می‌کند.

مثال HLO Pass مخصوص GPU

گذرنامه‌های مختص به باطن GPU در xla/service/gpu یافت می‌شوند. این پاس ها را می توان به عنوان کلاس های تعریف شده در namespace gpu شناسایی کرد.

cuDNN Rewriter

همچنین به CudnnFusedConvRewriter و CudnnNormRewriter مراجعه کنید.

عملیات کانولوشن و هنجار ترکیب شده را در فراخوانی های کتابخانه مربوطه خود در cuDNN بازنویسی می کند.

نمونه‌های HLO Pass مخصوص CPU

گذرنامه‌های مخصوص باطن CPU در xla/service/cpu یافت می‌شوند. این پاس ها را می توان به عنوان کلاس های تعریف شده در namespace cpu شناسایی کرد.

Convolution Canonicalization

ConvCanonicalization نیز ببینید.

کانولوشن ها را متعارف می کند تا بتوان آنها را به یک پیاده سازی سریع در Eigen کاهش داد.

عملیات موازی سازی

ParallelTaskAssigner نیز ببینید.

HLO ها را به وظایفی تقسیم می کند تا در رشته های جداگانه اجرا شوند.

تجزیه و تحلیل می گذرد

پاس‌های تجزیه و تحلیل به عنوان «گذرهای HLO» در نظر گرفته نمی‌شوند زیرا HLO را تغییر نمی‌دهند و ممکن است HloModulePass گسترش ندهند. تجزیه و تحلیل های مشترک در xla/hlo/analysis یافت می شوند.

نمونه های پاس آنالیز

تجزیه و تحلیل جریان داده

HloDataflowAnalysis نیز ببینید.

تمام مقادیر HLO در نمودار و موارد استفاده از آنها را شناسایی می کند.

تجزیه و تحلیل مستعار

HloAliasAnalysis نیز ببینید.

روابط نام مستعار را بین مقادیر موجود در برنامه شناسایی می کند.

تحلیل هزینه محاسباتی

HloCostAnalysis نیز ببینید.

تعداد FLOP و میزان مصرف حافظه را برای تمام عملیات در برنامه محاسبه می کند.

تایید HLO

HloVerifier نیز ببینید.

متغیرهای مختلف نمودار HLO را تأیید می کند.