শার্ডি (SDY) উপভাষা
শার্ডি (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
এ তালিকাভুক্ত সীমাবদ্ধতা পূরণ করবে। - অপারেন্ড শার্ডিং এবং
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
প্রয়োগ করলেout_sharding
হয়ে যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: CollectiveOpInterface
, InferTypeOpInterface
, SymbolUserOpInterface
গুণাবলী:
বৈশিষ্ট্য | MLIR প্রকার | বর্ণনা |
---|---|---|
slicing_axes | ::mlir::sdy::ListOfAxisRefListsAttr | অক্ষ রেফ তালিকার তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শর্ডিং |
অপারেন্ড:
অপারেন্ড | বর্ণনা |
---|---|
tensor | যে কোনো ধরনের মান আকৃতির |
ফলাফল:
ফলাফল | বর্ণনা |
---|---|
result | যে কোনো ধরনের মান আকৃতির |
sdy.all_to_all
(sdy::AllToAllOp)
অক্ষ বরাবর একটি অল-টু-অল যোগাযোগ সম্পাদন করে
সিনট্যাক্স:
operation ::= `sdy.all_to_all` $params $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
প্যারামিটার তালিকার প্রতিটি (অক্ষ, src_dim, tgt_dim) টিপলের জন্য, এই ক্রিয়াকলাপটি tgt_dim
মাত্রা বরাবর একটি টেনসরের টুকরো টুকরো করে এবং axes
নির্দিষ্ট করা অক্ষগুলিকে অক্ষের সাথে ছিটিয়ে দেয় এবং src_dim
মাত্রার সাথে সংযুক্ত করে।
এই অপারেশনটি মূলত src_dim
এবং axes
বরাবর একটি অল-গ্যাদারের সংমিশ্রণ, তারপরে tgt_dim
এবং axes
বরাবর একটি অল-স্লাইস, অর্থাৎ, ইনপুট টেনসরের অক্ষের শার্ডিং ডাইমেন src_dim
এর একটি প্রত্যয় 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
গুণাবলী:
বৈশিষ্ট্য | 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)
অবিরাম অপারেশন
একটি ধ্রুবক 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{}
গুণাবলী:
বৈশিষ্ট্য | 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-th ডেটা প্রবাহ প্রান্তগুলি উত্স 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 দ্বারা সংজ্ঞায়িত করার অনুমতি দিই না, তাই আমরা অনুমান করতে পারি যে এটি একটি অপ দ্বারা সংজ্ঞায়িত করা হয়েছে যার 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)
স্পষ্ট সমষ্টি সহ প্রতি-ডিভাইস স্থানীয় কোডের পরিপ্রেক্ষিতে লিখিত একটি অঞ্চলে ঝাঁপ দাও, যেখানে যৌক্তিক আকারগুলি স্থানীয় প্রতি-ডিভাইস ভৌত বাফার আকারের সাথে মেলে এবং সমষ্টিগুলি প্রকৃত ক্রস-ডিভাইস যোগাযোগের সাথে হুবহু মিলে যায়।
বডিটি ম্যানুয়াল_অক্ষে স্থানীয়। যেকোন মুক্ত অক্ষে শরীরের মাধ্যমে বংশবিস্তার ঘটবে - যেগুলি ম্যানুয়াল_অক্ষের তালিকায় নেই।
মনে রাখবেন যে কোনো র্যাঙ্কবিহীন টেনসরের র্যাঙ্ক 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
একটি নতুন নামের জাল সংজ্ঞায়িত করে। একটি মডিউলের সমস্ত মেশে অবশ্যই একই সংখ্যক ডিভাইস থাকতে হবে (একটি ডিভাইস_আইডি সহ মেশ ব্যতীত)। জাল হল একটি 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-এর যেকোন ব্যবহারকারীকে একটি আমদানি/রপ্তানি পাস লিখতে হবে যা তাদের কল অপগুলিকে 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::প্রচার নির্দেশিকা | প্রচার দিক 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
এর সংমিশ্রণ এবং একই reduce_scatter_axes
বরাবর একটি sdy.all_slice
দ্বারা অনুসরণ করা হয়।
সীমাবদ্ধতা:
-
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 গ্রাস করে। শার্ডিং প্রচারের ফলাফলে কোন Sharding ConstraintOp নেই। পরিবর্তে, প্রয়োজন হলে ReshardOp যোগ করা যেতে পারে।
- একজন বিভাজনকারী একটি ReshardOp কে একটি সমষ্টিগত অপে (বা একটি আইডেন্টিটি অপ) রূপান্তর করে। বিভাজনকারীর ফলাফলে কোন ReshardOp থাকা উচিত নয়।
// TODO(b/331680067)। অপ্রয়োজনীয় // রিশার্ড অপস অপসারণ করতে একটি ক্যানোনিকালাইজেশন প্যাটার্ন যোগ করুন।
বৈশিষ্ট্য: AlwaysSpeculatableImplTrait
ইমপ্লট্রেট , SameOperandsAndResultType
ইন্টারফেস: ConditionallySpeculatable
স্পেকুলেটেবল , InferTypeOpInterface
, NoMemoryEffect (MemoryEffectOpInterface)
, SymbolUserOpInterface
প্রভাব: MemoryEffects::Effect{}
গুণাবলী:
বৈশিষ্ট্য | MLIR প্রকার | বর্ণনা |
---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শর্ডিং |
অপারেন্ডস:
অপারেন্ড | বর্ণনা |
---|---|
input | যে কোনো ধরনের মান আকৃতির |
ফলাফল:
ফলাফল | বর্ণনা |
---|---|
result | যে কোনো ধরনের মান আকৃতির |
sdy.return
(sdy::ReturnOp)
sdy.return
অপারেশনটি sdy
অঞ্চল-ভিত্তিক অপ্স এবং অন্য যেকোন শার্ডি অঞ্চল-ভিত্তিক অপারেশনগুলির সাথে সংযুক্ত অঞ্চলগুলিকে বন্ধ করে দেয়৷ এটি বৈচিত্র্যময়: এটি আর্গুমেন্ট হিসাবে নেয় মানগুলির একটি তালিকা যার ধরন যেকোনও হতে পারে (কিন্তু একই ধরণের, যেমন AnyTensor
) এবং তাই Shardy IR স্ট্যাকের বিভিন্ন স্তরে পুনরায় ব্যবহার করা যেতে পারে।
সিনট্যাক্স:
operation ::= `sdy.return` attr-dict ($results^ `:` type($results))?
বৈশিষ্ট্য: AlwaysSpeculatableImplTrait
ইমপ্লট্রেইট , Terminator
ইন্টারফেস: ConditionallySpeculatable
, NoMemoryEffect (MemoryEffectOpInterface)
প্রভাব: MemoryEffects::Effect{}
অপারেন্ডস:
অপারেন্ড | বর্ণনা |
---|---|
results | যে কোনো ধরনের বৈচিত্র্যময় |
sdy.sharding_constraint
(sdy::ShardingConstraintOp)
একটি টেনসরকে নির্দিষ্ট শর্ডিং-এ সীমাবদ্ধ করে
সিনট্যাক্স:
operation ::= `sdy.sharding_constraint` $input $sharding attr-dict `:` type($result)
একটি মধ্যবর্তী টেনসরের সাথে একটি শার্ডিং সংযুক্ত করে (যেমন একটি মাটমুলের ফলাফল) নির্দেশ করে যে এইভাবে সেই টেনসর, বা এর ব্যবহারের একটি উপসেটকে শার্ড করা উচিত।
যদি শার্ডিংয়ের খোলা মাত্রা এবং অনিয়ন্ত্রিত অক্ষ থাকে তবে এর অর্থ হল টেনসরটি খোলা মাত্রা বরাবর আরও শার্ড করা যেতে পারে।
এই অপশনটি হতে পারে:
- কোন ব্যবহার নেই (ঝুলন্ত) - যার অর্থ সংযুক্ত শার্ডিং হল কিভাবে ইনপুট টেনসর নিজেই শার্ড করা উচিত।
- ব্যবহার আছে - যার অর্থ সংযুক্ত শার্ডিং হল শার্ডিং সীমাবদ্ধতা অপের ব্যবহারগুলি কীভাবে শার্ড করা উচিত, যখন ইনপুট টেনসরের অন্যান্য ব্যবহারগুলির একটি আলাদা শার্ডিং থাকতে পারে (যদি ইনপুট টেনসরের অন্য কোনও ব্যবহার না থাকে তবে আচরণটি কোনও ব্যবহারের ক্ষেত্রের মতোই নয়)।
বৈশিষ্ট্য: 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
>
সীমাবদ্ধতা:
- আবদ্ধ
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> |
AxisToPropagation DetailsAttr
একটি নির্দিষ্ট অক্ষ এবং উৎসের জন্য প্রচার প্রান্ত প্রবাহ বিবরণ.
সিনট্যাক্স:
#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> | অক্ষ refs |
is_closed | bool | এই মাত্রা আরো sharded করা যাবে না কিনা |
অগ্রাধিকার | std::optional<int64_t> | ব্যবহারকারীর অগ্রাধিকার ভিত্তিক প্রচারের সময় ব্যবহৃত অগ্রাধিকার |
EdgeValueRefAttr
টাইপ type
মান প্রান্তের একটি নির্দিষ্ট সূচকের রেফারেন্স।
সিনট্যাক্স:
#sdy.edge_value_ref<
::mlir::sdy::EdgeNodeType, # type
int64_t # index
>
পরামিতি:
প্যারামিটার | C++ প্রকার | বর্ণনা |
---|---|---|
টাইপ | ::mlir::sdy::EdgeNodeType | EdgeNodeType ধরনের একটি enum |
সূচক | 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(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]>
সীমাবদ্ধতা:
-
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
ফ্যাক্টরগুলির সূচক থাকে যেগুলিকে যৌথ-পারমিউটের প্রয়োজন হয় যদি সেগুলি শার্ড করা হয়, যেমন প্যাড অপারেশনে প্যাডিং মাত্রা। - অন্যান্য সমস্ত ফ্যাক্টরগুলিকে পাস-থ্রু ফ্যাক্টর হিসাবে বিবেচনা করা হয়, অর্থাত্, যে ফ্যাক্টরগুলির সাথে ম্যাপ করা সমস্ত টেনসর জুড়ে একইভাবে শার্ড করা হলে কোন যোগাযোগের প্রয়োজন হয় না।
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> | কারণগুলির সাথে শার্ডিংগুলি প্রচারিত হয় না |
হল_কাস্টম_রুল | bool | নিয়মটি stablehlo.custom_call এর জন্য কিনা |
প্রচার এজেসএটিআর
সমস্ত প্রচার পদক্ষেপের জন্য প্রচার প্রান্তের মেটাডেটা।
সিনট্যাক্স:
#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] তে পুনরায় আকার দেওয়া হয়, এবং ith উপ-অক্ষটি সমস্ত অক্ষের আকারের গুণফল দ্বারা তার বাম দিকে m=prod(k_1,...,k_(i-1))
(ওরফে প্রাক-আকার) এবং k_i আকারে প্রকাশ করা যেতে পারে। অতএব, সাব-অক্ষ-তথ্য বৈশিষ্ট্যটি এই দুটি সংখ্যা ধারণ করে এবং নিম্নরূপ চিহ্নিত করা হয়: (m)k
পূর্ব-আকারের জন্য m এবং আকার k।
সীমাবদ্ধতা:
-
pre-size
কমপক্ষে 1। -
size
1 এর চেয়ে বেশি। -
pre-size
অবশ্যই পূর্ণ অক্ষের আকারকে ভাগ করতে হবে, অর্থাৎ,pre-size
এবংsize
উভয়ই পূর্ণ অক্ষের আকারকে ভাগ করে এবং উপ-অক্ষটি সম্পূর্ণ অক্ষের বাইরে যায় না। - সাব-অক্ষের আকার সংশ্লিষ্ট পূর্ণ অক্ষের আকারের সমান নয়, সেক্ষেত্রে পরিবর্তে পূর্ণ অক্ষ ব্যবহার করা উচিত।
পরামিতি:
প্যারামিটার | C++ প্রকার | বর্ণনা |
---|---|---|
pre_size | 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
দ্বারা নির্দিষ্ট করা হয়েছে), যার অর্থ এই অক্ষ বরাবর টেনসর অপরিবর্তিত। উদাহরণস্বরূপ, যদি lhs এবং rhs উভয় ক্ষেত্রেই একটি মাটমুলের সংকোচন মাত্রা অক্ষ x
বরাবর শার্ড করা হয়, ফলাফলটি 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++ প্রকার | বর্ণনা |
---|---|---|
mesh_or_ref | ::mlir::Attribute | জাল attr বা সমতল জাল প্রতীক রেফারেন্স attr |
dim_shardings | ::llvm::ArrayRef<DimensionShardingAttr> | মাত্রা shardings |
replicated_axes | ::llvm::ArrayRef<AxisRefAttr> | অক্ষ refs |
unreduced_axes | ::llvm::ArrayRef<AxisRefAttr> | অক্ষ refs |
TensorShardingPerValueAttr
একটি অপের অপারেন্ড/ফলাফল প্রতি টেনসর শার্ডিং
সিনট্যাক্স:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
TensorShardingAttr
s এর একটি তালিকা, একটি অপের প্রতিটি অপারেন্ড/ফলাফলের জন্য একটি।
সীমাবদ্ধতা:
-
shardings
উপাদানগুলিকে অবশ্যইTensorShardingAttr
এর সীমাবদ্ধতা পূরণ করতে হবে।
পরামিতি:
প্যারামিটার | C++ প্রকার | বর্ণনা |
---|---|---|
শার্ডিংস | ::llvm::ArrayRef<TensorShardingAttr> | মান প্রতি sharding |
এনামস
এজনোড টাইপ
এজ নোড টাইপ enum
মামলা:
প্রতীক | মান | স্ট্রিং |
---|---|---|
OPERAND | 0 | অপারেন্ড |
ফলাফল | 1 | ফলাফল |
প্রচারের দিকনির্দেশনা
প্রচার দিক enum
মামলা:
প্রতীক | মান | স্ট্রিং |
---|---|---|
কোনটিই নয় | 0 | কোনটিই নয় |
ফরওয়ার্ড | 1 | ফরওয়ার্ড |
পিছনে | 2 | পিছনে |
উভয় | 3 | উভয় |