শার্ডি (এসডিওয়াই) উপভাষা
শার্ডি (SDY) ডায়ালেক্ট একটি অ্যাক্সিস-ভিত্তিক টেনসর শার্ডিং উপস্থাপনা এবং টেনসরের সাথে শার্ডিং সংযুক্ত করার জন্য অতিরিক্ত এপিআই উপাদান সংজ্ঞায়িত করে।
সংস্করণ লগ: ০.০.১: 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এ তালিকাভুক্ত সীমাবদ্ধতাগুলো পূরণ করতে হবে। - অপারেন্ড sharding-এর উপর
gathering_axesপ্রয়োগ করলেout_shardingপাওয়া যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেসসমূহ: InferTypeOpInterface , Sdy_CollectiveOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
gathering_axes | ::mlir::sdy::ListOfAxisRefListsAttr | অক্ষ রেফারেন্স তালিকার তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
tensor | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
sdy.all_reduce (sdy::AllReduceOp)
অক্ষ বরাবর একটি সর্ব-হ্রাস যোগাযোগ সম্পাদন করুন
সিনট্যাক্স:
operation ::= `sdy.all_reduce` ($reduction_op^)? $reduction_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
reduction_axes এ নির্দিষ্ট করা অক্ষ বরাবর একটি টেনসরের খণ্ডাংশ হ্রাস করে। ফলাফলের জন্য reduction_axes এর ক্রম গুরুত্বপূর্ণ নয়, তবে এটি সংশ্লিষ্ট রেপ্লিকা গ্রুপগুলির ক্রমকে প্রভাবিত করতে পারে।
সীমাবদ্ধতা:
-
Sdy_CollectiveOpInterfaceএ তালিকাভুক্ত সীমাবদ্ধতাগুলো অবশ্যই পূরণ করতে হবে। -
reduction_axesঅবশ্যইAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলো পূরণ করতে হবে। -
reduction_axesঅবশ্যই মেশের সাপেক্ষে সর্ট করা থাকতে হবে। - অপারেন্ড শার্ডিং এবং
out_shardingডাইমেনশন শার্ডিং অবশ্যই সমতুল্য হতে হবে। -
reduction_axesঅবশ্যই operand dimension sharding এবং replicated axes-এর সাথে ওভারল্যাপ করবে না (তবে এটি unreduced axes-এর সাথে ওভারল্যাপ করতে পারে)। -
reduction_axesঅবশ্যইout_shardingএর অপরিবর্তিত অক্ষগুলোর সাথে ওভারল্যাপ করবে না। অন্য কথায়,out_shardingঅবশ্যইreduction_axesবরাবর প্রতিলিপিত হতে হবে (অন্তর্নিহিতভাবে বা সুস্পষ্টভাবে)।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেসসমূহ: CollectiveOpInterface , InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
reduction_axes | ::mlir::sdy::AxisRefListAttr | অক্ষ রেফারেন্সের তালিকা |
reduction_op | ::mlir::sdy::ReductionOpAttr | হ্রাস অপারেশন এনাম |
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প্রয়োগ করলেout_shardingপাওয়া যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেসসমূহ: CollectiveOpInterface , InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
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 ডাইমেনশন বরাবর সেগুলোকে সংযুক্ত করে।
এই অপারেশনটি মূলত src_dim এবং axes বরাবর একটি অল-গ্যাদার এবং এর পরে tgt_dim এবং axes বরাবর একটি অল-স্লাইসের সমন্বয়, অর্থাৎ, ইনপুট টেনসরের axes শার্ডিং ডাইমেনশন src_dim এর একটি সাফিক্স আউটপুট টেনসরের axes শার্ডিং ডাইমেনশন tgt_dim এর সাথে যুক্ত করা হয়।
ফলাফলের ( out_sharding ) শার্ডিং পাওয়ার জন্য অপারেন্ডের ( tensor ) শার্ডিং-এর উপর অল-টু-অল প্রয়োগ করা হবে।
উল্লেখ্য যে, ফলাফলের শার্ডিং নির্ধারণ করতে 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অবশ্যই আরোহী ক্রমে সাজানো থাকতে হবে।
-
- অপারেন্ড শার্ডিং-এ
src_dimথেকেtgt_dimএaxesস্থানান্তর করলেout_shardingপাওয়া যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেসসমূহ: InferTypeOpInterface , Sdy_CollectiveOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
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
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
tensor | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
sdy.constant (sdy::ConstantOp)
অবিরাম কার্যক্রম
একটি ধ্রুবক value থেকে একটি output টেনসর তৈরি করে।
দেখুন: 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{}
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
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
})
এই while 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 op দ্বারা সংজ্ঞায়িত করার অনুমতি দিই না, তাই আমরা ধরে নিতে পারি যে এটি এমন একটি op দ্বারা সংজ্ঞায়িত হয়েছে যার sdy.sharding অ্যাট্রিবিউটটি অনিবন্ধিত।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
input | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
sdy.func_data_flow_edge (sdy::FuncDataFlowEdgeOp)
ফাংশন ইনপুট/আউটপুট ডেটা ফ্লো এজ অপারেশন।
সিনট্যাক্স:
operation ::= `sdy.func_data_flow_edge` $operand attr-dict `:` type($result)
এটি একটি ডেটা ফ্লো এজ অপ, কিন্তু ফাঙ্ক আর্গুমেন্ট বা কল রেজাল্টের জন্য। যখন এর অপারেন্ড একটি BlockArgument হয়, তখন এটি কলার callOp-এর আর্গুমেন্ট থেকে ফাঙ্ক আর্গুমেন্টের ব্যবহারকারীদের কাছে একটি সেতু হিসেবে কাজ করে। প্রতিটি ফাঙ্ক আর্গুমেন্টের জন্য একটি করে ফাঙ্ক ডেটা ফ্লো এজ থাকে। যখন এর অপারেন্ড একটি OpResult হয়, তখন এটি কল করা funcOp-এর রিটার্ন ভ্যালু থেকে কল রেজাল্টের ব্যবহারকারীদের কাছে একটি সেতু হিসেবে কাজ করে। প্রতিটি কল রেজাল্টের জন্য একটি করে ফাঙ্ক ডেটা ফ্লো এজ থাকে।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: InferTypeOpInterface , SymbolUserOpInterface
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
operand | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
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এ তালিকাভুক্ত সীমাবদ্ধতাগুলো পূরণ করতে হবে। - অপ অঞ্চলের গ্লোবাল ও লোকাল টেনসর ইনপুট/আউটপুটের সংখ্যা অবশ্যই সমান হতে হবে।
- প্রতিটি ডাইমেনশনাল শার্ডিং-এ ম্যানুয়াল অ্যাক্সিসগুলো অবশ্যই যেকোনো ফ্রি অ্যাক্সিসের আগে থাকতে হবে।
- ম্যানুয়াল অ্যাক্সিসে প্যাডিং যোগ করা যাবে না। অর্থাৎ, ডাইমেনশনের আকার অবশ্যই সংশ্লিষ্ট ম্যানুয়াল অ্যাক্সিসের আকার দ্বারা বিভাজ্য হতে হবে।
- অপ রিজিয়নগুলোর আর্গুমেন্ট/ফলাফলের গ্লোবাল এবং লোকাল আকৃতি অবশ্যই মিলতে হবে।
বৈশিষ্ট্য: IsolatedFromAbove , RecursiveMemoryEffects , SingleBlockImplicitTerminator<ReturnOp> , SingleBlock
ইন্টারফেস: ShardableDataFlowOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
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> , SymbolName
ইন্টারফেস: Symbol
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
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-এর যেকোনো ব্যবহারকারীকে একটি ইম্পোর্ট/এক্সপোর্ট পাস লিখতে হবে যা তাদের কল অপস-কে sdy.named_computation অপস-এ রূপান্তর করে এবং কল করা ফাংশনের বডিকে 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
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
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{}
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
allowed_direction | ::mlir::sdy::প্রচার নির্দেশিকা | প্রচারের দিক এনাম |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
input | যেকোনো নন-টোকেন ধরনের মানের র্যাঙ্কড টেনসর |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন ধরনের মানের র্যাঙ্কড টেনসর |
sdy.reduce_scatter (sdy::ReduceScatterOp)
অক্ষ বরাবর বিক্ষিপ্ততা হ্রাস করে যোগাযোগ সম্পাদন করে।
সিনট্যাক্স:
operation ::= `sdy.reduce_scatter` ($reduction_op^)? $reduce_scatter_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
reduce_scatter_axes এ নির্দিষ্ট করা অক্ষ বরাবর একটি টেনসরের খণ্ডাংশ হ্রাস করে এবং তারপর ফলাফলটিকে একই অক্ষ বরাবর ছড়িয়ে দেয়। এই অপারেশনটি মূলত একই reduce_scatter_axes বরাবর একটি sdy.all_reduce এবং তারপরে একটি sdy.all_slice এর সংমিশ্রণ।
সীমাবদ্ধতা:
-
Sdy_CollectiveOpInterfaceএ তালিকাভুক্ত সীমাবদ্ধতাগুলো অবশ্যই পূরণ করতে হবে। -
reduce_scatter_axesএর উপাদানগুলোকে অবশ্যইAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলো পূরণ করতে হবে। - অপারেন্ড শার্ডিং-এর উপর
reduce_scatter_axesপ্রয়োগ করলেout_shardingপাওয়া যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেসসমূহ: CollectiveOpInterface , InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
reduce_scatter_axes | ::mlir::sdy::ListOfAxisRefListsAttr | অক্ষ রেফারেন্স তালিকার তালিকা |
reduction_op | ::mlir::sdy::ReductionOpAttr | হ্রাস অপারেশন এনাম |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
tensor | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
sdy.replicated_to_unreduced (sdy::ReplicatedToUnreducedOp)
অন্তর্নিহিত বা সুস্পষ্টভাবে প্রতিলিপিকৃত অক্ষগুলোকে অসংকুচিত অক্ষগুলোতে স্থানান্তর করুন।
সিনট্যাক্স:
operation ::= `sdy.replicated_to_unreduced` $axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
অপারেন্ডের মধ্যে axes অন্তর্নিহিতভাবে বা সুস্পষ্টভাবে প্রতিলিপি করা উচিত। এই অপারেশনটি ফলাফলে সেগুলোকে অপরিবর্তিত রাখে। আমাদের নিম্নলিখিত সম্পর্কটি রয়েছে:
all-reduce(replicated-to-unreduced(x, axes), axes) = x
উদাহরণ:
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"b"}, {}, {}\], replicated={"c", "d"}, unreduced={"e"}>]>} : tensor<8x8x8xf32>
%2 = sdy.replicated_to_unreduced {"a", "c", "f"} %1 out_sharding=<@mesh, [{"b"}, {}, {}\], replicated={"d"}, unreduced={"a", "c", "e", "f"}> : tensor<8x8x8xf32>
সীমাবদ্ধতা:
-
Sdy_CollectiveOpInterfaceএ তালিকাভুক্ত সীমাবদ্ধতাগুলো অবশ্যই পূরণ করতে হবে। -
axesঅবশ্যইAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলো পূরণ করতে হবে। -
axesমেশের সাপেক্ষে সাজাতে হবে। -
axesখালি নয়। - ইনপুট এবং আউটপুট শার্ডিং-এর ডাইমেনশন শার্ডিং অবশ্যই একই হতে হবে।
- অপারেন্ড শার্ডিং-এ
axesঅন্তর্নিহিতভাবে বা সুস্পষ্টভাবে প্রতিলিপি করতে হবে। - inUnreducedAxes + axes = outUnreducedAxes.
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেসসমূহ: InferTypeOpInterface , Sdy_CollectiveOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
axes | ::mlir::sdy::AxisRefListAttr | অক্ষ রেফারেন্সের তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
tensor | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
sdy.reshard (sdy::ReshardOp)
একটি টেনসরকে ভিন্ন শার্ডিং-এ পুনরায় বিভক্ত করে।
সিনট্যাক্স:
operation ::= `sdy.reshard` $input $sharding attr-dict `:` type($result)
নির্দিষ্ট শার্ডিং ব্যবহার করে ইনপুট টেনসরটিকে পুনরায় শার্ডিং করে, যা ইনপুট টেনসরটির বিদ্যমান শার্ডিং থেকে ভিন্ন।
ShardingConstraintOp এবং ReshardOp উভয়ই একটি টেনসরের সাথে শার্ডিং সংযুক্ত করে। এদের জীবনকাল হলো:
- শার্ডিং প্রসারণের আগে, ব্যবহারকারীরা ShardingConstraintOp যোগ করেন।
- শার্ডিং প্রোপাগেশন ShardingConstraintOp ব্যবহার করে। শার্ডিং প্রোপাগেশনের ফলাফলে কোনো ShardingConstraintOp থাকে না। এর পরিবর্তে, প্রয়োজনে ReshardOp যোগ করা হতে পারে।
- একটি পার্টিশনার একটি ReshardOp-কে একটি কালেক্টিভ অপ (বা একটি আইডেন্টিটি অপ)-এ রূপান্তরিত করে। পার্টিশনারের ফলাফলে কোনো ReshardOp থাকা উচিত নয়।
বৈশিষ্ট্য: AlwaysSpeculatableImplTrait , SameOperandsAndResultType
ইন্টারফেসসমূহ: ConditionallySpeculatable , InferTypeOpInterface , NoMemoryEffect (MemoryEffectOpInterface) , SymbolUserOpInterface
প্রভাব: MemoryEffects::Effect{}
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
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 , ReturnLike , Terminator
ইন্টারফেসসমূহ: ConditionallySpeculatable , NoMemoryEffect (MemoryEffectOpInterface) , RegionBranchTerminatorOpInterface
প্রভাব: MemoryEffects::Effect{}
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
results | যেকোনো নন-টোকেন টাইপের ভ্যারিয়েডিক |
sdy.sharded_to_unreduced (sdy::ShardedToUnreducedOp)
অপারেন্ডের কিছু শার্ডেড অক্ষকে ফলাফলের আনরিডিউসড অক্ষে স্থানান্তর করুন।
সিনট্যাক্স:
operation ::= `sdy.sharded_to_unreduced` $axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
অপারেন্ডকে শার্ড করার জন্য axes ব্যবহার করা উচিত। এই অপারেশনটি ফলাফলে সেগুলোকে আনরিডিউসড করে রাখে। আমাদের মধ্যে নিম্নলিখিত সম্পর্কটি রয়েছে:
all-gather(x, axes) = all-reduce(sharded-to-unreduced(x, axes), axes), যেখানে all-gather, sharded-to-unreduced, all-reduce একই axes-এর উপর প্রয়োগ করা হয়।
উদাহরণ:
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "b", "c"}, {}, {"d"}\], unreduced={"e"}>]>} : tensor<8x8x8xf32>
%2 = sdy.sharded_to_unreduced [{"b", "c"}, {}, {"d"}\] %1 out_sharding=<@mesh, [{"a"}, {}, {}\], unreduced={"b", "c", "d", "e"}> : tensor<8x8x8xf32>
সীমাবদ্ধতা:
-
Sdy_CollectiveOpInterfaceএ তালিকাভুক্ত সীমাবদ্ধতাগুলো অবশ্যই পূরণ করতে হবে। -
axesউপাদানগুলিকে অবশ্যইAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। - অপারেন্ড শার্ডিং-এ
axesপ্রয়োগ করলেout_shardingপাওয়া যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেসসমূহ: InferTypeOpInterface , Sdy_CollectiveOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
axes | ::mlir::sdy::ListOfAxisRefListsAttr | অক্ষ রেফারেন্স তালিকার তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
tensor | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন ধরনের মান দ্বারা গঠিত |
sdy.sharding_constraint (sdy::ShardingConstraintOp)
একটি টেনসরকে নির্দিষ্ট শার্ডিং-এ সীমাবদ্ধ করে।
সিনট্যাক্স:
operation ::= `sdy.sharding_constraint` $input $sharding attr-dict `:` type($result)
কোনো মধ্যবর্তী টেনসরের (যেমন ম্যাটমাল্টিপল অপারেশনের ফলাফল) সাথে একটি শার্ডিং সংযুক্ত করে এটি নির্দেশ করে যে, ঐ টেনসরটি বা এর ব্যবহারের একটি উপসেটকে এইভাবেই শার্ড করা উচিত।
যদি শার্ডিংটির ডাইমেনশনগুলো খোলা এবং অক্ষগুলো বাধাহীন হয়, তার মানে হলো টেনসরটিকে ওই খোলা ডাইমেনশনগুলো বরাবর আরও শার্ড করা যেতে পারে।
এই অপারেশনটি হতে পারে:
- কোনো ব্যবহার নেই (ড্যাংলিং) - যার অর্থ হলো, সংযুক্ত শার্ডিং অনুযায়ী ইনপুট টেনসরটিকেই শার্ড করা উচিত।
- ব্যবহার আছে - যার অর্থ হলো, সংযুক্ত শার্ডিং অনুসারে শার্ডিং কনস্ট্রেইন্ট অপ-এর ব্যবহারগুলো শার্ড করা উচিত, যেখানে ইনপুট টেনসরের অন্যান্য ব্যবহারের শার্ডিং ভিন্ন হতে পারে (যদি ইনপুট টেনসরের অন্য কোনো ব্যবহার না থাকে, তাহলে এর আচরণ ব্যবহার না থাকার ক্ষেত্রের মতোই হবে)।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
input | যেকোনো নন-টোকেন টাইপ |
ফলাফল:
| ফলাফল | বর্ণনা |
|---|---|
result | যেকোনো নন-টোকেন টাইপ |
sdy.sharding_group (sdy::ShardingGroupOp)
গ্রুপের অন্তর্গত টেনসরগুলোর শার্ডিং একই হতে বাধ্য করে।
সিনট্যাক্স:
operation ::= `sdy.sharding_group` $input `group_id````=```$group_id attr-dict `:` type($input)
এই অপারেশনটি টেনসরগুলোকে শার্ডিং গ্রুপে (টেনসরের এমন গ্রুপ যেখানে একই রকম শার্ডিং বাধ্যতামূলক করা হবে) বরাদ্দ করার জন্য একটি ইন্টারফেস প্রদান করে। প্রোপাগেশনের সময়, গ্রুপের কোনো একটি উপাদান শার্ড হওয়ার সাথে সাথেই, গ্রুপের অন্য সব সদস্যও ঠিক একইভাবে শার্ড হয়ে যাবে। এই অপারেশনটি 'group ID' আর্গুমেন্ট হিসেবে গ্রহণ করে এবং কোনো ফলাফল ফেরত দেয় না, বরং এটি অভ্যন্তরীণ শার্ডিং গ্রুপের উপস্থাপনাকে পরিবর্তন করে ইনপুট টেনসরটিকে প্রদত্ত ID-যুক্ত গ্রুপে যুক্ত করে দেয়।
ইন্টারফেস: InferTypeOpInterface
বৈশিষ্ট্যসমূহ:
| বৈশিষ্ট্য | এমএলআইআর টাইপ | বর্ণনা |
|---|---|---|
group_id | ::mlir::IntegerAttr | ৬৪-বিট চিহ্নবিহীন পূর্ণসংখ্যা অ্যাট্রিবিউট |
অপারেন্ড:
| অপারেন্ড | বর্ণনা |
|---|---|
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
>
সীমাবদ্ধতা:
- আবদ্ধ
MeshAttrএnameঅবশ্যই উপস্থিত থাকতে হবে। - যদি
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++ টাইপ | বর্ণনা |
|---|---|---|
| অক্ষের নাম | ::mlir::sdy::AxisRefAttr | সম্পূর্ণ অক্ষ বা বিভক্ত উপ-অক্ষের উল্লেখ |
| উৎস | ::mlir::sdy::EdgeValueRefAttr | টাইপ অফ type একটি ভ্যালু এজ-এর কোনো নির্দিষ্ট ইন্ডেক্সের রেফারেন্স। |
| লক্ষ্য | ::llvm::ArrayRef<EdgeValueRefAttr> | প্রান্ত লক্ষ্য মানগুলির তালিকা |
ডিমম্যাপিংঅ্যাট্র
একটি ডাইমেনশনের ফ্যাক্টর সূচকগুলির তালিকা
একটি খালি তালিকা নির্দেশ করে যে এটি একটি নাল ম্যাপিং (এটি * চিহ্ন দিয়ে পার্স বা প্রিন্ট করা হয়), অর্থাৎ ডাইমেনশনটি কোনো ফ্যাক্টরের সাথে ম্যাপ করা হয়নি।
সীমাবদ্ধতা:
- অন্তত একটি ফ্যাক্টর সূচক রয়েছে।
- ফ্যাক্টর সূচকগুলি অবশ্যই [0,
$factor_sizes) সীমার মধ্যে থাকতে হবে। - যদি একাধিক উপাদান থাকে, তবে সেগুলোর কোনোটিরই আকার ১ হতে পারে না।
- কোনো সদৃশ ফ্যাক্টর সূচক নেই।
পরামিতি:
| প্যারামিটার | C++ টাইপ | বর্ণনা |
|---|---|---|
| ফ্যাক্টর_সূচক | ::llvm::ArrayRef<int64_t> | এই মাত্রাটি যে কারণগুলির সাথে ম্যাপ করা হয়েছে |
ডাইমেনশনশার্ডিংঅ্যাট্র
ডাইমেনশন শার্ডিং
মেজর থেকে মাইনর পর্যন্ত একটি টেনসর ডাইমেনশনকে শার্ড করার জন্য অ্যাক্সিস নামগুলির তালিকা, ডাইমেনশনটিকে আরও শার্ড করা যাবে কিনা তা নির্দেশকারী একটি বুলিয়ান, এবং এই ডাইমেনশন শার্ডিংয়ের অগ্রাধিকার নির্দেশকারী একটি ঐচ্ছিক পূর্ণসংখ্যা, যা শার্ডিং প্রসারণের সময় অনুসরণ করা হবে। অগ্রাধিকারগুলি ব্যবহারকারীর শার্ডিং অ্যানোটেশন থেকে আসে এবং একটি নিম্ন মান উচ্চতর অগ্রাধিকার নির্দেশ করে। অ্যানোটেশনে অগ্রাধিকার উল্লেখ না থাকলে সর্বোচ্চ অগ্রাধিকারটি ধরে নেওয়া হয়।
সীমাবদ্ধতা:
-
axesউপাদানগুলিকে অবশ্যইAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। - যদি কোনো ডাইমেনশন শার্ডিং-এর অগ্রাধিকার থাকে:
- অগ্রাধিকার ০-এর চেয়ে বেশি বা সমান।
- মাত্রাটি বদ্ধ হলে তার অন্তত একটি অক্ষ থাকে।
পরামিতি:
| প্যারামিটার | C++ টাইপ | বর্ণনা |
|---|---|---|
| অক্ষ | ::llvm::ArrayRef<AxisRefAttr> | অক্ষ রেফারেন্স |
| বন্ধ আছে | bool | এই মাত্রাটিকে আরও খণ্ডিত করা যাবে কিনা |
| অগ্রাধিকার | std::optional<int64_t> | ব্যবহারকারীর অগ্রাধিকার ভিত্তিক প্রচারের সময় ব্যবহৃত অগ্রাধিকার |
EdgeValueRefAttr
টাইপ অফ type একটি ভ্যালু এজ-এর কোনো নির্দিষ্ট ইন্ডেক্সের রেফারেন্স।
সিনট্যাক্স:
#sdy.edge_value_ref<
`operand` | `result`, # type
int64_t # index
>
পরামিতি:
| প্যারামিটার | C++ টাইপ | বর্ণনা |
|---|---|---|
| প্রকার | ::mlir::sdy::EdgeNodeType | EdgeNodeType টাইপের একটি enum |
| সূচক | int64_t | পূর্ণসংখ্যা সূচক (০, ১, ২, ইত্যাদি) |
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> |
মেশঅ্যাট্র
অক্ষের জাল এবং ডিভাইসগুলির একটি তালিকা
সিনট্যাক্স:
#sdy.mesh<
::llvm::ArrayRef<MeshAxisAttr>, # axes
::llvm::ArrayRef<int64_t> # device_ids
>
একটি মেশ হলো অক্ষগুলোর একটি তালিকা এবং ডিভাইসগুলোর ক্রম নির্দিষ্টকারী ডিভাইস আইডিগুলোর একটি ঐচ্ছিক তালিকা।
যদি অক্ষের তালিকাটি খালি থাকে
- যদি
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এর সাইজ 0 (খালি মেশ) বা 1 (সর্বোচ্চ-শার্ডিং মেশ) হতে পারে। - যদি
axesখালি না থাকে,-
axesউপাদানগুলোর নাম একই হতে পারবে না। - যদি
device_idsনির্দিষ্ট করা থাকে, তাহলে মূলdevice_idsiota(product(axis_sizes))নয় এবং সাজানোdevice_idsহলোiota(product(axis_sizes))।
-
পরামিতি:
| প্যারামিটার | C++ টাইপ | বর্ণনা |
|---|---|---|
| অক্ষ | ::llvm::ArrayRef<MeshAxisAttr> | জাল অক্ষ |
| ডিভাইস_আইডি | ::llvm::ArrayRef<int64_t> | সুস্পষ্ট ডিভাইস ক্রম বা সর্বোচ্চ ডিভাইস আইডি |
মেশঅ্যাক্সিসঅ্যাট্র
মেশের নামযুক্ত অক্ষ
সিনট্যাক্স:
#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সেইসব ফ্যাক্টরের ইন্ডেক্স থাকে যেগুলোর শার্ড করা থাকলে (যেমন একটি প্যাড অপারেশনের প্যাডিং ডাইমেনশন) কালেক্টিভ-পারমিউটের প্রয়োজন হয়। - অন্যান্য সমস্ত ফ্যাক্টরকে পাস-থ্রু ফ্যাক্টর হিসেবে বিবেচনা করা হয়, অর্থাৎ, এমন ফ্যাক্টর যেগুলোকে তাদের সাথে ম্যাপ করা সমস্ত টেনসরের মধ্যে একই উপায়ে শার্ড করা হলে কোনো যোগাযোগের প্রয়োজন হয় না।
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 এর জন্য কিনা |
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++ টাইপ | বর্ণনা |
|---|---|---|
| ধাপ_সূচক | int64_t | ধাপ সূচক |
| অক্ষ_প্রবেশ | ::llvm::ArrayRef<AxisToPropagationDetailsAttr> | প্রতিটি প্রসারণ সিদ্ধান্তের জন্য অক্ষ প্রসারণের বিবরণ |
সাবঅ্যাক্সিসইনফোঅ্যাট্রিবিউট
পূর্ণ অক্ষ থেকে এই উপ-অক্ষটি কীভাবে উদ্ভূত হয় সে সম্পর্কিত তথ্য
সিনট্যাক্স:
#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 দ্বারা প্রকাশ করা যায়। অতএব, সাব-অ্যাক্সিস-ইনফো অ্যাট্রিবিউটটি এই দুটি সংখ্যা ধারণ করে এবং প্রি-সাইজ m এবং আকার k এর জন্য (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++ টাইপ | বর্ণনা |
|---|---|---|
| ডিম_ম্যাপিংস | ::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
`sum` | `max` | `min` # reduction_op
>
একটি টেনসর শার্ডিং একটি নির্দিষ্ট মেশের সাথে আবদ্ধ থাকে এবং শুধুমাত্র সেই মেশের অ্যাক্সিসের নামগুলোই রেফারেন্স করতে পারে। ডাইমেনশন শার্ডিংগুলো আমাদের বলে দেয় যে, টেনসরের প্রতিটি ডাইমেনশনের জন্য, এটি মেজর থেকে মাইনর পর্যন্ত কোন কোন অ্যাক্সিস (বা সাব-অ্যাক্সিস) বরাবর শার্ড হবে। অন্য সমস্ত অ্যাক্সিস, যেগুলো কোনো ডাইমেনশনকে শার্ড করে না, সেগুলো হয় পরোক্ষভাবে অথবা প্রত্যক্ষভাবে (যদি সেগুলো রেপ্লিকেটেড অ্যাক্সিসের তালিকায় থাকে) রেপ্লিকেট হয়।
মনে রাখবেন যে, কোনো টেনসরের ওপর কোনো শার্ডিং অ্যাট্রিবিউট না থাকা একটি সম্পূর্ণ উন্মুক্ত টেনসর শার্ডিং-এর সমতুল্য।
এই শার্ডিংটি যে মেশের সাথে আবদ্ধ, তা একটি সংশ্লিষ্ট MeshOp সিম্বলকে উল্লেখ করে একটি সিম্বল নাম দ্বারা, অথবা একটি ইনলাইন করা MeshAttr দ্বারা নির্দিষ্ট করা যেতে পারে।
A sharding can have unreduced axes (specified by unreduced_axes ), meaning the tensor is unreduced along these axes. For example, if the contracting dimension of a matmul is sharded along axis x in both the lhs and rhs, the result is unreduced along x . Applying an all-reduce on the tensor along the unreduced axes will make the tensor replicated along those axes. However, a tensor with unreduced axes doesn't have to be all-reduced immediately, it can remain unreduced when passed to linear operations like stablehlo.add (as long as both lhs and rhs are unreduced) and all-reduced afterwards. We assume the reduction type is sum, other reductions may be supported in the future.
Constraints:
- Elements in
dim_shardingsmust satisfy the constraints listed inDimensionShardingAttr. - Elements in
replicated_axesmust satisfy the constraints listed inAxisRefListAttr. - Elements in
unreduced_axesmust satisfy the constraints listed inAxisRefListAttr. - If the corresponding tensor type isn't a
ShapedType, the sharding must have rank 0 and no replicated axes. - If it is a
ShapedType, then:- The tensor should have a rank.
- The number of dimension shardings is equal to the rank of the tensor.
- Dimensions of size 0 aren't sharded.
- There are no duplicate axis-refs or sub-axes that overlap with one another across
dim_shardings,replicated_axes, andunreduced_axes. - Items in
replicated_axesandunreduced_axesare ordered wrtmesh_or_ref(seeAxisRefAttr::getMeshComparator).
পরামিতি:
| প্যারামিটার | C++ type | বর্ণনা |
|---|---|---|
| mesh_or_ref | ::mlir::Attribute | mesh attr or flat mesh symbol reference attr |
| dim_shardings | ::llvm::ArrayRef<DimensionShardingAttr> | dimension shardings |
| replicated_axes | ::llvm::ArrayRef<AxisRefAttr> | axis refs |
| unreduced_axes | ::llvm::ArrayRef<AxisRefAttr> | axis refs |
| reduction_op | ::mlir::sdy::ReductionOp | an enum of type ReductionOp |
TensorShardingPerValueAttr
Tensor sharding per operand/result of an op
Syntax:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
A list of TensorShardingAttr s, one for each operand/result of an op.
Constraints:
- Elements in
shardingsmust satisfy the constraints ofTensorShardingAttr.
পরামিতি:
| প্যারামিটার | C++ type | বর্ণনা |
|---|---|---|
| shardings | ::llvm::ArrayRef<TensorShardingAttr> | sharding per value |
এনাম
EdgeNodeType
Edge node type enum
Cases:
| প্রতীক | মূল্য | স্ট্রিং |
|---|---|---|
| OPERAND | 0 | operand |
| ফলাফল | 1 | ফলাফল |
PropagationDirection
Propagation direction enum
Cases:
| প্রতীক | মূল্য | স্ট্রিং |
|---|---|---|
| কেউ না | 0 | কেউ না |
| সামনে | 1 | সামনে |
| BACKWARD | 2 | BACKWARD |
| উভয় | 3 | উভয় |
ReductionOp
Reduction op enum
Cases:
| প্রতীক | মূল্য | স্ট্রিং |
|---|---|---|
| যোগফল | 0 | যোগফল |
| ম্যাক্স | 1 | সর্বোচ্চ |
| মিনিট | 2 | মিনিট |