گویش Shardy (SDY) یک نمایش تقسیم بندی تانسور مبتنی بر محور و اجزای API اضافی را برای اتصال شاردنگ ها به تانسورها تعریف می کند.
عملیات
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 هستند) تعریف می کند. 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
ویژگی ها:
صفت | نوع 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 نیستند - رخ می دهد.
صفات: IsolatedFromAbove
، RecursiveMemoryEffects
، SingleBlockImplicitTerminator<ReturnOp>
، SingleBlock
ویژگی ها:
صفت | نوع MLIR | توضیحات |
---|---|---|
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | تقسیم بندی تانسور در هر عملوند/نتیجه یک عملیات |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | تقسیم بندی تانسور در هر عملوند/نتیجه یک عملیات |
manual_axes | ::mlir::sdy::ManualAxesAttr |
عملگرها:
عملوند | توضیحات |
---|---|
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
، ShardableDataFlowOpInterface
ویژگی ها:
صفت | نوع 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
، Elementwise
، SameOperandsAndResultType
رابط ها: ConditionallySpeculatable
، InferTypeOpInterface
، NoMemoryEffect (MemoryEffectOpInterface)
جلوه ها: MemoryEffects::Effect{}
ویژگی ها:
صفت | نوع MLIR | توضیحات |
---|---|---|
allowed_direction | ::mlir::sdy::PropagationDirectionAttr | جهت انتشار enum |
عملگرها:
عملوند | توضیحات |
---|---|
input | تانسور رتبه بندی شده از هر نوع مقدار |
نتایج:
نتیجه | توضیحات |
---|---|
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
، Elementwise
، SameOperandsAndResultType
رابط ها: ConditionallySpeculatable
، InferTypeOpInterface
، NoMemoryEffect (MemoryEffectOpInterface)
جلوه ها: 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)
یک تقسیم بندی را به یک تانسور میانی (مثلاً نتیجه یک ماتمول) متصل می کند تا نشان دهد که این تانسور یا زیر مجموعه ای از کاربردهای آن باید به این ترتیب تقسیم شود.
اگر شاردینگ دارای ابعاد باز و محورهای بدون محدودیت باشد، به این معنی است که تانسور را می توان بیشتر در امتداد ابعاد باز خرد کرد.
این عملیات می تواند:
- بدون استفاده (آویزان) - به این معنی که شاردینگ متصل به این صورت است که خود تانسور ورودی چگونه باید خرد شود.
- دارای کاربردها باشد - به این معنی که تقسیم بندی متصل به این صورت است که چگونه استفاده از عملیات محدودیت تقسیم بندی باید تقسیم شود، در حالی که سایر کاربردهای تانسور ورودی ممکن است تقسیم بندی متفاوتی داشته باشند (اگر تانسور ورودی کاربرد دیگری نداشته باشد، رفتار مشابه با بدون مورد استفاده).
صفات: Elementwise
، SameOperandsAndResultType
رابط ها: InferTypeOpInterface
ویژگی ها:
صفت | نوع 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)
این عملیات یک رابط برای تخصیص تانسورها به گروههای شاردینگ (گروههایی از تانسورهایی که مجبور میشوند دارای تقسیمبندیهای یکسان باشند) ارائه میکند. در حین انتشار، به محض اینکه یکی از عناصر گروه خرد شد، همه اعضای دیگر دقیقاً به همان روش خرد می شوند. این عملیات شناسه گروه آرگومان را می گیرد و هیچ نتیجه ای را برمی گرداند، اما در عوض نمایش گروه اشتراک گذاری داخلی را تغییر می دهد تا تانسور ورودی را به گروه با شناسه داده شده اضافه کند.
ویژگی ها:
صفت | نوع MLIR | توضیحات |
---|---|---|
group_id | ::mlir::IntegerAttr | ویژگی عدد صحیح بدون علامت 64 بیتی |
عملگرها:
عملوند | توضیحات |
---|---|
input | تانسور رتبه بندی شده از هر نوع مقدار |
صفات
AxisRefAttr
ارجاع به یک محور کامل یا یک محور فرعی تقسیم شده
نحو:
#sdy.axis_ref<
::llvm::StringRef, # name
SubAxisInfoAttr # sub_axis_info
>
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
نام | ::llvm::StringRef | نام |
اطلاعات فرعی | SubAxisInfoAttr |
DimMappingAttr
فهرست شاخص های عاملی برای یک بعد
همه شاخصهای فاکتور باید در محدوده [0، num_factors) باشند و یک لیست خالی نشان میدهد که این یک نگاشت تهی است (این با *
تجزیه/چاپ میشود)، یعنی بعد به هیچ عاملی نگاشت نشده است.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
عوامل_شاخص | ::llvm::ArrayRef<int64_t> |
DimensionShardingAttr
تقسیم بندی ابعاد
فهرستی از نام محورها برای خرد کردن یک بعد تانسور از بزرگ به کوچک، یک بولی که نشان میدهد آیا میتوان بعد را بیشتر خرد کرد یا نه، و یک عدد صحیح اختیاری که نشاندهنده اولویت تقسیمبندی این بعد است، که در طول انتشار تقسیمبندی رعایت میشود. اولویت ها از حاشیه نویسی های اشتراک گذاری کاربر سرچشمه می گیرند و مقدار کمتر نشان دهنده اولویت بالاتر است. بالاترین اولویت زمانی در نظر گرفته می شود که اولویت در حاشیه نویسی وجود نداشته باشد.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
تبرها | ::llvm::ArrayRef<AxisRefAttr> | لیست ارجاعات محوری |
is_closed | bool | |
اولویت | std::optional<int64_t> |
ManualAxesAttr
نحو:
#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]>
پارامترها:
پارامتر | نوع 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
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 مجاز میکنیم، حتی اگر نمیتوان آنها را تقسیم کرد، این عمدتاً برای کامل بودن است زیرا بسیاری از عملیاتها مانند عملیات نقطهای دارای ابعاد اندازه یک هستند که با عملوندها و نتایج مطابقت دارند.
is_custom_rule
توضیح می دهد که آیا این قاعده ای است که توسط کاربر برای عملیات stablehlo.custom_call
تعریف شده است یا خیر. پارتیشنکننده نمیداند چگونه این عملیات را پارتیشن بندی کند، بنابراین کاربر باید نحوه پارتیشن بندی را به او بگوید. هنگامی که یک قانون سفارشی است، آنگاه این قانون همیشه حفظ می شود/هرگز حذف نمی شود. is_custom_rule
فقط می تواند برای عملیات stablehlo.custom_call
صادق باشد.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
فاکتور_اندازه ها | ::llvm::ArrayRef<int64_t> | |
operand_mappings | ::llvm::ArrayRef<TensorMappingAttr> | |
result_mappings | ::llvm::ArrayRef<TensorMappingAttr> | |
is_custom_rule | bool |
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))
بیان کرد. m=prod(k_1,...,k_(i-1))
(معروف به پیش اندازه) و اندازه k_i. بنابراین، ویژگی sub-axis-info آن دو عدد را نگه میدارد و به صورت زیر نشان داده میشود: (m)k
برای پیش اندازه m و اندازه k.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
پیش_اندازه | int64_t | |
اندازه | int64_t |
TensorMappingAttr
نگاشت عاملی برای هر بعد یک تانسور.
نحو:
#sdy.tensor_mapping<
::llvm::ArrayRef<DimMappingAttr> # dim_mappings
>
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
dim_mappings | ::llvm::ArrayRef<DimMappingAttr> |
TensorShardingAttr
تقسیم تانسور
نحو:
#sdy.sharding<
::mlir::Attribute, # mesh_or_ref
::llvm::ArrayRef<DimensionShardingAttr>, # dim_shardings
::llvm::ArrayRef<AxisRefAttr> # replicated_axes
>
یک تقسیم بندی تانسور به یک مش خاص محدود شده است و فقط می تواند به نام محورها از آن مش ارجاع دهد. تقسیمبندی ابعاد برای هر بعد تانسور به ما میگوید که در امتداد کدام محورها (یا محورهای فرعی) از اصلی به فرعی تقسیم میشود. تمام محورهای دیگری که یک بعد را تکه تکه نمی کنند، به طور ضمنی یا صریح (اگر در لیست محورهای تکرار شده ظاهر شوند) تکرار می شوند.
شبکه ای که این تقسیم بندی به آن محدود می شود را می توان با نام نماد، اشاره به نماد MeshOp
مربوطه یا یک MeshAttr
خطی مشخص کرد.
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
مش_یا_رف | ::mlir::Attribute | مش attr یا علامت مش مسطح مرجع attr |
dim_shardings | ::llvm::ArrayRef<DimensionShardingAttr> | |
replicate_axes | ::llvm::ArrayRef<AxisRefAttr> | لیست ارجاعات محوری |
TensorShardingPerValueAttr
تقسیم بندی تانسور در هر عملوند/نتیجه یک عملیات
نحو:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
پارامترها:
پارامتر | نوع C++ | توضیحات |
---|---|---|
خرد شدن | ::llvm::ArrayRef<TensorShardingAttr> |
Enums
جهت انتشار
جهت انتشار enum
موارد:
نماد | ارزش | رشته |
---|---|---|
هیچ کدام | 0 | هیچ کدام |
به جلو | 1 | به جلو |
عقب | 2 | عقب |
هر دو | 3 | هر دو |