گویش شاردی (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
فهرستی از فهرستهای محورها است. فهرست بیرونی بیش از ابعاد تانسور است. هر فهرست داخلی محورهایی را مشخص می کند که در امتداد آنها جمع آوری جداگانه در بعد مربوطه باید انجام شود. برای به دست آوردن تقسیم بندی نتیجه ( out_sharding
) روی تقسیم بندی عملوند ( tensor
) اعمال خواهد شد.
توجه داشته باشید که 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
به عملوند به اشتراک گذاری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
را برآورده کند. - عملوند sharding و
out_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
لیستی از لیستهای محورها است. فهرست بیرونی بیش از ابعاد تانسور است. هر فهرست داخلی محورهایی را مشخص می کند که در امتداد آنها یک برش باید در بعد مربوطه انجام شود. برای به دست آوردن تقسیم بندی نتیجه ( out_sharding
) روی تقسیم بندی عملوند ( tensor
) اعمال خواهد شد.
توجه داشته باشید که 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
به عملوند shardingout_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)
برای هر تاپل (محور، src_dim، tgt_dim) در لیست پارامترها، این عملیات تکههای یک تانسور را در امتداد بعد tgt_dim
و محورهای مشخصشده در axes
برش میدهد، آن تکهها را در امتداد محورها پراکنده میکند و آنها را در امتداد بعد src_dim
به هم متصل میکند.
این عملیات اساساً ترکیبی از یک all-gather در امتداد src_dim
و axes
و به دنبال آن یک قطعه تمام در امتداد tgt_dim
و axes
است، یعنی پسوندی از بعد تقسیم محور src_dim
در تانسور ورودی به بعد تقسیم محور tgt_dim
در خروجی اضافه میشود.
all-to-all برای به اشتراک گذاری عملوند ( 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
در عملوند shardingout_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::ElementsAttr | ویژگی بردار/تانسور ثابت |
نتایج:
نتیجه | توضیحات |
---|---|
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
منفرد غیرقابل تغییر برای تقسیمبندی نتایج است). - هنگامی که اشتراک گذاری منبع تغییر کرد، هر لبه را جداگانه به لیست کاری اضافه کنید.
Propagation تقسیمبندیها را بین همه منابع و اهداف یک sdy.data_flow_edge
منتشر میکند، بهگونهای که گویی یک عملیات معمولی با منابع بهعنوان عملوند و اهداف بهعنوان نتایج، و هویت sdy.op_sharding_rule
است. این بدان معناست که انتشار رو به جلو از منبع به هدف و انتشار به عقب از هدف به منبع است.
ما اجازه نمی دهیم ورودی یک sdy.data_flow_edge
توسط یک عملیات SdyDialect
تعریف شود، بنابراین می توانیم فرض کنیم که توسط یک op که دارای ویژگی 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 نیستند - رخ می دهد.
توجه داشته باشید که انتظار میرود هر تانسور رتبهبندی نشده دارای یک تقسیمبندی با رتبه 0 باشد، یعنی کاملاً تکرار شود.
محدودیت ها:
- عناصر موجود در
in_shardings
وout_shardings
باید محدودیت های فهرست شده درTensorShardingAttr
را برآورده کنند. - تعداد ورودی/خروجی تانسور سراسری و محلی منطقه عملیاتی باید مطابقت داشته باشد.
- محورهای دستی باید قبل از هر محور آزاد در هر شاردینگ کم نور قرار گیرند.
- محورهای دستی نمی توانند بالشتک را معرفی کنند. یعنی اندازه ابعاد باید بر اندازه محورهای دستی مربوطه قابل تقسیم باشد.
- شکلهای جهانی و محلی آرگومانها/نتایج مناطق عملیاتی باید مطابقت داشته باشند.
صفات: 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
ops تبدیل کند و بدنه تابع فراخوانده شده را در بدنه named_computation
کپی/کپی کند.
نوع آرگومان های هر بلوک و مقادیر برگشتی در منطقه باید با نوع عملوندها و نوع نتایج عملیات یکسان باشد.
مثال:
%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 | جهت انتشار enum |
عملگرها:
عملوند | توضیحات |
---|---|
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
به عملوند، به اشتراک گذاریout_sharding
تبدیل می شود.
صفات: SameOperandsAndResultType
رابط ها: CollectiveOpInterface
، InferTypeOpInterface
، SymbolUserOpInterface
ویژگی ها:
صفت | نوع MLIR | توضیحات |
---|---|---|
reduce_scatter_axes | ::mlir::sdy::ListOfAxisRefListsAttr | لیست لیست های مرجع |
out_sharding | ::mlir::sdy::TensorShardingAttr | تقسیم تانسور |
عملگرها:
عملوند | توضیحات |
---|---|
tensor | از هر نوع ارزشی شکل گرفته است |
نتایج:
نتیجه | توضیحات |
---|---|
result | از هر نوع ارزشی شکل گرفته است |
sdy.reshard
(sdy::ReshardOp)
یک تانسور را مجدداً به یک تقسیم بندی متفاوت تبدیل می کند
نحو:
operation ::= `sdy.reshard` $input $sharding attr-dict `:` type($result)
تانسور ورودی را با تقسیم بندی مشخص شده مجدداً شارد می کند، که با اشتراک گذاری موجود تانسور ورودی متفاوت است.
هم ShardingConstraintOp و هم ReshardOp یک شاردینگ را به یک تانسور متصل می کنند. طول عمر آنها عبارت است از:
- قبل از انتشار به اشتراک گذاری، ShardingConstraintOp توسط کاربران اضافه می شود.
- انتشار Sharding، ShardingConstraintOp را مصرف می کند. هیچ ShardingConstraintOp در نتایج انتشار شاردینگ وجود ندارد. در عوض، ReshardOp ممکن است در صورت نیاز اضافه شود.
- یک پارتیشنکننده یک ReshardOp را به یک op جمعی (یا یک عملیات هویتی) تبدیل میکند. در نتایج پارتیشنکننده نباید 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
) باشد و بنابراین میتواند در سطوح مختلف پشته IR Shardy دوباره استفاده شود.
نحو:
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)
یک تقسیم بندی را به یک تانسور میانی (مثلاً نتیجه یک ماتمول) متصل می کند تا نشان دهد که این تانسور یا زیر مجموعه ای از کاربردهای آن باید به این ترتیب تقسیم شود.
اگر شاردینگ دارای ابعاد باز و محورهای بدون محدودیت باشد، به این معنی است که تانسور را می توان بیشتر در امتداد ابعاد باز خرد کرد.
این عملیات می تواند:
- بدون استفاده (آویزان) - به این معنی که شاردینگ متصل به این صورت است که خود تانسور ورودی چگونه باید خرد شود.
- دارای کاربردها باشد - به این معنی که تقسیم بندی متصل به این صورت است که استفاده از عملیات محدودیت تقسیم بندی باید چگونه تقسیم شود، در حالی که سایر کاربردهای تانسور ورودی ممکن است تقسیم بندی متفاوتی داشته باشند (اگر تانسور ورودی کاربرد دیگری نداشته باشد، رفتار مشابه حالت بدون استفاده است).
صفات: 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::IntegerAttr | ویژگی عدد صحیح بدون علامت 64 بیتی |
عملگرها:
عملوند | توضیحات |
---|---|
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> |
AxisRefAttr
ارجاع به یک محور کامل یا یک محور فرعی تقسیم شده
نحو:
#sdy.axis_ref<
::llvm::StringRef, # name
SubAxisInfoAttr # sub_axis_info
>
محدودیت ها:
-
name
باید درMeshAttr
محدود شده باشد. - اگر
sub_axis_info
وجود داشته باشد، باید محدودیت هایSubAxisInfoAttr
را برآورده کند.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
نام | ::llvm::StringRef | نام این محور |
اطلاعات فرعی | SubAxisInfoAttr | اطلاعات اضافی اگر این یک محور فرعی است |
AxisRefListAttr
فهرست ارجاعات محوری
نحو:
#sdy.axis_ref_list<
::llvm::ArrayRef<AxisRefAttr> # value
>
محدودیت ها:
- عناصر در
value
باید محدودیت هایAxisRefAttr
را برآورده کنند. - هیچ محور تکراری یا محور فرعی وجود ندارد که با یکدیگر همپوشانی داشته باشند.
- هیچ دو محور همجوار، زیرمحورهای متوالی از همان محور کامل نیستند، یعنی میتوانند در یک محور فرعی یا محور کامل ادغام شوند.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
ارزش | ::llvm::ArrayRef<AxisRefAttr> |
AxisToPropagationDetailsAttr
جزئیات جریان لبه انتشار برای یک محور و منبع خاص.
نحو:
#sdy.axis_to_propagation_details<
::mlir::sdy::AxisRefAttr, # axis_name
::mlir::sdy::EdgeValueRefAttr, # source
::llvm::ArrayRef<EdgeValueRefAttr> # targets
>
یک مرجع ارزش منبع را به فهرستی از مراجع ارزش هدف در امتداد یک محور خاص نگاشت می کند.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
axis_name | ::mlir::sdy::AxisRefAttr | ارجاع به یک محور کامل یا یک محور فرعی تقسیم شده |
منبع | ::mlir::sdy::EdgeValueRefAttr | ارجاع به یک شاخص خاص از لبه مقدار از type . |
اهداف | ::llvm::ArrayRef<EdgeValueRefAttr> | لیست مقادیر هدف لبه |
DimMappingAttr
فهرست شاخص های عاملی برای یک بعد
یک لیست خالی نشان می دهد که این یک نگاشت تهی است (این با *
تجزیه/چاپ شده است)، یعنی بعد به هیچ عاملی نگاشت نشده است.
محدودیت ها:
- حداقل یک شاخص عامل وجود دارد.
- شاخص های عامل باید در محدوده [0,
$factor_sizes
) باشد. - اگر چندین فاکتور وجود داشته باشد، هیچ یک از آنها نمی توانند سایز 1 داشته باشند.
- بدون شاخص های عامل تکراری.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
عوامل_شاخص | ::llvm::ArrayRef<int64_t> | عواملی که این بعد به آنها ترسیم شده است |
DimensionShardingAttr
تقسیم بندی ابعاد
فهرستی از نام محورها برای خرد کردن یک بعد تانسور از بزرگ به کوچک، یک بولی که نشان میدهد آیا میتوان بعد را بیشتر خرد کرد یا نه، و یک عدد صحیح اختیاری که نشاندهنده اولویت تقسیمبندی این بعد است، که در طول انتشار تقسیمبندی رعایت میشود. اولویت ها از حاشیه نویسی های اشتراک گذاری کاربر سرچشمه می گیرند و مقدار کمتر نشان دهنده اولویت بالاتر است. بالاترین اولویت زمانی در نظر گرفته می شود که اولویت در حاشیه نویسی وجود نداشته باشد.
محدودیت ها:
- عناصر موجود در
axes
باید محدودیت های فهرست شده درAxisRefListAttr
را برآورده کنند. - اگر تقسیم ابعاد دارای اولویت است:
- اولویت بزرگتر یا مساوی 0 است.
- بعد اگر بسته باشد حداقل یک محور دارد.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
تبرها | ::llvm::ArrayRef<AxisRefAttr> | ارجاعات محوری |
is_closed | bool | آیا این بعد را نمی توان بیشتر تقسیم کرد |
اولویت | std::optional<int64_t> | اولویتی که در طول انتشار مبتنی بر اولویت کاربر استفاده می شود |
EdgeValueRefAttr
ارجاع به یک شاخص خاص از لبه مقدار از type
.
نحو:
#sdy.edge_value_ref<
::mlir::sdy::EdgeNodeType, # type
int64_t # index
>
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
نوع | ::mlir::sdy::EdgeNodeType | یک عدد از نوع EdgeNodeType |
شاخص | int64_t | شاخص عدد صحیح (0، 1، 2، و غیره) |
ListOfAxisRefListsAttr
لیست لیست های مرجع
نحو:
#sdy.list_of_axis_ref_lists<
::llvm::ArrayRef<AxisRefListAttr> # value
>
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
ارزش | ::llvm::ArrayRef<AxisRefListAttr> |
ManualAxesAttr
فهرستی از محورهایی که ManualComputationOp روی آنها به صورت دستی است
نحو:
#sdy.manual_axes<
::llvm::ArrayRef<StringAttr> # value
>
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
ارزش | ::llvm::ArrayRef<StringAttr> |
MeshAttr
مش محورها و لیستی از دستگاه ها
نحو:
#sdy.mesh<
::llvm::ArrayRef<MeshAxisAttr>, # axes
::llvm::ArrayRef<int64_t> # device_ids
>
مش فهرستی از محورها و فهرست اختیاری شناسههای دستگاه است که سفارش دستگاه را مشخص میکند.
اگر فهرست محورها خالی باشد، مش دارای یک محور ضمنی بدون نام به اندازه 1 است. در این حالت، اگر فهرست شناسه دستگاه ارائه نشده باشد، فهرست شناسه دستگاه ضمنی [0] است. اگر لیست شناسه دستگاه ارائه شده باشد، باید دارای یک عدد صحیح با هر مقدار غیر منفی باشد. ما این مورد را حداکثر تقسیم بندی می نامیم.
برای همه موارد غیر حداکثر اشتراکگذاری، اگر فهرست شناسه دستگاه مشخص شده باشد، حاصل ضرب اندازههای محور باید با تعداد دستگاهها مطابقت داشته باشد. اگر لیست شناسه دستگاه مشخص نشده باشد، لیست شناسه دستگاه ضمنی iota (محصول(محور)) است. برای سادگی، ما همچنین تعیین لیست شناسه دستگاه که همان iota(product(axes)) است را ممنوع می کنیم. در این مورد، لیست شناسه دستگاه نباید مشخص شود.
در اینجا چند نمونه از مش ها آورده شده است:
- یک مش خالی نشان دهنده یک شبکه نگهدارنده است که می تواند در حین انتشار جایگزین شود: <[]>
- یک مش با یک محور بدون نام و یک شناسه دستگاه صریح، که معمولاً برای نمایش حداکثر اشتراکگذاری استفاده میشود: <[], device_ids=[3]>
- مش با دو محور و شناسههای دستگاه ضمنی iota(6): <["a"=2، "b"=3]>
- مش با دو محور و شناسههای صریح دستگاه که سفارش دستگاه را مشخص میکند: <["a"=3، "b"=2]، device_ids=[0، 2، 4، 1، 3، 5]>
محدودیت ها:
- عناصر موجود در
axes
نباید نام تکراری داشته باشند. - اگر
device_ids
مشخص شده باشد:- حاصل ضرب اندازه های محور باید با تعداد دستگاه ها مطابقت داشته باشد.
- همه عناصر آن باید غیر منفی باشند.
-
device_ids
نباید برابر باiota(product(axis_sizes))
باشد. -
device_ids
مرتب شده بایدiota(product(axis_sizes))
باشد.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
تبرها | ::llvm::ArrayRef<MeshAxisAttr> | محورهای مشبک |
device_ids | ::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>
توجه داشته باشید که ما فاکتورهایی را با اندازه 1 مجاز میکنیم، حتی اگر نمیتوان آنها را تقسیم کرد، این عمدتاً برای کامل بودن است زیرا بسیاری از عملیاتها مانند عملیات نقطهای دارای ابعاد اندازه یک هستند که با عملوندها و نتایج مطابقت دارند.
انواع عوامل:
-
reduction_factors
شامل شاخص های عواملی است که نیاز به کاهش دارند، مانند ابعاد انقباض در یک عمل نقطه. این عوامل می توانند در عملوندها باشند اما در نتایج نه. -
need_replication_factors
شامل شاخص های عواملی است که نیاز به تکرار کامل دارند، مانند بعد مرتب شده در یک عملیات مرتب سازی. -
permutation_factors
شامل شاخص های فاکتورهایی است که در صورت تکه تکه شدن، به جایگشت جمعی نیاز دارند، مانند ابعاد padding در یک عملیات پد. - همه عوامل دیگر به عنوان فاکتورهای عبوری در نظر گرفته می شوند، به عنوان مثال، فاکتورهایی که اگر به طور یکسان در همه تانسورهایی که به آنها نگاشت می شوند، به هیچ ارتباطی نیازی نداشته باشند.
blocked_propagation_factors
شامل فاکتورهایی است که در آنها به اشتراک گذاری اجازه انتشار داده نمی شود. این متعامد به انواع عامل است. یعنی یک عامل انتشار مسدود شده می تواند هر یک از انواع فاکتورها باشد.
is_custom_rule
توضیح می دهد که آیا این یک قانون تعریف شده توسط یک کاربر است یا خیر. کاربران می توانند قوانین اشتراک گذاری را برای تماس های سفارشی خود تعریف کنند یا قوانین اشتراک گذاری از پیش تعریف شده را برای عملیات استاندارد بازنویسی کنند. یک قانون سفارشی همیشه حفظ می شود/هرگز حذف نمی شود.
محدودیت ها:
- تعداد عملوند/نتایج نگاشت باید با تعداد عملوند/نتایج عملیات مطابقت داشته باشد.
- حداقل یک نقشه برداری وجود دارد (نمی توان برای عملیات بدون عملوند/نتیجه قاعده ای داشت).
- رتبه هر
TensorMappingAttr
با رتبه نوع تانسور مربوطه مطابقت دارد. - برای هر گروه از عوامل (
reduction_factors
،need_replication_factors
،permutation_factors
):- عناصر باید در محدوده [0,
$factor_sizes
] باشند. - هیچ شاخص عامل تکراری در هر گروه و در بین گروه ها وجود ندارد.
- عناصر باید در محدوده [0,
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
فاکتور_اندازه ها | ::llvm::ArrayRef<int64_t> | اندازه همه عوامل در این قانون |
operand_mappings | ::llvm::ArrayRef<TensorMappingAttr> | نگاشت عملوند |
result_mappings | ::llvm::ArrayRef<TensorMappingAttr> | نگاشت نتایج |
کاهش_عوامل | ::llvm::ArrayRef<int64_t> | عواملی که نیاز به کاهش دارند |
نیاز_عوامل_تکثیر | ::llvm::ArrayRef<int64_t> | عواملی که نیاز به تکرار کامل دارند |
عوامل_جایگزینی | ::llvm::ArrayRef<int64_t> | عواملی که نیاز به جابجایی جمعی دارند |
blocked_propagation_factors | ::llvm::ArrayRef<int64_t> | عواملی که در امتداد آنها خرده ها منتشر نمی شوند |
is_custom_rule | bool | آیا این قانون برای stablehlo.custom_call است |
PropagationEdgesAttr
فراداده لبه انتشار برای همه مراحل انتشار.
نحو:
#sdy.propagation_edges<
::llvm::ArrayRef<PropagationOneStepAttr> # value
>
فهرستی از جزئیات انتشار در هر محور برای یک مقدار، گروه بندی شده بر اساس شاخص مرحله.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
ارزش | ::llvm::ArrayRef<PropagationOneStepAttr> |
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))
(با نام پیشاندازه) و اندازه k_i بیان کرد. بنابراین، ویژگی sub-axis-info آن دو عدد را نگه میدارد و به صورت زیر نشان داده میشود: (m)k
برای پیش اندازه m و اندازه k.
محدودیت ها:
-
pre-size
حداقل 1 است. -
size
بزرگتر از 1 است. -
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
) داشته باشد، به این معنی که تانسور در امتداد این محورها کاهش نیافته است. به عنوان مثال، اگر بعد انقباض یک ماتمول در امتداد محور x
در هر دو lhs و rhs تقسیم شود، نتیجه در امتداد x
کاهش نمی یابد. اعمال یک کاهش کامل بر روی تانسور در امتداد محورهای کاهش نیافته باعث می شود تانسور در امتداد آن محورها تکرار شود. با این حال، یک تانسور با محورهای کاهش نیافته لزومی ندارد که فوراً تماماً کاهش یابد، میتواند در صورت انتقال به عملیات خطی مانند stablehlo.add
(تا زمانی که هم lhs و هم rhs کاهش نیافته باشند) کاهش نیافته و پس از آن کاملاً کاهش مییابد. ما نوع کاهش را مجموع فرض میکنیم، کاهشهای دیگری ممکن است در آینده پشتیبانی شوند.
محدودیت ها:
- عناصر موجود در
dim_shardings
باید محدودیت های فهرست شده درDimensionShardingAttr
را برآورده کنند. - عناصر موجود در
replicated_axes
باید محدودیت های فهرست شده درAxisRefListAttr
را برآورده کنند. - عناصر موجود در
unreduced_axes
باید محدودیت های فهرست شده درAxisRefListAttr
را برآورده کنند. - اگر نوع تانسور مربوطه یک
ShapedType
نیست، تقسیم بندی باید دارای رتبه 0 و بدون محورهای تکراری باشد. - اگر یک
ShapedType
است، پس:- تانسور باید دارای رتبه باشد.
- تعداد تقسیمبندیهای ابعادی برابر با رتبه تانسور است.
- ابعاد اندازه 0 تکه تکه نشده است.
- هیچ محور تکراری یا محور فرعی وجود ندارد که در بین
dim_shardings
،replicated_axes
وunreduced_axes
با یکدیگر همپوشانی داشته باشند. - آیتمهای موجود در
replicated_axes
وunreduced_axes
به صورت wrtmesh_or_ref
مرتب میشوند (بهAxisRefAttr::getMeshComparator
مراجعه کنید).
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
مش_یا_رف | ::mlir::Attribute | مش attr یا علامت مش مسطح مرجع attr |
dim_shardings | ::llvm::ArrayRef<DimensionShardingAttr> | خرد شدن ابعاد |
replicate_axes | ::llvm::ArrayRef<AxisRefAttr> | ارجاعات محوری |
محورهای_کاهش نشده | ::llvm::ArrayRef<AxisRefAttr> | ارجاعات محوری |
TensorShardingPerValueAttr
تقسیم بندی تانسور در هر عملوند/نتیجه یک عملیات
نحو:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
فهرستی از TensorShardingAttr
s، یکی برای هر عملوند/نتیجه یک عملیات.
محدودیت ها:
- عناصر موجود در
shardings
باید محدودیت هایTensorShardingAttr
را برآورده کنند.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
خرد شدن | ::llvm::ArrayRef<TensorShardingAttr> | اشتراک گذاری در هر مقدار |
Enums
EdgeNodeType
نوع گره لبه enum
موارد:
نماد | ارزش | رشته |
---|---|---|
OPERAND | 0 | عملوند |
نتیجه | 1 | نتیجه |
جهت انتشار
جهت انتشار enum
موارد:
نماد | ارزش | رشته |
---|---|---|
هیچکدام | 0 | هیچکدام |
به جلو | 1 | به جلو |
عقب | 2 | عقب |
هر دو | 3 | هر دو |