گویش شاردی (SDY)
گویش Shardy (SDY) یک نمایش شاردینگ تانسور مبتنی بر محور و اجزای API اضافی برای اتصال شاردینگها به تانسورها را تعریف میکند.
گزارش نسخه: 0.0.1: محورهای کاهش نیافته را به TensorShardingAttr اضافه کنید.
عملیات
sdy.all_gather (sdy::AllGatherOp)
یک ارتباط همه جانبه را در امتداد محورها انجام میدهد
نحو:
operation ::= `sdy.all_gather` $gathering_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
تکههایی از یک تانسور را در امتداد محورهای مشخص شده در gathering_axes جمعآوری میکند.
gathering_axes فهرستی از فهرستهای محورها است. فهرست بیرونی روی ابعاد تانسور قرار دارد. هر فهرست درونی، محورهایی را مشخص میکند که در امتداد آنها یک جمعآوری جداگانه باید روی بُعد مربوطه انجام شود. این فهرست روی خرد کردن عملوند ( tensor ) اعمال میشود تا خرد کردن نتیجه ( out_sharding ) به دست آید.
توجه داشته باشید که out_sharding برای تعیین تقسیمبندی نتیجه استفاده نمیشود. در عوض، تقسیمبندی نتیجه توسط تقسیمبندی عملوند و gathering_axes تعیین میشود و out_sharding باید با این تقسیمبندی استنباطی مطابقت داشته باشد.
مثال:
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "b", "c"}, {}, {"d"}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.all_gather [{"b", "c"}, {}, {"d"}\] %1 out_sharding=<@mesh, [{"a"}, {}, {}\]> : tensor<8x8x8xf32>
محدودیتها:
- باید محدودیتهای ذکر شده در
Sdy_CollectiveOpInterfaceرا برآورده کند. - عناصر موجود در
gathering_axesباید محدودیتهای ذکر شده درAxisRefListAttrرا برآورده کنند. - اعمال
gathering_axesروی عملوند sharding باعث میشودout_shardingبه دست آید.
صفات: SameOperandsAndResultType
رابطها: InferTypeOpInterface ، Sdy_CollectiveOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
gathering_axes | ::mlir::sdy::ListOfAxisRefListsAttr | فهرست مرجع محورها |
out_sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
tensor | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.all_reduce (sdy::AllReduceOp)
انجام یک ارتباط تماماً کاهشی در امتداد محورها
نحو:
operation ::= `sdy.all_reduce` $reduction_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
بخشهایی از یک تانسور را در امتداد محورهای مشخص شده در reduction_axes کاهش میدهد. ترتیب reduction_axes برای نتیجه مهم نیست، اما میتواند بر ترتیب گروههای کپی مربوطه تأثیر بگذارد.
محدودیتها:
- باید محدودیتهای ذکر شده در
Sdy_CollectiveOpInterfaceرا برآورده کند. -
reduction_axesباید محدودیتهای ذکر شده درAxisRefListAttrرا برآورده کند. -
reduction_axesباید نسبت به مش مرتب شوند. - عملوندهای sharding و
out_shardingباید sharding های با ابعاد معادل داشته باشند. -
reduction_axesنباید با محورهای تقسیمبندی و تکثیر شدهی بُعد عملوند همپوشانی داشته باشد (میتواند با محورهای کاهش نیافته همپوشانی داشته باشد). -
reduction_axesنباید با محورهای کاهش نیافتهیout_shardingهمپوشانی داشته باشند. به عبارت دیگر،out_shardingباید در امتدادreduction_axes(به طور ضمنی یا صریح) تکرار شود.
صفات: SameOperandsAndResultType
رابطها: CollectiveOpInterface ، InferTypeOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
reduction_axes | ::mlir::sdy::AxisRefListAttr | فهرست ارجاعات محورها |
out_sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
tensor | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.all_slice (sdy::AllSliceOp)
یک عملیات برش پویا را در امتداد محورها انجام میدهد
نحو:
operation ::= `sdy.all_slice` $slicing_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
تکههایی از یک تانسور را در امتداد محورهای مشخص شده در slicing_axes برش میدهد. یک دوگانگی جبری بین sdy.all_slice و sdy.all_gather وجود دارد.
slicing_axes فهرستی از فهرستهای محورها است. فهرست بیرونی روی ابعاد تانسور قرار دارد. هر فهرست درونی، محورهایی را مشخص میکند که یک برش باید در امتداد آنها روی بُعد مربوطه انجام شود. این فهرست روی خرد کردن عملوند ( tensor ) اعمال میشود تا خرد کردن نتیجه ( out_sharding ) به دست آید.
توجه داشته باشید که out_sharding برای تعیین تقسیمبندی نتیجه استفاده نمیشود. در عوض، تقسیمبندی نتیجه توسط تقسیمبندی عملوند و slicing_axes تعیین میشود و out_sharding باید با این تقسیمبندی استنباطی مطابقت داشته باشد.
مثال:
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a"}, {}, {}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.all_slice [{"b", "c"}, {}, {"d"}\] %1 out_sharding=<@mesh, [{"a", "b", "c"}, {}, {"d"}\]> : tensor<8x8x8xf32>
محدودیتها:
- باید محدودیتهای ذکر شده در
Sdy_CollectiveOpInterfaceرا برآورده کند. - عناصر موجود در
slicing_axesباید محدودیتهای ذکر شده درAxisRefListAttrرا برآورده کنند. - اعمال
slicing_axesروی عملوند sharding باعث میشودout_sharding.
صفات: SameOperandsAndResultType
رابطها: CollectiveOpInterface ، InferTypeOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
slicing_axes | ::mlir::sdy::ListOfAxisRefListsAttr | فهرست مرجع محورها |
out_sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
tensor | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.all_to_all (sdy::AllToAllOp)
ارتباط همه جانبه را در امتداد محورها برقرار میکند
نحو:
operation ::= `sdy.all_to_all` $params $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
برای هر تاپل (axes، src_dim، tgt_dim) در لیست پارامترها، این عملیات تکههایی از یک تانسور را در امتداد بُعد tgt_dim و محورهای مشخص شده در axes برش میدهد، آن تکهها را در امتداد محورها پراکنده میکند و آنها را در امتداد بُعد src_dim به هم متصل میکند.
این عملیات اساساً ترکیبی از یک all-gather در امتداد src_dim و axes است که با یک all-slice در امتداد tgt_dim و axes دنبال میشود، یعنی پسوندی از بُعد شاردینگ محورها src_dim در تانسور ورودی به بُعد شاردینگ محورها tgt_dim در تانسور خروجی اضافه میشود.
همه به همه برای تقسیمبندی عملوند ( tensor ) اعمال میشود تا تقسیمبندی نتیجه ( out_sharding ) را به دست آورد.
توجه داشته باشید که out_sharding برای تعیین تقسیمبندی نتیجه استفاده نمیشود. در عوض، تقسیمبندی نتیجه توسط تقسیمبندی عملوند، src_dim ، tgt_dim و axes تعیین میشود و out_sharding باید با این تقسیمبندی استنباطی مطابقت داشته باشد.
مثال:
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "b"}, {"c"}, {}, {}\]>]>} : tensor<8x8x4x4x32>
%2 = sdy.all_to_all [{"b"}: 0->2, {"c"}: 1->3] %1 out_sharding=<@mesh, [{"a"}, {}, {"b"}, {"c"}\]> : tensor<8x8x4x4x32>
محدودیتها:
- باید محدودیتهای ذکر شده در
Sdy_CollectiveOpInterfaceرا برآورده کند. - لیست پارامترها نباید خالی باشد.
- برای هر پارامتر در
params:- عناصر موجود در
axesباید محدودیتهایAxisRefAttrرا برآورده کنند. -
src_dimوtgt_dimباید ابعاد معتبری داشته باشند (غیرمنفی و کمتر از رتبه تانسور). - هر
src_dimیاtgt_dimباید در تمام پارامترها منحصر به فرد باشد. -
src_dimباید به ترتیب صعودی در تمام پارامترها مرتب شود.
- عناصر موجود در
- جابجایی
axesازsrc_dimبهtgt_dimدر عملوند sharding باعثout_shardingمیشود.
صفات: SameOperandsAndResultType
رابطها: InferTypeOpInterface ، Sdy_CollectiveOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
params | ::mlir::sdy::AllToAllParamListAttr | فهرست پارامترهای همه به همه |
out_sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
tensor | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.collective_permute (sdy::CollectivePermuteOp)
یک ارتباط جمعی-جایگزینی برای جایگزینی محورها انجام میدهد.
نحو:
operation ::= `sdy.collective_permute` $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
بخشی از تانسور ورودی را از هر دستگاه به دستگاه دیگر ارسال میکند تا محورهایی که تانسور را تکه تکه میکنند، دوباره مرتب/جایگزین شوند.
یک جایگشت جمعی میتواند تقسیمبندی ورودی را به گونهای تغییر دهد که هر بُعد باید به همان اندازه قبل تقسیمبندی شود، یعنی باید در امتداد محورهایی تقسیمبندی شود که حاصلضرب اندازههای آنها با حاصلضرب اندازههای محورهایی که قبلاً تانسور را تقسیمبندی کردهاند، مطابقت داشته باشد.
این برای مرتبسازی مجدد محورها در یک بعد یا در ابعاد مختلف و تعویض محورهای خرد شده با محورهای تکثیر شده مفید است.
در مثال زیر، اندازه تانسور خرد شده tensor<1x4x2xf32> است و این اندازه توسط جایگشت جمعی حفظ میشود.
مثال:
sdy.mesh @mesh = <["a"=2, "b"=2, "c"=4, "d"=2, "e"=2, "f"=2]>
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "c"}, {"f"}, {"d", "e"}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.collective_permute %1 out_sharding=<@mesh, [{"c":(1)2, "b", "f"}, {"a"}, {"e", "d"}\]> : tensor<8x8x8xf32>
محدودیتها:
- باید محدودیتهای ذکر شده در
Sdy_CollectiveOpInterfaceرا برآورده کند. - اگر شاردینگ ورودی و خروجی دارای مشهای متفاوتی باشند، آن مشها باید دقیقاً محورهای یکسان و ترتیب متفاوتی از شناسههای دستگاه داشته باشند.
- برای هر بُعد، حاصلضرب اندازه محورهای شاردینگ در
out_shardingباید با حاصلضرب اندازههای عملوند مربوطه در شاردینگ بُعد مطابقت داشته باشد.
صفات: SameOperandsAndResultType
رابطها: CollectiveOpInterface ، InferTypeOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
out_sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
tensor | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.constant (sdy::ConstantOp)
عملیات ثابت
یک تانسور output از یک value ثابت تولید میکند.
ببینید: https://github.com/openxla/stablehlo/blob/main/docs/spec.md#constant
مثال:
%output = sdy.constant dense<[[0.0, 1.0], [2.0, 3.0]]> : tensor<2x2xf32>
ویژگیها: AlwaysSpeculatableImplTrait
رابطها: ConditionallySpeculatable ، InferTypeOpInterface ، NoMemoryEffect (MemoryEffectOpInterface)
اثرات: MemoryEffects::Effect{}
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
value | ::mlir::المانهاAttr | ویژگی بردار/تانسور ثابت |
نتایج:
| نتیجه | توضیحات |
|---|---|
output | تانسور استاتیک شکل گرفته از هر نوع مقداری |
sdy.data_flow_edge (sdy::DataFlowEdgeOp)
لبه جریان داده.
نحو:
operation ::= `sdy.data_flow_edge` $input (`sharding````=``` $sharding^)? attr-dict `:` type($result)
یک لبه جریان داده از یک عملیات X، پلی بین مجموعهای از منابع (که هر کدام یا یک عملوند X یا یک عملوند از پایاندهنده بلوک X هستند) و مجموعهای از اهداف (که هر کدام یا نتیجه X یا یک آرگومان بلوک X هستند) تعریف میکند، به طوری که همه منابع و اهداف باید به یک روش تقسیم شوند.
یک عملیات میتواند چندین لبه جریان داده داشته باشد که بر یکدیگر عمود هستند.
برای مثال:
y_0, ..., y_n = while (x_0, ..., x_n)
((pred_arg_0,... , pred_arg_n) { ... })
((body_arg_0,..., body_arg_n) {
...
return return_value_0, ..., return_value_n
})
در حالی که op دارای n یال جریان داده است، iامین یال جریان داده بین منابع x_i ، return_value_i و اهداف y_i ، pred_arg_i body_arg_i قرار دارد.
یک sdy.data_flow_edge مالک یک لبه (میتواند هر یک از اهداف باشد، اما ترجیحاً یک نتیجه عملیاتی به جای یک آرگومان بلوک) را به عنوان ورودی میگیرد، که نباید هیچ کاربرد دیگری داشته باشد. این عملیات خالص نیست زیرا میتواند ورودیای را بگیرد که در ابتدا هیچ کاربردی نداشته است.
sdy.data_flow_edge همچنین یک شاردینگ اختیاری برای همه اهداف لبه نگه میدارد، و آن شاردینگ باید به جای شاردینگ اهداف (در صورت امکان پیوست) در طول انتشار، بهروزرسانی شود. این زمانی مفید است که یک عملیات دارای لبههای زیادی باشد، زیرا بسیار کارآمدتر است که:
- از طریق هر لبه به طور جداگانه پخش شود.
- به جای بهروزرسانی همزمان همه اهداف، هر لبه را جداگانه خرد کنید (مثلاً یک عملیات دارای یک
TensorShardingPerValueAttrتغییرناپذیر برای خرد کردن نتایج است). - وقتی شاردینگ یک منبع تغییر کرد، هر یال را جداگانه به لیست کاری اضافه کنید.
انتشار، شاردینگها را بین تمام منابع و اهداف یک sdy.data_flow_edge پخش میکند، گویی یک عملیات معمولی است که منابع به عنوان عملوندها و اهداف به عنوان نتایج هستند و یک هویت sdy.op_sharding_rule دارد. این بدان معناست که انتشار رو به جلو از منابع به اهداف و انتشار رو به عقب از اهداف به منابع است.
ما اجازه نمیدهیم ورودی یک sdy.data_flow_edge توسط یک عملیات SdyDialect تعریف شود، بنابراین میتوانیم فرض کنیم که توسط عملیاتی تعریف شده است که دارای ویژگی sdy.sharding ثبت نشده است.
صفات: SameOperandsAndResultType
رابطها: InferTypeOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
input | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.manual_computation (sdy::ManualComputationOp)
عملیات موازی چند دستگاهی با جمعبندیهای دستی
نحو:
operation ::= `sdy.manual_computation` `(`operands`)`
`in_shardings````=```custom<StrippedTensorShardingPerValueAttr>($in_shardings)
`out_shardings````=```custom<StrippedTensorShardingPerValueAttr>($out_shardings)
`manual_axes````=```$manual_axes
custom<SingleBlockRegionNoBlockId>($body)
attr-dict
`:`
functional-type(operands, results)
به ناحیهای که بر اساس کد محلی برای هر دستگاه با مجموعههای صریح نوشته شده است، پرش کنید، که در آن اشکال منطقی با اشکال بافر فیزیکی محلی برای هر دستگاه مطابقت دارند و مجموعهها دقیقاً با ارتباط فیزیکی بین دستگاهها مطابقت دارند.
بدنه نسبت به manual_axes محلی است. انتشار از طریق بدنه روی هر محور آزاد - آنهایی که در لیست manual_axes نیستند - رخ خواهد داد.
توجه داشته باشید که انتظار میرود هر تانسور بدون رتبهبندی، شاردینگی با رتبه ۰ داشته باشد، یعنی کاملاً تکثیر شده باشد.
محدودیتها:
- عناصر موجود در
in_shardingsوout_shardingsباید محدودیتهای ذکر شده درTensorShardingAttrرا برآورده کنند. - تعداد ورودیها/خروجیهای تانسور سراسری و محلی ناحیه op باید مطابقت داشته باشد.
- محورهای دستی باید قبل از هر محور آزاد در هر شاردینگ تیره قرار گیرند.
- محورهای دستی نمیتوانند فاصلهگذاری ایجاد کنند. یعنی، اندازه بُعد باید بر اندازه محورهای دستی مربوطه قابل تقسیم باشد.
- شکلهای سراسری و محلی آرگومانها/نتایج مناطق عملیاتی باید با هم مطابقت داشته باشند.
ویژگیها: IsolatedFromAbove ، RecursiveMemoryEffects ، SingleBlockImplicitTerminator<ReturnOp> ، SingleBlock
رابطها: ShardableDataFlowOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | تقسیمبندی تانسور به ازای هر عملوند/نتیجه یک عملیات |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | تقسیمبندی تانسور به ازای هر عملوند/نتیجه یک عملیات |
manual_axes | ::mlir::sdy::ManualAxesAttr | فهرستی از محورهایی که یک ManualComputationOp به صورت دستی روی آنها کار میکند |
عملوندها:
| عملوند | توضیحات |
|---|---|
tensors | متغیر از هر نوع |
نتایج:
| نتیجه | توضیحات |
|---|---|
results | متغیر از هر نوع |
sdy.mesh (sdy::MeshOp)
مش نامگذاری شده
نحو:
operation ::= `sdy.mesh` $sym_name `=` $mesh attr-dict
یک مش جدید با نام تعریف میکند. همه مشهای موجود در یک ماژول باید تعداد دستگاههای یکسانی داشته باشند (به جز مشهایی که فقط یک device_id دارند). مش یک عملیات Symbol است که در SymbolTable ماژول ظاهر میشود و میتوان با name آن به آن ارجاع داد.
ویژگیها: HasParent<ModuleOp>
رابطها: Symbol
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
sym_name | ::mlir::StringAttr | ویژگی رشته |
mesh | ::mlir::sdy::MeshAttr | شبکهای از محورها و فهرستی از دستگاهها |
sdy.named_computation (sdy::NamedComputationOp)
عملیات محاسباتی نامگذاری شده
نحو:
operation ::= `sdy.named_computation` `<`$name`>` `` `(` $operands `)`
(`in_shardings````=```custom<StrippedTensorShardingPerValueAttr>($in_shardings)^)?
(`out_shardings````=```custom<StrippedTensorShardingPerValueAttr>($out_shardings)^)?
custom<SingleBlockRegionNoBlockId>($body)
attr-dict
`:` functional-type($operands, results)
یک محاسبه، یعنی یک بلوک از عملیات، را گروهبندی میکند و به آن نامی میدهد. انتشار به داخل/خارج از منطقه جریان مییابد، گویی همه چیز درونخطی شده است.
این میتواند برای مدیریت انتشار از طریق دستورالعملهای فراخوانی به توابع دیگر استفاده شود. هر کاربر Shardy باید یک مسیر import/export بنویسد که عملیات فراخوانی آنها را به عملیات sdy.named_computation تبدیل کند و بدنه تابع فراخوانی شده را در بدنه named_computation کپی/تکثیر کند.
نوع هر آرگومان بلوک و مقادیر برگشتی در ناحیه باید با نوع عملوندها و نوع نتایج op یکسان باشد.
مثال:
%1 = sdy.named_computation<"foo">(%0) (%arg1: tensor<16x32xf32>) {
sdy.return %arg1 : tensor<16x32xf32>
} : (tensor<16x32xf32>) -> tensor<16x32xf32>
ویژگیها: IsolatedFromAbove ، RecursiveMemoryEffects ، RecursivelySpeculatableImplTrait ، SingleBlockImplicitTerminator<ReturnOp> ، SingleBlock
رابطها: ConditionallySpeculatable ، InferTypeOpInterface ، ShardableDataFlowOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
name | ::mlir::StringAttr | ویژگی رشته |
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | تقسیمبندی تانسور به ازای هر عملوند/نتیجه یک عملیات |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | تقسیمبندی تانسور به ازای هر عملوند/نتیجه یک عملیات |
عملوندها:
| عملوند | توضیحات |
|---|---|
operands | متغیر از هر نوع |
نتایج:
| نتیجه | توضیحات |
|---|---|
| «بینام» | متغیر از هر نوع |
sdy.propagation_barrier (sdy::PropagationBarrierOp)
عملیات مانع انتشار
نحو:
operation ::= `sdy.propagation_barrier` $input `allowed_direction````=```$allowed_direction attr-dict `:` type($input)
این عملگر مانند یک عملگر هویت عمل میکند و همان مقداری را که به عنوان ورودی دریافت کرده است، در خروجی میدهد. اما از نظر انتشار، این امر فقط به انتشار اجازه میدهد تا در یک جهت خاص از طریق آن جریان یابد.
این امر مانع از انتشار خرده ریزها بین کاربردهای نتیجه عملیات مانع و عملوند آن میشود.
-
FORWARDبه این معنی است که شاردینگها فقط میتوانند از عملوند به نتیجه جریان پیدا کنند. - منظور از
BACKWARDاین است که شاردینگها فقط میتوانند از نتیجه به عملوند جریان پیدا کنند. -
NONEبه این معنی است که هیچ شاردینگی نمیتواند از طریق این عملیات منتشر شود. - نمیتوان
BOTHمشخص کرد، زیرا این گزینه اضافی خواهد بود.
صفات: AlwaysSpeculatableImplTrait ، SameOperandsAndResultType
رابطها: ConditionallySpeculatable ، InferTypeOpInterface ، NoMemoryEffect (MemoryEffectOpInterface)
اثرات: MemoryEffects::Effect{}
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
allowed_direction | ::mlir::sdy::PropagationDirectionAttr | جهت انتشار شمارشی |
عملوندها:
| عملوند | توضیحات |
|---|---|
input | تانسور رتبهبندیشده از هر نوع مقداری |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | تانسور رتبهبندیشده از هر نوع مقداری |
sdy.reduce_scatter (sdy::ReduceScatterOp)
ارتباط کاهش-پراکندگی را در امتداد محورها انجام میدهد
نحو:
operation ::= `sdy.reduce_scatter` $reduce_scatter_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
تکههایی از یک تانسور را در امتداد محورهای مشخص شده در reduce_scatter_axes کاهش میدهد و سپس نتیجه را در امتداد همان محورها پراکنده میکند. این عملیات اساساً ترکیبی از یک sdy.all_reduce و به دنبال آن یک sdy.all_slice در امتداد همان reduce_scatter_axes است.
محدودیتها:
- باید محدودیتهای ذکر شده در
Sdy_CollectiveOpInterfaceرا برآورده کند. - عناصر موجود در
reduce_scatter_axesباید محدودیتهای ذکر شده درAxisRefListAttrرا برآورده کنند. - اعمال
reduce_scatter_axesروی عملوند sharding باعث میشودout_sharding.
صفات: SameOperandsAndResultType
رابطها: CollectiveOpInterface ، InferTypeOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
reduce_scatter_axes | ::mlir::sdy::ListOfAxisRefListsAttr | فهرست مرجع محورها |
out_sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
tensor | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.reshard (sdy::ReshardOp)
یک تانسور را به یک شاردینگ متفاوت Reshard میکند
نحو:
operation ::= `sdy.reshard` $input $sharding attr-dict `:` type($result)
تانسور ورودی را با شاردینگ مشخص شده، که با شاردینگ موجود تانسور ورودی متفاوت است، Reshard میکند.
هر دو ShardingConstraintOp و ReshardOp یک شاردینگ را به یک تانسور متصل میکنند. طول عمر آنها به شرح زیر است:
- قبل از انتشار شاردینگ، ShardingConstraintOp توسط کاربران اضافه میشود.
- انتشار شاردینگ ShardingConstraintOp را مصرف میکند. در نتایج انتشار شاردینگ ShardingConstraintOp وجود ندارد. در عوض، در صورت نیاز میتوان ReshardOp را اضافه کرد.
- یک پارتیشنبند، یک ReshardOp را به یک عملیات جمعی (یا یک عملیات هویتی) تبدیل میکند. نباید هیچ ReshardOp در نتایج پارتیشنبند وجود داشته باشد.
// TODO(b/331680067). یک الگوی استانداردسازی برای حذف عملیات تکراری // reshard اضافه کنید.
صفات: AlwaysSpeculatableImplTrait ، SameOperandsAndResultType
رابطها: ConditionallySpeculatable ، InferTypeOpInterface ، NoMemoryEffect (MemoryEffectOpInterface) ، SymbolUserOpInterface
اثرات: MemoryEffects::Effect{}
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
input | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.return (sdy::ReturnOp)
عملیات sdy.return ناحیههای متصل به عملیاتهای مبتنی بر ناحیه sdy و هر عملیات مبتنی بر ناحیه Shardy دیگر را خاتمه میدهد. این عملیات متغیر است: لیستی از مقادیر را به عنوان آرگومان دریافت میکند که انواع آنها میتواند هر چیزی باشد (اما از یک نوع، مثلاً AnyTensor ) و بنابراین میتوان از آنها در سطوح مختلف پشته Shardy IR استفاده مجدد کرد.
نحو:
operation ::= `sdy.return` attr-dict ($results^ `:` type($results))?
ویژگیها: AlwaysSpeculatableImplTrait ، Terminator
رابطها: ConditionallySpeculatable ، NoMemoryEffect (MemoryEffectOpInterface)
اثرات: MemoryEffects::Effect{}
عملوندها:
| عملوند | توضیحات |
|---|---|
results | متغیر از هر نوع |
sdy.sharding_constraint (sdy::ShardingConstraintOp)
یک تانسور را به شاردینگ مشخص شده محدود میکند
نحو:
operation ::= `sdy.sharding_constraint` $input $sharding attr-dict `:` type($result)
یک تقسیمبندی (sharding) را به یک تانسور میانی (مثلاً نتیجه یک متمول) متصل میکند تا نشان دهد که آن تانسور یا زیرمجموعهای از کاربردهای آن، باید به این صورت تقسیمبندی شوند.
اگر خردایش ابعاد باز و محورهای بدون محدودیت داشته باشد، به این معنی است که تانسور میتواند در امتداد ابعاد باز خردتر شود.
این عملیات میتواند:
- هیچ کاربردی ندارند (آویزان هستند) - به این معنی که خرد کردن پیوست شده، نحوه خرد کردن خود تانسور ورودی است.
- کاربرد داشته باشد - به این معنی که تقسیمبندی پیوستشده، نحوه تقسیمبندی کاربردهای محدودیت تقسیمبندی op است، در حالی که سایر کاربردهای تانسور ورودی ممکن است تقسیمبندی متفاوتی داشته باشند (اگر تانسور ورودی هیچ کاربرد دیگری نداشته باشد، رفتار مشابه حالت بدون کاربرد است).
صفات: SameOperandsAndResultType
رابطها: InferTypeOpInterface ، SymbolUserOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | شاردینگ تانسور |
عملوندها:
| عملوند | توضیحات |
|---|---|
input | از هر نوع مقداری شکل گرفته است |
نتایج:
| نتیجه | توضیحات |
|---|---|
result | از هر نوع مقداری شکل گرفته است |
sdy.sharding_group (sdy::ShardingGroupOp)
تانسورهای موجود در گروه را ملزم میکند که شاردینگ یکسانی داشته باشند.
نحو:
operation ::= `sdy.sharding_group` $input `group_id````=```$group_id attr-dict `:` type($input)
این عملیات رابطی برای اختصاص تانسورها به گروههای شاردینگ (گروههایی از تانسورها که مجبور به شاردینگهای یکسان هستند) فراهم میکند. در طول انتشار، به محض اینکه یک عنصر گروه شاردینگ شود، تمام اعضای دیگر دقیقاً به همان روش شاردینگ میشوند. این عملیات آرگومان شناسه گروه را میگیرد و هیچ نتیجهای برنمیگرداند، اما در عوض نمایش گروه شاردینگ داخلی را تغییر میدهد تا تانسور ورودی را به گروه با شناسه داده شده اضافه کند.
رابطها: InferTypeOpInterface
ویژگیها:
| ویژگی | نوع MLIR | توضیحات |
|---|---|---|
group_id | ::mlir::اختصاصی عدد صحیح | ویژگی عدد صحیح بدون علامت ۶۴ بیتی |
عملوندها:
| عملوند | توضیحات |
|---|---|
input | تانسور رتبهبندیشده از هر نوع مقداری |
ویژگیها
AllToAllParamAttr
پارامتر همه به همه
نحو:
#sdy.all_to_all_param<
::llvm::ArrayRef<AxisRefAttr>, # axes
int64_t, # src_dim
int64_t # tgt_dim
>
یک تاپل شامل محورها و ابعاد منبع/هدف برای انجام عملیات همهجانبه روی آنها.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| محورها | ::llvm::ArrayRef<AxisRefAttr> | محورهایی که باید همه چیز را روی آنها انجام داد |
| src_dim | int64_t | شاخص بُعد منبع |
| tgt_dim | int64_t | شاخص بُعد هدف |
AllToAllParamListAttr
فهرست پارامترهای همه به همه
نحو:
#sdy.all_to_all_param_list<
::llvm::ArrayRef<AllToAllParamAttr> # value
>
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| ارزش | ::llvm::ArrayRef<AllToAllParamAttr> |
محورRefAttr
ارجاع به یک محور کامل یا یک زیرمحور مجزا
نحو:
#sdy.axis_ref<
::llvm::StringRef, # name
SubAxisInfoAttr # sub_axis_info
>
محدودیتها:
-
nameباید درMeshAttrمتصل وجود داشته باشد. - اگر
sub_axis_infoوجود داشته باشد، باید محدودیتهایSubAxisInfoAttrرا برآورده کند.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| نام | ::llvm::StringRef | نام این محور |
| sub_axis_info | SubAxisInfoAttr | اطلاعات بیشتر در صورتی که این یک زیر محور باشد |
محورهاRefListAttr
فهرست ارجاعات محورها
نحو:
#sdy.axis_ref_list<
::llvm::ArrayRef<AxisRefAttr> # value
>
محدودیتها:
- عناصر در
valueباید محدودیتهایAxisRefAttrرا برآورده کنند. - هیچ مرجع محور یا زیرمحور تکراری که با یکدیگر همپوشانی داشته باشند، وجود ندارد.
- هیچ دو مرجع محور مجاوری، زیرمحورهای متوالی از یک محور کامل نیستند، یعنی میتوانند در یک زیرمحور یا محور کامل ادغام شوند.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| ارزش | ::llvm::ArrayRef<AxisRefAttr> |
جزئیات محور به انتشارAttr
جزئیات جریان لبه انتشار برای یک محور و منبع خاص.
نحو:
#sdy.axis_to_propagation_details<
::mlir::sdy::AxisRefAttr, # axis_name
::mlir::sdy::EdgeValueRefAttr, # source
::llvm::ArrayRef<EdgeValueRefAttr> # targets
>
یک مرجع مقدار منبع را به لیستی از مراجع مقدار هدف در امتداد یک محور خاص نگاشت میکند.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| نام محور | ::mlir::sdy::AxisRefAttr | ارجاع به یک محور کامل یا یک زیرمحور مجزا |
| منبع | ::mlir::sdy::EdgeValueRefAttr | ارجاع به یک اندیس خاص از یک لبه مقداری از type type. |
| اهداف | ::llvm::ArrayRef<EdgeValueRefAttr> | فهرست مقادیر هدف لبه |
DimMappingAttr
فهرست شاخصهای عاملی برای یک بعد
یک لیست خالی نشان میدهد که این یک نگاشت تهی است (این نگاشت با * تجزیه/چاپ میشود)، یعنی بُعد به هیچ عاملی نگاشت نشده است.
محدودیتها:
- حداقل یک شاخص عاملی وجود دارد.
- شاخصهای فاکتور باید در محدوده [0,
$factor_sizes] باشند. - اگر چندین عامل وجود داشته باشد، هیچ یک از آنها نمیتواند اندازه ۱ داشته باشد.
- شاخصهای عاملی تکراری وجود نداشته باشد.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| شاخصهای فاکتور | ::llvm::ArrayRef<int64_t> | عواملی که این بعد به آنها نگاشت شده است |
DimensionShardingAttr
تقسیمبندی ابعاد
فهرست نامهای محورها برای خرد کردن یک بُعد تانسور از بزرگ به کوچک، یک مقدار بولی که نشان میدهد آیا بُعد میتواند بیشتر خرد شود یا خیر، و یک عدد صحیح اختیاری که اولویت خرد کردن این بُعد را نشان میدهد، که در طول انتشار خرد کردن رعایت خواهد شد. اولویتها از حاشیهنویسیهای خرد کردن کاربر سرچشمه میگیرند و مقدار پایینتر نشاندهنده اولویت بالاتر است. بالاترین اولویت زمانی در نظر گرفته میشود که اولویت در حاشیهنویسی وجود نداشته باشد.
محدودیتها:
- عناصر موجود در
axesباید محدودیتهای ذکر شده درAxisRefListAttrرا برآورده کنند. - اگر تقسیمبندی ابعاد اولویت داشته باشد:
- اولویت بزرگتر یا مساوی 0 است.
- اگر بُعد بسته باشد، حداقل یک محور دارد.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| محورها | ::llvm::ArrayRef<AxisRefAttr> | مرجع محورها |
| بسته شده است | bool | آیا این بُعد نمیتواند بیشتر تکهتکه شود؟ |
| اولویت | std::optional<int64_t> | اولویت مورد استفاده در طول انتشار مبتنی بر اولویت کاربر |
EdgeValueRefAttr
ارجاع به یک اندیس خاص از یک لبه مقداری از type type.
نحو:
#sdy.edge_value_ref<
::mlir::sdy::EdgeNodeType, # type
int64_t # index
>
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| نوع | ::mlir::sdy::EdgeNodeType | یک enum از نوع EdgeNodeType |
| شاخص | int64_t | اندیس عدد صحیح (0، 1، 2 و غیره) |
فهرست محورهاRefلیستهاAttr
فهرست مرجع محورها
نحو:
#sdy.list_of_axis_ref_lists<
::llvm::ArrayRef<AxisRefListAttr> # value
>
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| ارزش | ::llvm::ArrayRef<AxisRefListAttr> |
محورهای دستیAttr
فهرستی از محورهایی که یک ManualComputationOp به صورت دستی روی آنها کار میکند
نحو:
#sdy.manual_axes<
::llvm::ArrayRef<StringAttr> # value
>
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| ارزش | ::llvm::ArrayRef<StringAttr> |
مش اتر
شبکهای از محورها و فهرستی از دستگاهها
نحو:
#sdy.mesh<
::llvm::ArrayRef<MeshAxisAttr>, # axes
::llvm::ArrayRef<int64_t> # device_ids
>
یک مش (mesh) فهرستی از محورها و یک فهرست اختیاری از شناسههای دستگاه است که ترتیب دستگاه را مشخص میکند.
اگر لیست محورها خالی باشد
- اگر
device_idsارائه نشده باشد، یک مش خالی است. - اگر
device_idsارائه شود، باید یک عدد صحیح غیر منفی باشد، که ما آن را مش با حداکثر شاردینگ مینامیم.
اگر فهرست محورها ارائه شود
- اگر فهرست شناسه دستگاه مشخص شده باشد، حاصلضرب اندازه محورها باید با تعداد دستگاهها مطابقت داشته باشد.
- اگر فهرست شناسه دستگاه مشخص نشده باشد، فهرست ضمنی شناسه دستگاه iota(product(axes)) است. برای سادگی، ما همچنین تعیین فهرست شناسه دستگاهی که مشابه iota(product(axes)) باشد را مجاز نمیدانیم؛ در این حالت، فهرست شناسه دستگاه نباید مشخص شود.
- حتی اگر اندازه کل محورها ۱ باشد، این یک مش با حداکثر شاردینگ نیست.
در اینجا چند نمونه از شبکهها آورده شده است:
- یک مش خالی نشاندهنده یک مش حفرهدار است که میتواند در طول انتشار جایگزین شود: <[]>
- یک مش بدون فهرست محورها و یک شناسه دستگاه غیر منفی، که یک مش با حداکثر شاردینگ است: <[], device_ids=[3]>
- یک مش با دو محور و شناسههای دستگاه ضمنی iota(6): <["a"=2, "b"=3]>
- یک مش با دو محور و شناسههای دستگاه صریح که ترتیب دستگاه را مشخص میکنند: <["a"=3, "b"=2], device_ids=[0, 2, 4, 1, 3, 5]>
محدودیتها:
- عناصر موجود در
device_idsباید غیر منفی باشند. - اگر
axesخالی باشد، اندازهdevice_idsمیتواند ۰ (مش خالی) یا ۱ (مش با حداکثر شاردینگ) باشد. - اگر
axesخالی نباشند،- عناصر موجود در
axesنباید نامهای تکراری داشته باشند. - اگر
device_idsمشخص شده باشد،device_idsاصلیiota(product(axis_sizes))نیست وdevice_idsمرتب شدهiota(product(axis_sizes))است.
- عناصر موجود در
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| محورها | ::llvm::ArrayRef<MeshAxisAttr> | محورهای مش |
| شناسههای دستگاه | ::llvm::ArrayRef<int64_t> | ترتیب صریح دستگاه یا حداکثر شناسه دستگاه |
MeshAxisAttr
محور نامگذاری شده در یک مش
نحو:
#sdy.mesh_axis<
::llvm::StringRef, # name
int64_t # size
>
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| نام | ::llvm::StringRef | نام |
| اندازه | int64_t | اندازه این محور |
OpShardingRuleAttr
نحوه تقسیمبندی یک عملیات را مشخص میکند.
نحو:
#sdy.op_sharding_rule<
::llvm::ArrayRef<int64_t>, # factor_sizes
::llvm::ArrayRef<TensorMappingAttr>, # operand_mappings
::llvm::ArrayRef<TensorMappingAttr>, # result_mappings
::llvm::ArrayRef<int64_t>, # reduction_factors
::llvm::ArrayRef<int64_t>, # need_replication_factors
::llvm::ArrayRef<int64_t>, # permutation_factors
::llvm::ArrayRef<int64_t>, # blocked_propagation_factors
bool # is_custom_rule
>
یک قانون تقسیمبندی مشخص میکند که چگونه یک عملیات میتواند بر اساس ویژگیهای مختلف روی عملیات - هر ویژگی، شکل عملوندها، شکل نتایج و غیره - تقسیمبندی شود. برای مثال:
%0 = stablehlo.add %arg0, %arg1 {
sdy.sharding_rule = #sdy.op_sharding_rule<
([i, j],[i, j])->([i, j])
{i=8, j=8}>
} : tensor<8x8xf32>
%1 = stablehlo.dot_general %arg2, %arg3, contracting_dims = [1] x [0] {
sdy.sharding_rule = #sdy.op_sharding_rule<
([i, k],[k, j])->([i, j])
{i=8, j=16, k=8}>
}: (tensor<8x8xf32>, tensor<8x16xf32>) -> tensor<8x16xf32>
توجه داشته باشید که ما به فاکتورهایی با اندازه ۱ اجازه میدهیم، حتی اگر نتوان آنها را خرد کرد، این امر عمدتاً برای کامل بودن است زیرا بسیاری از عملیاتها مانند عملیاتهای نقطهای دارای ابعاد اندازه یک هستند که بین عملوندها و نتایج مطابقت دارند.
انواع فاکتور:
-
reduction_factorsشامل شاخصهای عواملی است که نیاز به کاهش دارند، مانند ابعاد انقباضی در یک عملیات نقطهای. این عوامل میتوانند در عملوندها باشند اما در نتایج نیستند. -
need_replication_factorsشامل شاخصهای عواملی است که نیاز به تکثیر کامل دارند، مانند بُعد مرتبشده در یک عملیات مرتبسازی. -
permutation_factorsشامل شاخصهای عواملی است که در صورت خرد شدن، نیاز به collective-permute دارند، مانند ابعاد padding در یک عملیات pad. - تمام عوامل دیگر به عنوان عوامل عبوری در نظر گرفته میشوند، یعنی عواملی که اگر به طور یکسان در تمام تانسورهایی که به آنها نگاشت شدهاند، تقسیمبندی شوند، نیازی به هیچ ارتباطی ندارند.
blocked_propagation_factors شامل عواملی است که شاردینگها اجازه انتشار در امتداد آنها را ندارند. این عامل متعامد با انواع عامل است. یعنی، یک عامل انتشار مسدود شده میتواند هر یک از انواع عامل باشد.
is_custom_rule توضیح میدهد که آیا این یک قانون تعریف شده توسط کاربر است یا خیر. کاربران میتوانند قوانین شاردینگ را برای فراخوانیهای سفارشی خود تعریف کنند یا قوانین شاردینگ از پیش تعریف شده را برای عملیات استاندارد بازنویسی کنند. یک قانون سفارشی همیشه حفظ میشود/هرگز حذف نمیشود.
محدودیتها:
- تعداد نگاشتهای عملوند/نتیجه باید با تعداد عملوندها/نتیجههای عملیات مطابقت داشته باشد.
- حداقل یک نگاشت وجود دارد (نمیتوان برای عملیاتی که عملوند/نتیجه ندارد، قاعدهای داشت).
- رتبه هر
TensorMappingAttrبا رتبه نوع تانسور مربوطه مطابقت دارد. - برای هر گروه از عوامل (
reduction_factors,need_replication_factors,permutation_factors):- عناصر باید در محدوده [0,
$factor_sizes] باشند. - هیچ شاخص عاملی تکراری در هر گروه و بین گروهها وجود ندارد.
- عناصر باید در محدوده [0,
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| اندازه فاکتورها | ::llvm::ArrayRef<int64_t> | اندازه همه عوامل در این قانون |
| نگاشتهای عملوند | ::llvm::ArrayRef<TensorMappingAttr> | نگاشتهای عملوند |
| نگاشتهای نتیجه | ::llvm::ArrayRef<TensorMappingAttr> | نگاشتهای نتیجه |
| عوامل_کاهش | ::llvm::ArrayRef<int64_t> | عواملی که نیاز به کاهش دارند |
| فاکتورهای_تکثیر_نیاز | ::llvm::ArrayRef<int64_t> | عواملی که نیاز به تکثیر کامل دارند |
| عوامل_جایگشت | ::llvm::ArrayRef<int64_t> | عواملی که نیاز به جایگشت جمعی دارند |
| عوامل_انتشار_مسدود شده | ::llvm::ArrayRef<int64_t> | عواملی که خرده شیشهها در امتداد آنها پخش نمیشوند |
| is_custom_rule | bool | اینکه آیا این قانون برای یک stablehlo.custom_call است یا خیر |
لبههای انتشارAttr
فرادادههای لبه انتشار برای تمام مراحل انتشار.
نحو:
#sdy.propagation_edges<
::llvm::ArrayRef<PropagationOneStepAttr> # value
>
فهرستی از جزئیات انتشار در هر محور برای یک مقدار، که بر اساس شاخص گام گروهبندی شدهاند.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| ارزش | ::llvm::ArrayRef<PropagationOneStepAttr> |
تکثیر تک مرحلهای
فراداده انتشار در هر مرحله.
نحو:
#sdy.propagation_one_step<
int64_t, # step_index
::llvm::ArrayRef<AxisToPropagationDetailsAttr> # axis_entries
>
جزئیات انتشار برای همه محورها برای یک گام انتشار واحد.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| step_index | int64_t | شاخص گام |
| axis_entries | ::llvm::ArrayRef<AxisToPropagationDetailsAttr> | جزئیات انتشار محور به ازای هر تصمیم انتشار |
SubAxisInfoAttr
اطلاعاتی در مورد چگونگی مشتق شدن این زیرمحور از محور کامل
نحو:
#sdy.sub_axis_info<
int64_t, # pre_size
int64_t # size
>
هنگام تقسیم یک محور کامل به n زیرمحور، محور به شکل [k_1,...,k_n] تغییر شکل میدهد و زیرمحور iام را میتوان با حاصلضرب تمام اندازههای محورهای سمت چپ آن بیان کرد: m=prod(k_1,...,k_(i-1)) (معروف به pre-size) و اندازه k_i. بنابراین، ویژگی sub-axis-info این دو عدد را در خود نگه میدارد و به صورت زیر نشان داده میشود: (m)k برای pre-size m و اندازه k.
محدودیتها:
-
pre-sizeحداقل ۱ است. -
sizeبزرگتر از ۱ است. -
pre-sizeباید اندازه کل محور را تقسیم کند، یعنی همpre-sizeو همsizeاندازه کل محور را تقسیم میکنند و زیرمحور از محور کل فراتر نمیرود. - اندازه زیرمحور با اندازه محور کامل مربوطه برابر نیست، در این صورت باید از محور کامل استفاده شود.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| اندازه_پیش_اندازه | int64_t | حاصلضرب اندازههای زیرمحور در سمت چپ این زیرمحور |
| اندازه | int64_t | اندازه این زیر محور |
TensorMappingAttr
نگاشتهای عاملی برای هر بُعد از یک تانسور.
نحو:
#sdy.tensor_mapping<
::llvm::ArrayRef<DimMappingAttr> # dim_mappings
>
محدودیتها:
- عناصر موجود در
dim_mappingsباید محدودیتهای موجود درDimMappingAttrرا برآورده کنند. - هیچ شاخص عاملی تکراری در ابعاد مختلف وجود ندارد.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| dim_mappings | ::llvm::ArrayRef<DimMappingAttr> | نگاشتهای ابعادی |
TensorShardingAttr
شاردینگ تانسور
نحو:
#sdy.sharding<
::mlir::Attribute, # mesh_or_ref
::llvm::ArrayRef<DimensionShardingAttr>, # dim_shardings
::llvm::ArrayRef<AxisRefAttr>, # replicated_axes
::llvm::ArrayRef<AxisRefAttr> # unreduced_axes
>
یک تکهبندی تانسور به یک مش خاص محدود میشود و فقط میتواند به نام محورهای آن مش ارجاع دهد. تکهبندیهای ابعاد به ما میگویند که برای هر بُعد تانسور، در امتداد کدام محورها (یا زیرمحورها) از بزرگ به کوچک تکهبندی شده است. تمام محورهای دیگر که بُعدی تکهبندی نمیکنند، به طور ضمنی یا صریح (اگر در لیست محورهای تکثیر شده ظاهر شوند) تکثیر میشوند.
توجه داشته باشید که هیچ ویژگی شاردینگی روی یک تانسور معادل شاردینگ تانسور کاملاً باز نیست.
مشبندی که این شاردینگ به آن متصل است، میتواند یا با نام یک نماد که به نماد MeshOp مربوطه اشاره میکند، یا با یک MeshAttr درونخطی مشخص شود.
یک تقسیمبندی میتواند محورهای کاهش نیافته داشته باشد (که با unreduced_axes مشخص میشود)، به این معنی که تانسور در امتداد این محورها کاهش نیافته است. برای مثال، اگر بُعد انقباضی یک matmul در امتداد محور x در هر دو lhs و rhs تقسیمبندی شود، نتیجه در امتداد x کاهش نیافته است. اعمال یک کاهش کامل روی تانسور در امتداد محورهای کاهش نیافته باعث میشود تانسور در امتداد آن محورها تکرار شود. با این حال، یک تانسور با محورهای کاهش نیافته لازم نیست بلافاصله کاهش یافته باشد، میتواند هنگام انتقال به عملیات خطی مانند stablehlo.add (تا زمانی که هر دو lhs و rhs کاهش نیافته باشند) و پس از آن کاهش یافته، کاهش نیافته باقی بماند. ما فرض میکنیم نوع کاهش sum است، کاهشهای دیگر ممکن است در آینده پشتیبانی شوند.
محدودیتها:
- عناصر موجود در
dim_shardingsباید محدودیتهای ذکر شده درDimensionShardingAttrرا برآورده کنند. - عناصر موجود در
replicated_axesباید محدودیتهای ذکر شده درAxisRefListAttrرا برآورده کنند. - عناصر موجود در
unreduced_axesباید محدودیتهای ذکر شده درAxisRefListAttrرا برآورده کنند. - اگر نوع تانسور مربوطه
ShapedTypeنباشد، شاردینگ باید دارای رتبه ۰ و بدون محورهای تکثیر شده باشد. - اگر از
ShapedTypeباشد، آنگاه:- تانسور باید دارای رتبه باشد.
- تعداد تقسیمبندیهای ابعاد برابر با رتبهی تانسور است.
- ابعاد با اندازه ۰ خرد نمیشوند.
- هیچ ارجاع محور یا زیرمحور تکراری وجود ندارد که در
dim_shardings،replicated_axesوunreduced_axesبا یکدیگر همپوشانی داشته باشند. - موارد موجود در
replicated_axesوunreduced_axesبر اساسmesh_or_refمرتب میشوند (بهAxisRefAttr::getMeshComparatorمراجعه کنید).
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| mesh_or_ref | ::mlir::Attribute | مرجع نماد مش یا مش مسطح |
| dim_shardings | ::llvm::ArrayRef<DimensionShardingAttr> | خرده ریزهای ابعادی |
| محورهای تکثیر شده | ::llvm::ArrayRef<AxisRefAttr> | مرجع محورها |
| محورهای_کاهش_نیافته | ::llvm::ArrayRef<AxisRefAttr> | مرجع محورها |
TensorShardingPerValueAttr
تقسیمبندی تانسور به ازای هر عملوند/نتیجه یک عملیات
نحو:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
فهرستی از TensorShardingAttr ها، یکی برای هر عملوند/نتیجه یک عملیات.
محدودیتها:
- عناصر موجود در
shardingsباید محدودیتهایTensorShardingAttrرا برآورده کنند.
پارامترها:
| پارامتر | نوع C++ | توضیحات |
|---|---|---|
| خرده ریزها | ::llvm::ArrayRef<TensorShardingAttr> | شاردینگ به ازای هر مقدار |
انومها
نوع گره لبه
نوع گره لبهای enum
موارد:
| نماد | ارزش | رشته |
|---|---|---|
| عملوند | 0 | عملوند |
| نتیجه | 1 | نتیجه |
جهت انتشار
جهت انتشار شمارشی
موارد:
| نماد | ارزش | رشته |
|---|---|---|
| هیچکدام | 0 | هیچکدام |
| به جلو | 1 | به جلو |
| رو به عقب | 2 | رو به عقب |
| هر دو | 3 | هر دو |