XLA گزینههایی برای کنترل میزان تلاشی که کامپایلر صرف میکند، ارائه میدهد.
- بهینهسازی برای عملکرد زمان اجرا، و
- برنامه را طوری تنظیم کنید که در حافظه جا شود (که معنی آن وابسته به پلتفرم است)
سطح بهینهسازی
مشابه پرچمهای -O در gcc یا clang، این فیلد به کاربر اجازه میدهد تا بر میزان کاری که کامپایلر برای بهینهسازی زمان اجرا انجام میدهد، تأثیر بگذارد. این فیلد را میتوان از طریق فیلد optimization_level از پیام ExecutableBuildOptionsProto یا فیلد optimization_level از پیام ExecutionOptions تنظیم کرد.
سطوح بهینهسازی پایینتر باعث میشود که مسیرهای مختلف HLO رفتار متفاوتی داشته باشند، معمولاً کار کمتری انجام میدهند، یا ممکن است مسیرهای HLO خاصی را به طور کامل غیرفعال کنند. سطح بهینهسازی همچنین ممکن است بر backend کامپایلر تأثیر بگذارد، به طوری که تأثیر دقیق این فیلد به پلتفرم هدف بستگی دارد. با این حال، به عنوان یک راهنمای کلی، جدول زیر تأثیر کلی مورد انتظار هر مقدار را شرح میدهد:
| سطح | مورد استفاده |
|---|---|
| تلاش_O0 | سریعترین کامپایل، کندترین زمان اجرا |
| تلاش_O1 | کامپایل سریعتر با زمان اجرای معقول |
| تلاش_O2 | اولویتبندی قوی زمان اجرا (پیشفرض مناسب برای حجم کار عملیاتی) |
| تلاش_O3 | بهینهسازیهای پرهزینه یا آزمایشی |
استفاده در XLA:GPU
خط لولهسازی را میتوان به طور جداگانه برای all-gather، all-reduce و reduce-scatter پیکربندی کرد. پرچمهای xla_gpu_pipeline_all_gather ، xla_gpu_pipeline_all_reduce و xla_gpu_pipeline_reduce_scatter default ، off ، on یا explicit را میپذیرند. default از تلاش بهینهسازی پیروی میکند: on O1 یا بالاتر، یا زمانی که تلاش بهینهسازی زمان اجرا حداقل 0.2 باشد، روشن را انتخاب میکند. در غیر این صورت، off انتخاب میکند. هر حالت دیگری تلاش بهینهسازی را لغو میکند. پیشفرض All-gather و all-reduce روی default است، در حالی که پیشفرض reduce-scatter روی on است. برای معانی حالتها به پرچمهای GPU XLA مراجعه کنید.
در XLA:GPU، چندین مرحله وجود دارد که ما به طور پیشفرض غیرفعال میکنیم زیرا با افزایش اندازه HLO، زمان کامپایل را به میزان قابل توجهی افزایش میدهند. برای راحتی، آنها را در گزینه سطح بهینهسازی ادغام میکنیم، به طوری که تنظیم optimization_level روی O1 یا بالاتر منجر به رفتار زیر خواهد شد:
- خط لوله جمعی به طور پیشفرض برای عملیاتی که معمولاً برای ارتباط موازی دادهها استفاده میشوند،
onحالت روشن استفاده میکند. حالتهایoffوexplicitهمچنان این حالت پیشفرض را لغو میکنند.-
xla_gpu_pipeline_all_gather -
xla_gpu_pipeline_all_reduce -
xla_gpu_pipeline_reduce_scatter
-
- باز کردن حلقههای while به اندازه دو برابر. مانع حلقه را از بین میبرد که به طور بالقوه منجر به همپوشانی بهتر محاسبات-ارتباطات و کپیهای کمتر میشود.
-
xla_gpu_enable_while_loop_double_buffering
-
- ابزار زمانبندی پنهانسازی تأخیر، بخش عمدهی کار را برای پنهانسازی تأخیر ارتباط انجام خواهد داد.
-
xla_gpu_enable_latency_hiding_scheduler
-
- برای به حداکثر رساندن پهنای باند شبکه، گذرگاههای ترکیبی، مجموعههای خط لولهای را تا حداکثر حافظه موجود ترکیب میکنند. اگر حلقه از قبل در HLO ورودی باز شده باشد، بهینهسازی شروع نمیشود.
سطح برازش حافظه
یکی دیگر از گزینههای سطح تلاش، میزان تلاش کامپایلر برای «در حافظه جا گرفتن» برنامهی حاصل را کنترل میکند، که در آن «جا افتادن» و «حافظه» معانی وابسته به backend دارند (برای مثال، در XLA:TPU، این گزینه میزان تلاش کامپایلر برای نگه داشتن استفاده از حافظه با پهنای باند بالا (HBM) توسط TPU کمتر از ظرفیت HBM را کنترل میکند). این گزینه را میتوان از طریق فیلد memory_fitting_level از پیام ExecutableBuildOptionsProto یا فیلد memory_fitting_level از پیام ExecutionOptions تنظیم کرد.
همانند سطح بهینهسازی، معنای دقیق هر مقدار سطح تلاش به بخش مدیریت بستگی دارد، اما جدول زیر تأثیر مورد انتظار را به عنوان یک راهنمای کلی شرح میدهد:
| سطح | مورد استفاده |
|---|---|
| تلاش_O0 | حداقل تلاش برای جا دادن (در عوض، کامپایل در اسرع وقت با شکست مواجه میشود) |
| تلاش_O1 | کاهش تلاش برای جا افتادن |
| تلاش_O2 | تلاش قابل توجه برای تطبیق (پیشفرض مناسب برای حجم کار تولید) |
| تلاش_O3 | الگوریتمهای گرانقیمت یا آزمایشی برای کاهش استفاده از حافظه |