শার্ডি (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প্রয়োগ করলে shardingout_shardingহয়ে যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: InferTypeOpInterface , Sdy_CollectiveOpInterface , SymbolUserOpInterface
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
gathering_axes | ::mlir::sdy::ListOfAxisRefListsAttr | অক্ষ রেফারেন্স তালিকার তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
tensor | যেকোনো ধরণের মান দ্বারা আকৃতির |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
result | যেকোনো ধরণের মান দ্বারা আকৃতির |
sdy.all_reduce (sdy::AllReduceOp)
অক্ষ বরাবর একটি সর্ব-হ্রাস যোগাযোগ সম্পাদন করুন
বাক্য গঠন:
operation ::= `sdy.all_reduce` $reduction_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
reduction_axes এ উল্লেখিত অক্ষ বরাবর একটি টেনসরের অংশ হ্রাস করে। ফলাফলের জন্য reduction_axes এর ক্রম গুরুত্বপূর্ণ নয়, তবে সংশ্লিষ্ট প্রতিরূপ গোষ্ঠীর ক্রমকে প্রভাবিত করতে পারে।
সীমাবদ্ধতা:
-
Sdy_CollectiveOpInterfaceএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। -
reduction_axesঅবশ্যইAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতা পূরণ করবে। -
reduction_axesঅবশ্যই মেশের সাথে সাজানো উচিত। - অপারেন্ড sharding এবং
out_shardingসমান মাত্রা shardings থাকতে হবে। -
reduction_axesঅপারেন্ড ডাইমেনশন শারডিং এবং প্রতিলিপিকৃত অক্ষগুলির সাথে ওভারল্যাপ করা উচিত নয় (এটি আনরিডুসড অক্ষগুলির সাথে ওভারল্যাপ করতে পারে)। -
reduction_axesঅবশ্যইout_shardingএর unreduced axes এর সাথে ওভারল্যাপ করবে না। অন্য কথায়,out_shardingঅবশ্যইreduction_axesবরাবর (অন্তর্নিহিতভাবে বা স্পষ্টভাবে) প্রতিলিপি করা উচিত।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: CollectiveOpInterface , InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
reduction_axes | ::mlir::sdy::AxisRefListAttr | অক্ষ রেফারেন্সের তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
tensor | যেকোনো ধরণের মান দ্বারা আকৃতির |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
result | যেকোনো ধরণের মান দ্বারা আকৃতির |
sdy.all_slice (sdy::AllSliceOp)
অক্ষ বরাবর একটি গতিশীল-স্লাইস অপারেশন সম্পাদন করে
বাক্য গঠন:
operation ::= `sdy.all_slice` $slicing_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
slicing_axes এ নির্দিষ্ট অক্ষ বরাবর একটি টেনসরের টুকরো। sdy.all_slice এবং sdy.all_gather এর মধ্যে একটি বীজগণিতীয় দ্বৈততা রয়েছে।
slicing_axes হল অক্ষের তালিকার একটি তালিকা। বাইরের তালিকাটি টেনসরের মাত্রার উপরে অবস্থিত। প্রতিটি অভ্যন্তরীণ তালিকা সেই অক্ষগুলিকে নির্দিষ্ট করে যার উপর দিয়ে একটি স্লাইস সংশ্লিষ্ট মাত্রায় সম্পাদন করা উচিত। ফলাফলের শারডিং ( out_sharding ) পেতে এটি অপারেন্ড ( tensor ) এর শারডিংয়ে প্রয়োগ করা হবে।
মনে রাখবেন যে ফলাফলের শারডিং নির্ধারণ করতে out_sharding ব্যবহার করা হয় না। পরিবর্তে, ফলাফলের শারডিং অপারেন্ড এবং slicing_axes এর শারডিং দ্বারা নির্ধারিত হয়, এবং out_sharding অবশ্যই এই অনুমানিত শারডিংয়ের সাথে মিলবে।
উদাহরণ:
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a"}, {}, {}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.all_slice [{"b", "c"}, {}, {"d"}\] %1 out_sharding=<@mesh, [{"a", "b", "c"}, {}, {"d"}\]> : tensor<8x8x8xf32>
সীমাবদ্ধতা:
-
Sdy_CollectiveOpInterfaceএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। -
slicing_axesএর উপাদানগুলিকেAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। - অপারেন্ডে
slicing_axesপ্রয়োগ করলে shardingout_shardingহয়ে যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: CollectiveOpInterface , InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
slicing_axes | ::mlir::sdy::ListOfAxisRefListsAttr | অক্ষ রেফারেন্স তালিকার তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
tensor | যেকোনো ধরণের মান দ্বারা আকৃতির |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
result | যেকোনো ধরণের মান দ্বারা আকৃতির |
sdy.all_to_all (sdy::AllToAllOp)
অক্ষ বরাবর সর্বাত্মক যোগাযোগ সম্পাদন করে
বাক্য গঠন:
operation ::= `sdy.all_to_all` $params $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
প্যারামিটার তালিকার প্রতিটি (axes, src_dim, tgt_dim) টুপলের জন্য, এই অপারেশনটি tgt_dim মাত্রা এবং axes এ নির্দিষ্ট অক্ষ বরাবর একটি টেনসরের খণ্ডগুলিকে কেটে ফেলে, অক্ষ বরাবর সেই খণ্ডগুলিকে ছড়িয়ে দেয় এবং src_dim মাত্রা বরাবর তাদের সংযুক্ত করে।
এই অপারেশনটি মূলত src_dim এবং axes বরাবর একটি all-gather এর সংমিশ্রণ, তারপরে tgt_dim এবং axes বরাবর একটি all-slice থাকে, অর্থাৎ, ইনপুট টেনসরের উপর src_dim অক্ষের শারডিং মাত্রার একটি প্রত্যয় আউটপুট টেনসরের উপর tgt_dim অক্ষের শারডিং মাত্রার সাথে যুক্ত করা হয়।
ফলাফলের শারডিং ( out_sharding ) পেতে অপারেন্ড ( tensor ) এর শারডিং-এ all-to-all প্রয়োগ করা হবে।
মনে রাখবেন যে ফলাফলের শারডিং নির্ধারণ করতে 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সরানো হলে shardingout_shardingহয়ে যায়।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: InferTypeOpInterface , Sdy_CollectiveOpInterface , SymbolUserOpInterface
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
params | ::mlir::sdy::AllToAllParamListAttr | অল-টু-অল প্যারামিটারের তালিকা |
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
tensor | যেকোনো ধরণের মান দ্বারা আকৃতির |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
result | যেকোনো ধরণের মান দ্বারা আকৃতির |
sdy.collective_permute (sdy::CollectivePermuteOp)
অক্ষ প্রতিস্থাপনের জন্য একটি যৌথ-অনুমোদিত যোগাযোগ সম্পাদন করে
বাক্য গঠন:
operation ::= `sdy.collective_permute` $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
টেনসরকে ছিন্নকারী অক্ষগুলিকে পুনর্বিন্যাস/প্রতিস্থাপন করার জন্য প্রতিটি ডিভাইস থেকে অন্য ডিভাইসে ইনপুট টেনসরের একটি অংশ পাঠায়।
একটি সমষ্টিগত পারমিউট ইনপুট শারডিংকে এমনভাবে রূপান্তরিত করতে পারে যে প্রতিটি মাত্রা আগের মতোই শারড হতে হবে, অর্থাৎ, এটিকে এমন অক্ষ বরাবর শারড করতে হবে যার আকারের গুণফল টেনসরকে পূর্বে শারড করা অক্ষের সাথে মিলে যায়।
এটি একক মাত্রায় বা বিভিন্ন মাত্রায় অক্ষগুলিকে পুনর্বিন্যাস করার জন্য এবং প্রতিলিপিযুক্ত অক্ষগুলির সাথে খণ্ডিত অক্ষগুলিকে অদলবদল করার জন্য কার্যকর।
নিচের উদাহরণে, খণ্ডিত টেনসরের আকার হল tensor<1x4x2xf32> , এবং এটি যৌথ পারমিউট দ্বারা সংরক্ষিত।
উদাহরণ:
sdy.mesh @mesh = <["a"=2, "b"=2, "c"=4, "d"=2, "e"=2, "f"=2]>
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "c"}, {"f"}, {"d", "e"}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.collective_permute %1 out_sharding=<@mesh, [{"c":(1)2, "b", "f"}, {"a"}, {"e", "d"}\]> : tensor<8x8x8xf32>
সীমাবদ্ধতা:
-
Sdy_CollectiveOpInterfaceএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। - যদি ইনপুট এবং আউটপুট শারডিংয়ের বিভিন্ন জাল থাকে, তাহলে সেই জালগুলির অবশ্যই একই অক্ষ এবং ডিভাইস আইডির ক্রম ভিন্ন হতে হবে।
- প্রতিটি মাত্রার জন্য,
out_shardingএ শারডিং অক্ষের আকারের গুণফল অবশ্যই সংশ্লিষ্ট অপার্যান্ড মাত্রা শারডিংয়ের সাথে মিলবে।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: CollectiveOpInterface , InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
out_sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
tensor | যেকোনো ধরণের মান দ্বারা আকৃতির |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
result | যেকোনো ধরণের মান দ্বারা আকৃতির |
sdy.constant (sdy::ConstantOp)
ধ্রুবক অপারেশন
একটি ধ্রুবক 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::উপাদানসমূহ | ধ্রুবক ভেক্টর/টেনসর বৈশিষ্ট্য |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
output | যেকোনো ধরণের মানের স্ট্যাটিক্যালি আকৃতির টেনসর |
sdy.data_flow_edge (sdy::DataFlowEdgeOp)
ডেটা ফ্লো এজ অপ।
বাক্য গঠন:
operation ::= `sdy.data_flow_edge` $input (`sharding````=``` $sharding^)? attr-dict `:` type($result)
কিছু op X এর একটি ডেটা ফ্লো এজ উৎসের একটি সেট (প্রতিটি হয় X এর একটি অপারেন্ড অথবা X এর ব্লক টার্মিনেটরের একটি অপারেন্ড) এবং লক্ষ্যের একটি সেট (প্রতিটি হয় X এর ফলাফল অথবা X এর একটি ব্লক আর্গুমেন্ট) এর মধ্যে একটি সেতু সংজ্ঞায়িত করে, যাতে সমস্ত উৎস এবং লক্ষ্য একইভাবে শার্ড করা উচিত।
একটি op-এর একাধিক ডেটা ফ্লো এজ থাকতে পারে যা একে অপরের সাথে লম্ব।
উদাহরণস্বরূপ:
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 একটি edge এর মালিককে ইনপুট হিসেবে নেয় (যেকোনো টার্গেট হতে পারে, তবে ব্লক আর্গুমেন্টের পরিবর্তে একটি op ফলাফল হিসেবে ব্যবহার করা ভালো), যার অন্য কোনও ব্যবহার থাকা উচিত নয়। এই op বিশুদ্ধ নয় কারণ এটি এমন একটি ইনপুট নিতে পারে যার মূলত কোনও ব্যবহার ছিল না।
sdy.data_flow_edge প্রান্তের সকল লক্ষ্যবস্তুর জন্য একটি ঐচ্ছিক sharding ধারণ করে এবং প্রচারের সময় লক্ষ্যবস্তুর sharding (যদি সংযুক্ত করা যায়) এর পরিবর্তে সেই sharding আপডেট করা উচিত। যখন একটি op-এর অনেক প্রান্ত থাকে তখন এটি কার্যকর, কারণ এটি অনেক বেশি দক্ষ:
- প্রতিটি প্রান্ত দিয়ে আলাদাভাবে ছড়িয়ে দিন।
- একসাথে সকল টার্গেটের পরিবর্তে প্রতিটি প্রান্তের শারডিং আলাদাভাবে আপডেট করুন (যেমন একটি অপশনে রেজাল্ট শারডিংয়ের জন্য একটি একক অপরিবর্তনীয়
TensorShardingPerValueAttrথাকে)। - যখন কোনও উৎসের শারডিং পরিবর্তিত হয় তখন প্রতিটি প্রান্তকে আলাদাভাবে কর্মতালিকায় যুক্ত করুন।
প্রোপাগেশন একটি sdy.data_flow_edge এর সকল উৎস এবং লক্ষ্যবস্তুর মধ্যে shardings প্রচার করবে যেন এটি একটি নিয়মিত অপশন যেখানে সোর্সগুলি অপারেন্ড এবং টার্গেটগুলি ফলাফল হিসাবে থাকবে এবং একটি পরিচয় sdy.op_sharding_rule থাকবে। এর অর্থ হল ফরোয়ার্ড প্রোপাগেশন হল সোর্স থেকে টার্গেটে এবং ব্যাকওয়ার্ড প্রোপাগেশন হল টার্গেট থেকে সোর্সে।
আমরা sdy.data_flow_edge এর ইনপুটকে SdyDialect op দ্বারা সংজ্ঞায়িত করার অনুমতি দিই না, তাই আমরা ধরে নিতে পারি যে এটি এমন একটি 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::ম্যানুয়ালঅক্ষঅ্যাটার | একটি ManualComputationOp যে অক্ষগুলিতে ম্যানুয়ালভাবে কাজ করে তার একটি তালিকা |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
tensors | যেকোনো ধরণের বৈচিত্র্যময় |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
results | যেকোনো ধরণের বৈচিত্র্যময় |
sdy.mesh (sdy::MeshOp)
নামকরণ করা মেশ
বাক্য গঠন:
operation ::= `sdy.mesh` $sym_name `=` $mesh attr-dict
একটি নতুন নামকরণ করা মেশ সংজ্ঞায়িত করে। একটি মডিউলের সমস্ত মেশে একই সংখ্যক ডিভাইস থাকতে হবে (একটি device_id সহ মেশ ব্যতীত)। মেশ হল একটি Symbol অপারেশন যা মডিউলের SymbolTable এ প্রদর্শিত হয় এবং এর name দ্বারা উল্লেখ করা যেতে পারে।
বৈশিষ্ট্য: HasParent<ModuleOp>
ইন্টারফেস: Symbol
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
sym_name | ::mlir::StringAttr | স্ট্রিং অ্যাট্রিবিউট |
mesh | ::mlir::sdy::MeshAttr | অক্ষের জাল এবং ডিভাইসের একটি তালিকা |
sdy.named_computation (sdy::NamedComputationOp)
নামকরণ করা হয়েছে গণনা অপারেশন
বাক্য গঠন:
operation ::= `sdy.named_computation` `<`$name`>` `` `(` $operands `)`
(`in_shardings````=```custom<StrippedTensorShardingPerValueAttr>($in_shardings)^)?
(`out_shardings````=```custom<StrippedTensorShardingPerValueAttr>($out_shardings)^)?
custom<SingleBlockRegionNoBlockId>($body)
attr-dict
`:` functional-type($operands, results)
একটি গণনা, অর্থাৎ ক্রিয়াকলাপের একটি ব্লককে গ্রুপ করে এবং এটিকে একটি নাম দেয়। অঞ্চলের ভিতরে/বাইরে প্রচার এমনভাবে প্রবাহিত হবে যেন সবকিছু ইনলাইন করা হয়েছে।
এটি কল নির্দেশাবলীর মাধ্যমে অন্যান্য ফাংশনে প্রচার পরিচালনা করতে ব্যবহার করা যেতে পারে। Shardy-এর যেকোনো ব্যবহারকারীর একটি আমদানি/রপ্তানি পাস লিখতে হবে যা তাদের কল অপসকে 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
বৈশিষ্ট্য:
| বৈশিষ্ট্য | 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মানে হল shardings শুধুমাত্র অপারেন্ড থেকে ফলাফলে প্রবাহিত হতে পারে। -
BACKWARDমানে হল shardings শুধুমাত্র ফলাফল থেকে অপারেন্ডে প্রবাহিত হতে পারে। -
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প্রয়োগ করলে shardingout_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 উভয়ই একটি টেনসরের সাথে একটি শারডিং সংযুক্ত করে। তাদের আয়ুষ্কাল হল:
- Sharding প্রচারের আগে, ব্যবহারকারীরা ShardingConstraintOp যোগ করে।
- Sharding propagation ShardingConstraintOp ব্যবহার করে। Sharding propagation এর ফলাফলে কোন ShardingConstraintOp নেই। পরিবর্তে, প্রয়োজনে 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 অঞ্চল-ভিত্তিক অপস এবং অন্য যেকোনো Shardy অঞ্চল-ভিত্তিক অপসের সাথে সংযুক্ত অঞ্চলগুলিকে সমাপ্ত করে। এটি বৈচিত্র্যময়: এটি আর্গুমেন্ট হিসাবে মানগুলির একটি তালিকা গ্রহণ করে যার ধরণ যেকোনো (কিন্তু একই ধরণের, যেমন AnyTensor ) হতে পারে এবং তাই Shardy IR স্ট্যাকের বিভিন্ন স্তরে পুনরায় ব্যবহার করা যেতে পারে।
বাক্য গঠন:
operation ::= `sdy.return` attr-dict ($results^ `:` type($results))?
বৈশিষ্ট্য: AlwaysSpeculatableImplTrait , Terminator
ইন্টারফেস: ConditionallySpeculatable , NoMemoryEffect (MemoryEffectOpInterface)
প্রভাব: MemoryEffects::Effect{}
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
results | যেকোনো ধরণের বৈচিত্র্যময় |
sdy.sharding_constraint (sdy::ShardingConstraintOp)
নির্দিষ্ট শারডিং-এ একটি টেনসরকে সীমাবদ্ধ করে
বাক্য গঠন:
operation ::= `sdy.sharding_constraint` $input $sharding attr-dict `:` type($result)
একটি মধ্যবর্তী টেনসরের সাথে একটি শারডিং সংযুক্ত করে (যেমন একটি ম্যাটমুলের ফলাফল) নির্দেশ করে যে এইভাবে সেই টেনসর, অথবা এর ব্যবহারের একটি উপসেট, শারড করা উচিত।
যদি শার্ডিং-এর খোলা মাত্রা এবং অবাধ অক্ষ থাকে, তাহলে এর অর্থ হল টেনসরটিকে খোলা মাত্রা বরাবর আরও শার্ড করা যেতে পারে।
এই অপশনটি যেকোনো একটি করতে পারে:
- কোন ব্যবহার নেই (ঝুলন্ত) - যার অর্থ সংযুক্ত শার্ডিং হল ইনপুট টেনসর নিজেই শার্ড করা উচিত।
- ব্যবহার আছে - যার অর্থ সংযুক্ত শারডিং হল শারডিং কনস্ট্রেইন্ট op এর ব্যবহারগুলিকে কীভাবে শারড করা উচিত, অন্যদিকে ইনপুট টেনসরের অন্যান্য ব্যবহারগুলির একটি ভিন্ন শারডিং থাকতে পারে (যদি ইনপুট টেনসরের অন্য কোনও ব্যবহার না থাকে তবে আচরণটি নো ইউজ কেসের মতোই হবে)।
বৈশিষ্ট্য: SameOperandsAndResultType
ইন্টারফেস: InferTypeOpInterface , SymbolUserOpInterface
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | টেনসর শার্ডিং |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
input | যেকোনো ধরণের মান দ্বারা আকৃতির |
ফলাফল:
| ফলাফল | বিবরণ |
|---|---|
result | যেকোনো ধরণের মান দ্বারা আকৃতির |
sdy.sharding_group (sdy::ShardingGroupOp)
গ্রুপের টেনসরগুলিকে একই শারডিং থাকতে বাধ্য করে।
বাক্য গঠন:
operation ::= `sdy.sharding_group` $input `group_id````=```$group_id attr-dict `:` type($input)
এই অপশনটি শার্ডিং গ্রুপগুলিতে (টেন্সরের গ্রুপ যা অভিন্ন শার্ডিং রাখার জন্য জোর করা হবে) টেনসর বরাদ্দ করার জন্য একটি ইন্টারফেস প্রদান করে। প্রচারের সময়, একটি গ্রুপ উপাদান শার্ড করা মাত্রই, অন্যান্য সমস্ত সদস্য ঠিক একইভাবে শার্ড করা হবে। এই অপারেশনটি আর্গুমেন্ট গ্রুপ আইডি নেয় এবং কোনও ফলাফল দেয় না, বরং প্রদত্ত আইডি সহ গ্রুপে ইনপুট টেনসর যোগ করার জন্য অভ্যন্তরীণ শার্ডিং গ্রুপ উপস্থাপনা পরিবর্তন করে।
ইন্টারফেস: InferTypeOpInterface
বৈশিষ্ট্য:
| বৈশিষ্ট্য | MLIR প্রকার | বিবরণ |
|---|---|---|
group_id | ::mlir::পূর্ণসংখ্যাঅ্যাটার | ৬৪-বিট সাইনলেস পূর্ণসংখ্যা বৈশিষ্ট্য |
অপারেন্ডস:
| অপারেন্ড | বিবরণ |
|---|---|
input | যেকোনো ধরণের মানের টেনসরকে র্যাঙ্ক করা হয়েছে |
গুণাবলী
AllToAllParamAttr সম্পর্কে
অল-টু-অল প্যারামিটার
বাক্য গঠন:
#sdy.all_to_all_param<
::llvm::ArrayRef<AxisRefAttr>, # axes
int64_t, # src_dim
int64_t # tgt_dim
>
অল-টু-অল পারফর্ম করার জন্য অক্ষ এবং উৎস/লক্ষ্য মাত্রা সম্বলিত একটি টুপল।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| অক্ষ | ::llvm::ArrayRef<AxisRefAttr> | অল-টু-অল সম্পাদনের জন্য অক্ষগুলি |
| src_dim সম্পর্কে | int64_t | উৎস মাত্রা সূচক |
| tgt_dim সম্পর্কে | int64_t | লক্ষ্য মাত্রা সূচক |
AllToAllParamListAttr সম্পর্কে
অল-টু-অল প্যারামিটারের তালিকা
বাক্য গঠন:
#sdy.all_to_all_param_list<
::llvm::ArrayRef<AllToAllParamAttr> # value
>
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| মূল্য | ::llvm::ArrayRef<AllToAllParamAttr> |
AxisRefAttr সম্পর্কে
একটি পূর্ণ অক্ষ অথবা একটি বিভক্ত উপ-অক্ষের রেফারেন্স
বাক্য গঠন:
#sdy.axis_ref<
::llvm::StringRef, # name
SubAxisInfoAttr # sub_axis_info
>
সীমাবদ্ধতা:
-
nameঅবশ্যই আবদ্ধMeshAttrএ উপস্থিত থাকতে হবে। - যদি
sub_axis_infoউপস্থিত থাকে, তাহলে এটি অবশ্যইSubAxisInfoAttrএর সীমাবদ্ধতা পূরণ করবে।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| নাম | ::llvm::StringRef | এই অক্ষের নাম |
| উপ-অক্ষ_তথ্য | SubAxisInfoAttr | যদি এটি একটি উপ-অক্ষ হয় তবে অতিরিক্ত তথ্য |
AxisRefListAttr সম্পর্কে
অক্ষ রেফারেন্সের তালিকা
বাক্য গঠন:
#sdy.axis_ref_list<
::llvm::ArrayRef<AxisRefAttr> # value
>
সীমাবদ্ধতা:
-
valueউপাদানগুলিকেAxisRefAttrএর সীমাবদ্ধতা পূরণ করতে হবে। - একে অপরের সাথে ওভারল্যাপ করে এমন কোনও সদৃশ অক্ষ-রেফ বা উপ-অক্ষ নেই।
- কোনও দুটি সংলগ্ন অক্ষ-রেফ একই পূর্ণ অক্ষের পরপর উপ-অক্ষ নয়, অর্থাৎ, এগুলি একটি উপ-অক্ষ বা পূর্ণ অক্ষে একত্রিত করা যেতে পারে।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| মূল্য | ::llvm::ArrayRef<AxisRefAttr> |
AxisToPropagationবিস্তারিতAttr
একটি নির্দিষ্ট অক্ষ এবং উৎসের জন্য বংশবিস্তার প্রান্ত প্রবাহের বিবরণ।
বাক্য গঠন:
#sdy.axis_to_propagation_details<
::mlir::sdy::AxisRefAttr, # axis_name
::mlir::sdy::EdgeValueRefAttr, # source
::llvm::ArrayRef<EdgeValueRefAttr> # targets
>
একটি নির্দিষ্ট অক্ষ বরাবর লক্ষ্য মানের রেফারেন্সের তালিকার সাথে একটি উৎস মানের রেফারেন্স ম্যাপ করে।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| অক্ষ_নাম | ::mlir::sdy::AxisRefAttr | একটি পূর্ণ অক্ষ অথবা একটি বিভক্ত উপ-অক্ষের রেফারেন্স |
| উৎস | ::mlir::sdy::EdgeValueRefAttr | টাইপ type একটি মানের প্রান্তের একটি নির্দিষ্ট সূচকের রেফারেন্স। |
| লক্ষ্যবস্তু | ::llvm::ArrayRef<EdgeValueRefAttr> | প্রান্ত লক্ষ্য মানের তালিকা |
ডিমম্যাপিংঅ্যাটার
একটি মাত্রার জন্য ফ্যাক্টর সূচকের তালিকা
একটি খালি তালিকা ইঙ্গিত করে যে এটি একটি নাল ম্যাপিং (এটি * দিয়ে পার্স/প্রিন্ট করা হয়েছে), অর্থাৎ মাত্রাটি কোনও ফ্যাক্টরের সাথে ম্যাপ করা হয়নি।
সীমাবদ্ধতা:
- কমপক্ষে একটি ফ্যাক্টর সূচক আছে।
- ফ্যাক্টর সূচকগুলি অবশ্যই [0,
$factor_sizes) পরিসরে থাকতে হবে। - যদি একাধিক উৎপাদক থাকে, তাহলে তাদের কোনটিরই আকার ১ হতে পারে না।
- কোনও সদৃশ ফ্যাক্টর সূচক নেই।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| ফ্যাক্টর_ইন্ডিক্স | ::llvm::ArrayRef<int64_t> | এই মাত্রাটি ম্যাপ করা উপাদানগুলি |
ডাইমেনশনশারডিংঅ্যাটার
মাত্রা শারডিং
একটি টেনসর ডাইমেনশনকে মেজর থেকে মাইনরে খণ্ডিত করার জন্য অক্ষের নামের তালিকা, একটি বুলিয়ান যা নির্দেশ করে যে মাত্রাটি আরও খণ্ডিত করা যেতে পারে কিনা, এবং একটি ঐচ্ছিক পূর্ণসংখ্যা যা এই ডাইমেনশন খণ্ডিত করার অগ্রাধিকার নির্দেশ করে, যা খণ্ডিত প্রচারের সময় সম্মানিত হবে। অগ্রাধিকারগুলি ব্যবহারকারী খণ্ডিত টীকা থেকে উদ্ভূত হয় এবং একটি কম মান একটি উচ্চতর অগ্রাধিকার নির্দেশ করে। টীকাতে অগ্রাধিকার অনুপস্থিত থাকলে সর্বোচ্চ অগ্রাধিকার ধরে নেওয়া হয়।
সীমাবদ্ধতা:
-
axesউপাদানগুলিকেAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। - যদি একটি ডাইমেনশন শারডিংয়ের অগ্রাধিকার থাকে:
- অগ্রাধিকার 0 এর চেয়ে বড় বা সমান।
- যদি মাত্রাটি বন্ধ থাকে তবে এর কমপক্ষে একটি অক্ষ থাকবে।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| অক্ষ | ::llvm::ArrayRef<AxisRefAttr> | অক্ষ রেফারেন্স |
| বন্ধ আছে | bool | এই মাত্রাটি আরও তীক্ষ্ণ করা যাবে না কিনা |
| অগ্রাধিকার | std::optional<int64_t> | ব্যবহারকারীর অগ্রাধিকার ভিত্তিক প্রচারের সময় ব্যবহৃত অগ্রাধিকার |
এজভ্যালুরেফঅ্যাটার
টাইপ type একটি মানের প্রান্তের একটি নির্দিষ্ট সূচকের রেফারেন্স।
বাক্য গঠন:
#sdy.edge_value_ref<
::mlir::sdy::EdgeNodeType, # type
int64_t # index
>
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| আদর্শ | ::mlir::sdy::EdgeNodeType | EdgeNodeType ধরণের একটি enum |
| সূচক | int64_t | পূর্ণসংখ্যা সূচক (০, ১, ২, ইত্যাদি) |
অক্ষের তালিকারেফ তালিকাঅ্যাট্র
অক্ষ রেফারেন্স তালিকার তালিকা
বাক্য গঠন:
#sdy.list_of_axis_ref_lists<
::llvm::ArrayRef<AxisRefListAttr> # value
>
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| মূল্য | ::llvm::ArrayRef<AxisRefListAttr> |
ম্যানুয়ালঅক্ষঅ্যাটার
একটি ManualComputationOp যে অক্ষগুলিতে ম্যানুয়ালভাবে কাজ করে তার একটি তালিকা
বাক্য গঠন:
#sdy.manual_axes<
::llvm::ArrayRef<StringAttr> # value
>
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| মূল্য | ::llvm::ArrayRef<StringAttr> |
মেশঅ্যাটর
অক্ষের জাল এবং ডিভাইসের একটি তালিকা
বাক্য গঠন:
#sdy.mesh<
::llvm::ArrayRef<MeshAxisAttr>, # axes
::llvm::ArrayRef<int64_t> # device_ids
>
একটি মেশ হল অক্ষের একটি তালিকা এবং ডিভাইস আইডির একটি ঐচ্ছিক তালিকা যা ডিভাইসের ক্রম নির্দিষ্ট করে।
যদি অক্ষের তালিকা খালি থাকে
- যদি
device_idsপ্রদান করা না থাকে, তাহলে এটি একটি খালি জাল। - যদি
device_idsপ্রদান করা হয়, তাহলে এটি অবশ্যই একটি একক অ-ঋণাত্মক পূর্ণসংখ্যা হতে হবে, আমরা এটিকে একটি maximal-sharding mesh বলি।
যদি অক্ষের তালিকা দেওয়া থাকে
- যদি একটি ডিভাইস আইডি তালিকা নির্দিষ্ট করা থাকে, তাহলে অক্ষের আকারের গুণফল ডিভাইসের সংখ্যার সাথে মিলবে।
- যদি কোনও ডিভাইস আইডি তালিকা নির্দিষ্ট না করা থাকে, তাহলে অন্তর্নিহিত ডিভাইস আইডি তালিকা হল 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_idsহলiota(product(axis_sizes))এবং সাজানোdevice_idsহলiota(product(axis_sizes))।
-
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| অক্ষ | ::llvm::ArrayRef<MeshAxisAttr> | জাল অক্ষ |
| ডিভাইস_আইডি | ::llvm::ArrayRef<int64_t> | স্পষ্ট ডিভাইস অর্ডারিং বা সর্বাধিক ডিভাইস আইডি |
মেশঅ্যাক্সিসঅ্যাটার
একটি জালে নামকরণ করা অক্ষ
বাক্য গঠন:
#sdy.mesh_axis<
::llvm::StringRef, # name
int64_t # size
>
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| নাম | ::llvm::StringRef | নাম |
| আকার | int64_t | এই অক্ষের আকার |
অপশার্ডিংরুলঅ্যাটার
একটি অপারেশন কিভাবে পার্টিশন করা যেতে পারে তা নির্দিষ্ট করে।
বাক্য গঠন:
#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
>
একটি শার্ডিং নিয়ম নির্দিষ্ট করে যে কীভাবে একটি অপারেশনকে op-এর বিভিন্ন বৈশিষ্ট্য অনুসারে ভাগ করা যেতে পারে - যেকোনো বৈশিষ্ট্য, অপারেন্ডের আকৃতি, ফলাফলের আকৃতি ইত্যাদি। উদাহরণস্বরূপ:
%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,
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| ফ্যাক্টর_সাইজ | ::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
>
ধাপ সূচক অনুসারে গোষ্ঠীভুক্ত একটি মানের জন্য প্রতি-অক্ষ প্রচারের বিশদ বিবরণের একটি তালিকা।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| মূল্য | ::llvm::ArrayRef<PropagationOneStepAttr> |
প্রচারএকধাপঅ্যাটার
প্রতি-পদক্ষেপ প্রচার মেটাডেটা।
বাক্য গঠন:
#sdy.propagation_one_step<
int64_t, # step_index
::llvm::ArrayRef<AxisToPropagationDetailsAttr> # axis_entries
>
একটি একক প্রচার ধাপের জন্য সমস্ত অক্ষের জন্য প্রচারের বিবরণ।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| ধাপ_সূচী | int64_t | ধাপ সূচক |
| অক্ষ_প্রবেশ | ::llvm::ArrayRef<AxisToPropagationDetailsAttr> | প্রতি প্রচারের সিদ্ধান্তের জন্য অক্ষ প্রচারের বিবরণ |
সাবঅ্যাক্সিসইনফোঅ্যাটর
এই উপ-অক্ষটি পূর্ণ অক্ষ থেকে কীভাবে উদ্ভূত হয়েছে সে সম্পর্কে তথ্য
বাক্য গঠন:
#sdy.sub_axis_info<
int64_t, # pre_size
int64_t # size
>
একটি পূর্ণ অক্ষকে n উপ-অক্ষে বিভক্ত করার সময়, অক্ষটিকে [k_1,...,k_n] তে পুনঃআকার দেওয়া হয় এবং ith উপ-অক্ষকে তার বাম দিকের সমস্ত অক্ষের আকারের গুণফল দ্বারা প্রকাশ করা যেতে পারে m=prod(k_1,...,k_(i-1)) (aka pre-size) এবং size k_i। অতএব, sub-axis-info বৈশিষ্ট্যটি এই দুটি সংখ্যা ধারণ করে এবং নিম্নরূপে চিহ্নিত করা হয়: (m)k for pre-size m এবং size k।
সীমাবদ্ধতা:
-
pre-sizeকমপক্ষে ১। -
size১ এর চেয়ে বড়। -
pre-sizeঅবশ্যই পূর্ণ অক্ষের আকারকে ভাগ করবে, অর্থাৎ,pre-sizeএবংsizeউভয়ই পূর্ণ অক্ষের আকারকে ভাগ করবে এবং উপ-অক্ষ পূর্ণ অক্ষের বাইরে যাবে না। - উপ-অক্ষের আকার সংশ্লিষ্ট পূর্ণ অক্ষের আকারের সমান নয়, এই ক্ষেত্রে পূর্ণ অক্ষ ব্যবহার করা উচিত।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| প্রি-সাইজ | int64_t | এই উপ-অক্ষের বাম দিকের উপ-অক্ষের আকারের গুণফল |
| আকার | int64_t | এই উপ-অক্ষের আকার |
টেনসরম্যাপিংঅ্যাট্রিবিউটর
একটি টেনসরের প্রতিটি মাত্রার জন্য ফ্যাক্টর ম্যাপিং।
বাক্য গঠন:
#sdy.tensor_mapping<
::llvm::ArrayRef<DimMappingAttr> # dim_mappings
>
সীমাবদ্ধতা:
-
dim_mappingsএর উপাদানগুলিকেDimMappingAttrএর সীমাবদ্ধতা পূরণ করতে হবে। - মাত্রা জুড়ে কোনও সদৃশ উৎপাদক সূচক নেই।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| ডিম_ম্যাপিং | ::llvm::ArrayRef<DimMappingAttr> | মাত্রা ম্যাপিং |
টেনসরশারডিংঅ্যাটার
টেনসর শার্ডিং
বাক্য গঠন:
#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 উভয়ই আনরিডিউসড থাকে) এবং পরে অল-রিডিউসড করার সময় এটি আনরিডিউসড থাকতে পারে। আমরা ধরে নিচ্ছি যে রিডিউসড টাইপটি sum, ভবিষ্যতে অন্যান্য রিডিউসডও সমর্থিত হতে পারে।
সীমাবদ্ধতা:
-
dim_shardingsএর উপাদানগুলিকেDimensionShardingAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। -
replicated_axesএর উপাদানগুলিকেAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। -
unreduced_axesএর উপাদানগুলিকেAxisRefListAttrএ তালিকাভুক্ত সীমাবদ্ধতাগুলি পূরণ করতে হবে। - যদি সংশ্লিষ্ট টেনসর টাইপটি
ShapedTypeনা হয়, তাহলে sharding-এর rank 0 থাকতে হবে এবং কোনও প্রতিলিপিকৃত অক্ষ থাকতে হবে না। - যদি এটি একটি
ShapedTypeহয়, তাহলে:- টেনসরের একটি র্যাঙ্ক থাকা উচিত।
- মাত্রার শারডিংয়ের সংখ্যা টেনসরের র্যাঙ্কের সমান।
- ০ সাইজের মাত্রা ছোট করা হয় না।
-
dim_shardings,replicated_axes, এবংunreduced_axesজুড়ে একে অপরের সাথে ওভারল্যাপ করে এমন কোনও ডুপ্লিকেট অক্ষ-রেফ বা উপ-অক্ষ নেই। -
replicated_axesএবংunreduced_axesএর আইটেমগুলিকে wrtmesh_or_refঅনুসারে অর্ডার করা হয়েছে (AxisRefAttr::getMeshComparatorদেখুন)।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| মেশ_অর_রেফ | ::mlir::Attribute | মেশ অ্যাট্র বা ফ্ল্যাট মেশ প্রতীক রেফারেন্স অ্যাট্র |
| ডিম_শার্ডিংস | ::llvm::ArrayRef<DimensionShardingAttr> | মাত্রা শার্ডিং |
| প্রতিলিপিকৃত_অক্ষ | ::llvm::ArrayRef<AxisRefAttr> | অক্ষ রেফারেন্স |
| অপ্রকাশিত_অক্ষ | ::llvm::ArrayRef<AxisRefAttr> | অক্ষ রেফারেন্স |
টেনসরশারডিংপ্রতিমানঅ্যাটার
প্রতি অপারেন্ড/অপারেশনের ফলাফলের জন্য টেনসর শার্ডিং
বাক্য গঠন:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
TensorShardingAttr এর একটি তালিকা, প্রতিটি অপারেন্ড/অপারেশনের ফলাফলের জন্য একটি।
সীমাবদ্ধতা:
-
shardingsএর উপাদানগুলিকে অবশ্যইTensorShardingAttrএর সীমাবদ্ধতা পূরণ করতে হবে।
পরামিতি:
| প্যারামিটার | সি++ টাইপ | বিবরণ |
|---|---|---|
| শার্ডিং | ::llvm::ArrayRef<TensorShardingAttr> | প্রতি মান ভাগাভাগি |
এনামস
এজনোডটাইপ
এজ নোড টাইপ এনাম
মামলা:
| প্রতীক | মূল্য | স্ট্রিং |
|---|---|---|
| অপারেন্ড | 0 | অপারেন্ড |
| ফলাফল | 1 | ফলাফল |
প্রচারের দিকনির্দেশনা
বংশবিস্তার দিক enum
মামলা:
| প্রতীক | মূল্য | স্ট্রিং |
|---|---|---|
| কোনটিই নয় | 0 | কোনটিই নয় |
| এগিয়ে যান | 1 | এগিয়ে যান |
| পিছনে | 2 | পিছনে |
| উভয়ই | 3 | উভয়ই |