शार्डी (एसडीवाय) बोली
शार्डी (SDY) डायलेक्ट, ऐक्सिस पर आधारित टेंसर शार्डिंग और टेंसर में शार्डिंग जोड़ने के लिए अतिरिक्त एपीआई कॉम्पोनेंट तय करता है.
वर्शन लॉग: 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, ऐक्सिस की सूचियों की सूची होती है. बाहरी सूची, टेंसर के डाइमेंशन से ज़्यादा है. हर इनर लिस्ट में, उन ऐक्सिस के बारे में बताया जाता है जिनके हिसाब से, हर डाइमेंशन पर अलग-अलग तरीके से डेटा इकट्ठा किया जाना चाहिए. इसे ऑपरेंड (tensor) की शार्डिंग पर लागू किया जाएगा, ताकि नतीजे (out_sharding) की शार्डिंग मिल सके.
ध्यान दें कि 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_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, ऑपरेंड डाइमेंशन शार्डिंग और रेप्लिकेटेड ऐक्सिस के साथ ओवरलैप नहीं होना चाहिए. हालांकि, यह अनरिड्यूस्ड ऐक्सिस के साथ ओवरलैप हो सकता है.reduction_axesकोout_shardingके बिना कम किए गए ऐक्सिस के साथ ओवरलैप नहीं होना चाहिए. दूसरे शब्दों में,out_shardingकोreduction_axesके साथ दोहराया जाना चाहिए. ऐसा साफ़ तौर पर या परोक्ष रूप से किया जा सकता है.
विशेषताएं: SameOperandsAndResultType
इंटरफ़ेस: CollectiveOpInterface, InferTypeOpInterface, SymbolUserOpInterface
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
reduction_axes | ::mlir::sdy::AxisRefListAttr | ऐक्सिस रेफ़रंस की सूची |
reduction_op | ::mlir::sdy::ReductionOpAttr | reduction op enum |
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, ऐक्सिस की सूचियों की सूची होती है. बाहरी सूची, टेंसर के डाइमेंशन से ज़्यादा है. हर इनर लिस्ट में, उन ऐक्सिस के बारे में बताया जाता है जिनके हिसाब से डाइमेंशन को स्लाइस किया जाना चाहिए. इसे ऑपरेंड (tensor) के शार्डिंग पर लागू किया जाएगा, ताकि नतीजे (out_sharding) का शार्डिंग मिल सके.
ध्यान दें कि 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)
पैरामीटर की सूची में मौजूद हर (axes, src_dim, tgt_dim) टपल के लिए, यह
ऑपरेशन, tgt_dim डाइमेंशन और axes में बताए गए ऐक्सिस के हिसाब से, टेंसर के हिस्सों को स्लाइस करता है. साथ ही, उन हिस्सों को ऐक्सिस के हिसाब से स्कैटर करता है और उन्हें src_dim डाइमेंशन के हिसाब से जोड़ता है.
यह कार्रवाई, src_dim और axes के साथ-साथ ऑल-गैदर और tgt_dim और axes के साथ-साथ ऑल-स्लाइस का कॉम्बिनेशन है. इसका मतलब है कि इनपुट टेंसर पर मौजूद ऐक्सिस शार्डिंग डाइमेंशन src_dim का सफ़िक्स, आउटपुट टेंसर पर मौजूद ऐक्सिस शार्डिंग डाइमेंशन tgt_dim में जोड़ दिया जाता है.
ऑपरेंड (tensor) की शार्डिंग पर ऑल-टू-ऑल लागू किया जाएगा, ताकि नतीजे (out_sharding) की शार्डिंग मिल सके.
ध्यान दें कि out_sharding का इस्तेमाल, नतीजे को अलग-अलग हिस्सों में बांटने के लिए नहीं किया जाता. इसके बजाय, नतीजे की शार्डिंग, ऑपरेंड src_dim, tgt_dim, और axes की शार्डिंग से तय होती है. साथ ही, out_sharding को इस अनुमानित शार्डिंग से मेल खाना चाहिए.
उदाहरण:
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "b"}, {"c"}, {}, {}\]>]>} : tensor<8x8x4x4x32>
%2 = sdy.all_to_all [{"b"}: 0->2, {"c"}: 1->3] %1 out_sharding=<@mesh, [{"a"}, {}, {"b"}, {"c"}\]> : tensor<8x8x4x4x32>
चुनौतियां:
Sdy_CollectiveOpInterfaceमें दी गई शर्तों को पूरा करना ज़रूरी है.- पैरामीटर की सूची वाला फ़ील्ड खाली नहीं छोड़ा जा सकता.
paramsमें मौजूद हर पैरामीटर के लिए:axesमें मौजूद एलिमेंट,AxisRefAttrकी शर्तों को पूरा करते हों.src_dimऔरtgt_dim, मान्य डाइमेंशन होने चाहिए. ये नॉन-नेगेटिव होने चाहिए और इनकी वैल्यू, टेंसर के रैंक से कम होनी चाहिए.- सभी पैरामीटर में
src_dimयाtgt_dimयूनीक होना चाहिए. src_dimको सभी पैरामीटर के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.
- ऑपरेंड शार्डिंग में,
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
})
इस while लूप में 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 ऑप से तय करने की अनुमति नहीं देते. इसलिए, हम यह मान सकते हैं कि इसे ऐसे ऑप से तय किया गया है जिसमें बिना रजिस्टर किया गया sdy.sharding एट्रिब्यूट है.
विशेषताएं: SameOperandsAndResultType
इंटरफ़ेस: InferTypeOpInterface, SymbolUserOpInterface
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
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 होता है, तब यह caller callOp के आर्ग्युमेंट से लेकर func आर्ग्युमेंट के उपयोगकर्ताओं तक एक ब्रिज होता है. हर फ़ंक्शन आर्ग्युमेंट के लिए, एक फ़ंक्शन डेटा फ़्लो एज होता है. जब इसका ऑपरेंड 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 की सूची में शामिल नहीं होते.
ध्यान दें कि रैंक न किए गए किसी भी टेंसर में, रैंक 0 के साथ शार्डिंग होनी चाहिए. इसका मतलब है कि उसे पूरी तरह से दोहराया गया हो.
चुनौतियां:
in_shardingsऔरout_shardingsमें मौजूद एलिमेंट को,TensorShardingAttrमें दी गई पाबंदियों का पालन करना होगा.- ऑपरेशन क्षेत्र के ग्लोबल और लोकल टेंसर इनपुट/आउटपुट की संख्या मेल खानी चाहिए.
- हर डिम शार्डिंग में, मैन्युअल ऐक्सिस, फ़्री ऐक्सिस से पहले होने चाहिए.
- मैन्युअल ऐक्सिस में पैडिंग नहीं जोड़ी जा सकती. इसका मतलब है कि डाइमेंशन का साइज़, मैन्युअल ऐक्सिस के साइज़ से पूरी तरह से भाग होना चाहिए.
- ओपी रीज़न के आर्ग्युमेंट/नतीजों के ग्लोबल और लोकल शेप मेल खाने चाहिए.
ट्रेट: IsolatedFromAbove, RecursiveMemoryEffects, SingleBlockImplicitTerminator<ReturnOp>, SingleBlock
इंटरफ़ेस: ShardableDataFlowOpInterface, SymbolUserOpInterface
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | किसी ऑप के हर ऑपरेंड/नतीजे के हिसाब से टेंसर शार्डिंग |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | किसी ऑप के हर ऑपरेंड/नतीजे के हिसाब से टेंसर शार्डिंग |
manual_axes | ::mlir::sdy::ManualAxesAttr | उन ऐक्सिस की सूची जिन पर ManualComputationOp को मैन्युअल तरीके से लागू किया जाता है |
ऑपरेंड:
| ओपेरैंड | ब्यौरा |
|---|---|
tensors |
किसी भी नॉन-टोकन टाइप का वैरिएडिक |
नतीजे:
| नतीजा | ब्यौरा |
|---|---|
results |
किसी भी नॉन-टोकन टाइप का वैरिएडिक |
sdy.mesh (sdy::MeshOp)
नाम वाला मेश
सिंटैक्स:
operation ::= `sdy.mesh` $sym_name `=` $mesh attr-dict
इससे नाम वाली नई मेश तय की जाती है. किसी मॉड्यूल में मौजूद सभी मेश में डिवाइसों की संख्या एक जैसी होनी चाहिए. हालांकि, एक device_id वाले मेश को छोड़कर.
मेश, Symbol ऑपरेशन होता है. यह मॉड्यूल के SymbolTable में दिखता है और इसके name से इसका रेफ़रंस दिया जा सकता है.
विशेषताएं: HasParent<ModuleOp>, SymbolName
इंटरफ़ेस: 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 के मुख्य हिस्से में डुप्लीकेट/कॉपी किया जा सकता है.
रीजन में हर ब्लॉक आर्ग्युमेंट और दिखाई गई वैल्यू का टाइप, ऑपरेंड और op के नतीजे के टाइप के जैसा होना चाहिए.
उदाहरण:
%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 |
किसी भी नॉन-टोकन टाइप का वैरिएडिक |
नतीजे:
| नतीजा | ब्यौरा |
|---|---|
| «unnamed» | किसी भी नॉन-टोकन टाइप का वैरिएडिक |
sdy.propagation_barrier (sdy::PropagationBarrierOp)
प्रॉपगेशन बैरियर ऑपरेशन
सिंटैक्स:
operation ::= `sdy.propagation_barrier` $input `allowed_direction````=```$allowed_direction attr-dict `:` type($input)
यह आइडेंटिटी ऑप की तरह काम करता है. यह वही वैल्यू आउटपुट करता है जो इसने इनपुट के तौर पर ली थी. हालांकि, इस मामले में, यह सिर्फ़ एक दिशा में फ़्लो होने की अनुमति देगा.
इससे बैरियर ऑप और उसके ऑपरेंड के नतीजे के इस्तेमाल के बीच, शार्डिंग को फैलने से रोका जाता है.
FORWARDका मतलब है कि शार्डिंग सिर्फ़ ऑपरेंड से नतीजे तक जा सकती है.BACKWARDका मतलब है कि शार्डिंग सिर्फ़ नतीजे से ऑपरेंड तक जा सकती है.NONEका मतलब है कि इस ऑपरेशन के ज़रिए कोई भी शार्डिंग नहीं की जा सकती.BOTHको तय नहीं किया जा सकता, क्योंकि यह कार्रवाई गैर-ज़रूरी होगी.
विशेषताएं: AlwaysSpeculatableImplTrait, SameOperandsAndResultType
इंटरफ़ेस: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)
असर: MemoryEffects::Effect{}
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
allowed_direction | ::mlir::sdy::PropagationDirectionAttr | प्रॉपगेशन डायरेक्शन enum |
ऑपरेंड:
| ओपेरैंड | ब्यौरा |
|---|---|
input |
किसी भी नॉन-टोकन टाइप की वैल्यू का रैंक किया गया टेंसर |
नतीजे:
| नतीजा | ब्यौरा |
|---|---|
result |
किसी भी नॉन-टोकन टाइप की वैल्यू का रैंक किया गया टेंसर |
sdy.reduce_scatter (sdy::ReduceScatterOp)
यह फ़ंक्शन, ऐक्सिस के साथ-साथ कम्यूनिकेशन को कम करता है
सिंटैक्स:
operation ::= `sdy.reduce_scatter` ($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
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
reduce_scatter_axes | ::mlir::sdy::ListOfAxisRefListsAttr | ऐक्सिस रेफ़रंस की सूचियां |
reduction_op | ::mlir::sdy::ReductionOpAttr | reduction op enum |
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
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
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{}
विशेषताएं:
| एट्रिब्यूट | 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, 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), where all-gather, sharded-to-unreduced, all-reduce are applied on the same 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
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
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)
यह फ़ंक्शन, किसी इंटरमीडिएट टेंसर (जैसे कि matmul का नतीजा) में शार्डिंग अटैच करता है. इससे यह पता चलता है कि उस टेंसर या उसके इस्तेमाल के सबसेट को इस तरह से शार्ड किया जाना चाहिए.
अगर शार्डिंग में ओपन डाइमेंशन और अनकंस्ट्रेंट ऐक्सिस हैं, तो इसका मतलब है कि ओपन डाइमेंशन के हिसाब से, टेंसर को और भी शार्ड किया जा सकता है.
यह कार्रवाई इनमें से कोई एक काम कर सकती है:
- इसका इस्तेमाल कहीं नहीं किया गया है (डैंगलिंग) - इसका मतलब है कि अटैच की गई शार्डिंग, इनपुट टेंसर को शार्ड करने का तरीका है.
- इस्तेमाल किए गए - इसका मतलब है कि अटैच की गई शार्डिंग, शार्डिंग कंस्ट्रेंट ऑप के इस्तेमाल को कैसे शार्ड किया जाना चाहिए. वहीं, इनपुट टेंसर के अन्य इस्तेमाल में अलग शार्डिंग हो सकती है. अगर इनपुट टेंसर का कोई अन्य इस्तेमाल नहीं किया गया है, तो इसका व्यवहार, इस्तेमाल न किए जाने वाले मामले जैसा ही होगा.
विशेषताएं: SameOperandsAndResultType
इंटरफ़ेस: InferTypeOpInterface, SymbolUserOpInterface
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | टेंसर शार्डिंग |
ऑपरेंड:
| ओपेरैंड | ब्यौरा |
|---|---|
input |
कोई भी नॉन-टोकन टाइप |
नतीजे:
| नतीजा | ब्यौरा |
|---|---|
result |
कोई भी नॉन-टोकन टाइप |
sdy.sharding_group (sdy::ShardingGroupOp)
ग्रुप में मौजूद टेंसर को एक ही शार्डिंग में सीमित करता है.
सिंटैक्स:
operation ::= `sdy.sharding_group` $input `group_id````=```$group_id attr-dict `:` type($input)
यह विकल्प, शार्डिंग ग्रुप को टेंसर असाइन करने के लिए इंटरफ़ेस उपलब्ध कराता है. शार्डिंग ग्रुप, ऐसे टेंसर के ग्रुप होते हैं जिनमें एक जैसी शार्डिंग लागू की जाती है. प्रॉपगेशन के दौरान, जैसे ही किसी ग्रुप एलिमेंट को शार्ड किया जाता है, वैसे ही अन्य सभी सदस्यों को भी ठीक उसी तरह शार्ड कर दिया जाता है. यह ऑपरेशन, ग्रुप आईडी को आर्ग्युमेंट के तौर पर लेता है और कोई नतीजा नहीं दिखाता. हालांकि, यह इंटरनल शार्डिंग ग्रुप के प्रज़ेंटेशन में बदलाव करता है, ताकि इनपुट टेंसर को दिए गए आईडी वाले ग्रुप में जोड़ा जा सके.
इंटरफ़ेस: InferTypeOpInterface
विशेषताएं:
| एट्रिब्यूट | MLIR टाइप | ब्यौरा |
|---|---|---|
group_id | ::mlir::IntegerAttr | 64-बिट का बिना साइन वाला पूर्णांक एट्रिब्यूट |
ऑपरेंड:
| ओपेरैंड | ब्यौरा |
|---|---|
input |
किसी भी नॉन-टोकन टाइप की वैल्यू का रैंक किया गया टेंसर |
विशेषताएं
AllToAllParamAttr
ऑल-टू-ऑल पैरामीटर
सिंटैक्स:
#sdy.all_to_all_param<
::llvm::ArrayRef<AxisRefAttr>, # axes
int64_t, # src_dim
int64_t # tgt_dim
>
यह एक टपल है. इसमें सभी-से-सभी ऑपरेशन करने के लिए, ऐक्सिस और सोर्स/टारगेट डाइमेंशन शामिल होते हैं.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| ऐक्सिस | ::llvm::ArrayRef<AxisRefAttr> |
सभी-से-सभी कम्यूनिकेशन के लिए ऐक्सिस |
| src_dim | int64_t |
सोर्स डाइमेंशन का इंडेक्स |
| tgt_dim | int64_t |
टारगेट डाइमेंशन इंडेक्स |
AllToAllParamListAttr
सभी-से-सभी पैरामीटर की सूची
सिंटैक्स:
#sdy.all_to_all_param_list<
::llvm::ArrayRef<AllToAllParamAttr> # value
>
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| मान | ::llvm::ArrayRef<AllToAllParamAttr> |
AxisRefAttr
पूरे ऐक्सिस या स्प्लिट किए गए सब-ऐक्सिस का रेफ़रंस
सिंटैक्स:
#sdy.axis_ref<
::llvm::StringRef, # name
SubAxisInfoAttr # sub_axis_info
>
चुनौतियां:
name,MeshAttrमें मौजूद होना चाहिए.- अगर
sub_axis_infoमौजूद है, तो यह ज़रूरी है कि यहSubAxisInfoAttrकी शर्तों को पूरा करता हो.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| नाम | ::llvm::StringRef |
इस ऐक्सिस का नाम |
| sub_axis_info | SubAxisInfoAttr |
अगर यह सब-ऐक्सिस है, तो अतिरिक्त जानकारी |
AxisRefListAttr
ऐक्सिस रेफ़रंस की सूची
सिंटैक्स:
#sdy.axis_ref_list<
::llvm::ArrayRef<AxisRefAttr> # value
>
चुनौतियां:
valueमें मौजूद एलिमेंट,AxisRefAttrकी शर्तों को पूरा करते हों.- कोई भी डुप्लीकेट ऐक्सिस-रेफ़रंस या सब-ऐक्सिस मौजूद नहीं है. साथ ही, कोई भी सब-ऐक्सिस एक-दूसरे से ओवरलैप नहीं होता है.
- कोई भी दो आस-पास के ऐक्सिस-रेफ़, एक ही फ़ुल ऐक्सिस के लगातार सब-ऐक्सिस नहीं होते. इसका मतलब है कि उन्हें एक सब-ऐक्सिस या फ़ुल ऐक्सिस में मर्ज किया जा सकता है.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| मान | ::llvm::ArrayRef<AxisRefAttr> |
AxisToPropagationDetailsAttr
किसी ऐक्सिस और सोर्स के लिए, एज फ़्लो की जानकारी.
सिंटैक्स:
#sdy.axis_to_propagation_details<
::mlir::sdy::AxisRefAttr, # axis_name
::mlir::sdy::EdgeValueRefAttr, # source
::llvm::ArrayRef<EdgeValueRefAttr> # targets
>
यह फ़ंक्शन, किसी सोर्स वैल्यू रेफ़रंस को किसी खास ऐक्सिस के साथ टारगेट वैल्यू रेफ़रंस की सूची पर मैप करता है.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| axis_name | ::mlir::sdy::AxisRefAttr |
पूरे ऐक्सिस या स्प्लिट किए गए सब-ऐक्सिस का रेफ़रंस |
| सोर्स | ::mlir::sdy::EdgeValueRefAttr |
type टाइप के वैल्यू एज के किसी इंडेक्स का रेफ़रंस. |
| टारगेट | ::llvm::ArrayRef<EdgeValueRefAttr> |
किनारे के टारगेट वैल्यू की सूची |
DimMappingAttr
किसी डाइमेंशन के लिए फ़ैक्टर इंडेक्स की सूची
खाली सूची से पता चलता है कि यह एक शून्य मैपिंग है.इसे * के साथ पार्स/प्रिंट किया जाता है. इसका मतलब है कि डाइमेंशन को किसी भी फ़ैक्टर के साथ मैप नहीं किया गया है.
चुनौतियां:
- कम से कम एक फ़ैक्टर इंडेक्स मौजूद है.
- फ़ैक्टर इंडेक्स, [0,
$factor_sizes) की रेंज में होने चाहिए. - अगर एक से ज़्यादा फ़ैक्टर हैं, तो उनमें से किसी का भी साइज़ 1 नहीं हो सकता.
- डुप्लीकेट फ़ैक्टर इंडेक्स नहीं होने चाहिए.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| factor_indices | ::llvm::ArrayRef<int64_t> |
इस डाइमेंशन को मैप करने वाले फ़ैक्टर |
DimensionShardingAttr
डाइमेंशन शार्डिंग
टेंसर डाइमेंशन को शार्ड करने के लिए, ऐक्सिस के नामों की सूची. इसमें सबसे बड़े से लेकर सबसे छोटे तक के नाम शामिल होते हैं. साथ ही, एक बूलियन वैल्यू होती है, जो यह बताती है कि डाइमेंशन को आगे और शार्ड किया जा सकता है या नहीं. इसके अलावा, एक पूर्णांक होता है, जो इस डाइमेंशन शार्डिंग की प्राथमिकता को दिखाता है. शार्डिंग के दौरान इसका पालन किया जाएगा. प्राथमिकताएं, उपयोगकर्ता के हिसाब से बंटवारा करने के एनोटेशन से तय होती हैं. कम वैल्यू का मतलब है कि प्राथमिकता ज़्यादा है. एनोटेशन में प्राथमिकता की जानकारी न होने पर, सबसे ज़्यादा प्राथमिकता मानी जाती है.
चुनौतियां:
axesमें मौजूद एलिमेंट,AxisRefListAttrमें दी गई शर्तों के मुताबिक होने चाहिए.- अगर डाइमेंशन शार्डिंग की कोई प्राथमिकता है, तो:
- प्राथमिकता 0 या इससे ज़्यादा है.
- अगर डाइमेंशन बंद है, तो उसमें कम से कम एक ऐक्सिस होता है.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| ऐक्सिस | ::llvm::ArrayRef<AxisRefAttr> |
ऐक्सिस के रेफ़रंस |
| is_closed | bool |
क्या इस डाइमेंशन को और ज़्यादा हिस्सों में नहीं बांटा जा सकता |
| प्राथमिकता | std::optional<int64_t> |
उपयोगकर्ता की प्राथमिकता के आधार पर जानकारी शेयर करने के दौरान इस्तेमाल की गई प्राथमिकता |
EdgeValueRefAttr
type टाइप के वैल्यू एज के किसी इंडेक्स का रेफ़रंस.
सिंटैक्स:
#sdy.edge_value_ref<
`operand` | `result`, # type
int64_t # index
>
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| टाइप | ::mlir::sdy::EdgeNodeType |
EdgeNodeType टाइप की सूची |
| इंडेक्स | int64_t |
पूर्णांक इंडेक्स (0, 1, 2 वगैरह) |
ListOfAxisRefListsAttr
ऐक्सिस रेफ़रंस लिस्ट की सूची
सिंटैक्स:
#sdy.list_of_axis_ref_lists<
::llvm::ArrayRef<AxisRefListAttr> # value
>
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| मान | ::llvm::ArrayRef<AxisRefListAttr> |
ManualAxesAttr
उन ऐक्सिस की सूची जिन पर ManualComputationOp मैन्युअल है
सिंटैक्स:
#sdy.manual_axes<
::llvm::ArrayRef<StringAttr> # value
>
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| मान | ::llvm::ArrayRef<StringAttr> |
MeshAttr
ऐक्सिस का मेश और डिवाइसों की सूची
सिंटैक्स:
#sdy.mesh<
::llvm::ArrayRef<MeshAxisAttr>, # axes
::llvm::ArrayRef<int64_t> # device_ids
>
मेश, ऐक्सिस की सूची होती है. साथ ही, इसमें डिवाइस आईडी की एक वैकल्पिक सूची भी होती है. इससे डिवाइसों के क्रम के बारे में पता चलता है.
अगर ऐक्सिस की सूची खाली है
- अगर
device_idsनहीं दिया गया है, तो यह एक खाली मेश है. - अगर
device_idsदिया गया है, तो यह एक नॉन-नेगेटिव पूर्णांक होना चाहिए. इसे मैक्सिमल-शार्डिंग मेश कहा जाता है.
अगर ऐक्सिस की सूची दी गई है
- अगर डिवाइस आईडी की सूची दी गई है, तो ऐक्सिस के साइज़ का प्रॉडक्ट, डिवाइसों की संख्या से मेल खाना चाहिए.
- अगर डिवाइस आईडी की सूची नहीं दी गई है, तो डिवाइस आईडी की सूची यह होगी: iota(product(axes)). आसान बनाने के लिए, हम डिवाइस आईडी की ऐसी सूची को भी शामिल करने की अनुमति नहीं देते हैं जो iota(product(axes)) के बराबर हो; इस मामले में, डिवाइस आईडी की सूची को शामिल नहीं किया जाना चाहिए.
- अगर ऐक्सिस का कुल साइज़ 1 है, तब भी यह मैक्सिमल-शार्डिंग मेश नहीं है.
यहां मेश के कुछ उदाहरण दिए गए हैं:
- खाली मेश, प्लेसहोल्डर मेश को दिखाता है. इसे प्रोपगेशन के दौरान बदला जा सकता है: <[]>
- ऐक्सिस की सूची के बिना एक मेश और एक नॉन-नेगेटिव डिवाइस आईडी, जो कि मैक्सिमल-शार्डिंग मेश है: <[], 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_idsiota(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में उन फ़ैक्टर के इंडेक्स होते हैं जिनके लिए collective-permute की ज़रूरत होती है. ऐसा तब होता है, जब उन्हें शार्ड किया जाता है. जैसे, पैड ऑपरेशन में पैडिंग डाइमेंशन.- अन्य सभी फ़ैक्टर को पास-थ्रू फ़ैक्टर माना जाता है. इसका मतलब है कि अगर सभी टेंसर में एक ही तरीके से शार्ड किया जाता है, तो इन फ़ैक्टर के लिए किसी भी तरह के कम्यूनिकेशन की ज़रूरत नहीं होती.
blocked_propagation_factors में वे फ़ैक्टर शामिल होते हैं जिनके हिसाब से शार्डिंग को आगे बढ़ाने की अनुमति नहीं होती. यह फ़ैक्टर टाइप के ऑर्थोगोनल है. जैसे,
ब्लॉक किए गए प्रोपगेशन फ़ैक्टर, किसी भी तरह के फ़ैक्टर हो सकते हैं.
is_custom_rule से पता चलता है कि यह उपयोगकर्ता की ओर से तय किया गया नियम है या नहीं. उपयोगकर्ता, अपने कस्टम कॉल के लिए शार्डिंग के नियम तय कर सकते हैं. इसके अलावा, वे स्टैंडर्ड ऑपरेशन के लिए पहले से तय किए गए शार्डिंग के नियमों को बदल सकते हैं. कस्टम नियम को हमेशा सेव किया जाता है/कभी नहीं हटाया जाता.
चुनौतियां:
- ऑपरेंड/नतीजे के मैपिंग की संख्या, ऑप के ऑपरेंड/नतीजों की संख्या से मेल खानी चाहिए.
- कम से कम एक मैपिंग मौजूद है. ऐसा नहीं हो सकता कि किसी ऐसे ऑपरेटर के लिए नियम बनाया गया हो जिसके कोई ऑपरेंड/नतीजे न हों.
- हर
TensorMappingAttrकी रैंक, उससे जुड़े टेंसर टाइप की रैंक से मेल खाती है. - फ़ैक्टर के हर ग्रुप (
reduction_factors,need_replication_factors,permutation_factors) के लिए:- एलिमेंट, [0,
$factor_sizes] की सीमा में होने चाहिए. - हर ग्रुप और सभी ग्रुप में, फ़ैक्टर इंडेक्स डुप्लीकेट नहीं होने चाहिए.
- एलिमेंट, [0,
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| factor_sizes | ::llvm::ArrayRef<int64_t> |
इस नियम में शामिल सभी फ़ैक्टर के साइज़ |
| operand_mappings | ::llvm::ArrayRef<TensorMappingAttr> |
ऑपरेंड मैपिंग |
| result_mappings | ::llvm::ArrayRef<TensorMappingAttr> |
नतीजे की मैपिंग |
| reduction_factors | ::llvm::ArrayRef<int64_t> |
ऐसे फ़ैक्टर जिनमें कमी करना ज़रूरी है |
| need_replication_factors | ::llvm::ArrayRef<int64_t> |
ऐसे फ़ैक्टर जिनके लिए पूरी तरह से रेप्लिकेशन करना ज़रूरी है |
| permutation_factors | ::llvm::ArrayRef<int64_t> |
ऐसे फ़ैक्टर जिनके लिए collective-permute की ज़रूरत होती है |
| blocked_propagation_factors | ::llvm::ArrayRef<int64_t> |
ऐसे फ़ैक्टर जिनके हिसाब से शार्डिंग नहीं की जाती |
| is_custom_rule | bool |
यह नियम stablehlo.custom_call के लिए है या नहीं |
PropagationEdgesAttr
प्रॉपगेशन के सभी चरणों के लिए, एज मेटाडेटा का प्रॉपगेशन.
सिंटैक्स:
#sdy.propagation_edges<
::llvm::ArrayRef<PropagationOneStepAttr> # value
>
किसी वैल्यू के लिए, हर ऐक्सिस के हिसाब से आगे बढ़ने की जानकारी की सूची. इसे चरण के इंडेक्स के हिसाब से ग्रुप किया जाता है.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| मान | ::llvm::ArrayRef<PropagationOneStepAttr> |
PropagationOneStepAttr
हर चरण के लिए, मेटाडेटा को आगे बढ़ाने की जानकारी.
सिंटैक्स:
#sdy.propagation_one_step<
int64_t, # step_index
::llvm::ArrayRef<AxisToPropagationDetailsAttr> # axis_entries
>
प्रोपैगेशन के एक चरण के लिए, सभी ऐक्सिस के लिए प्रोपैगेशन की जानकारी.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| step_index | int64_t |
स्टेप इंडेक्स |
| axis_entries | ::llvm::ArrayRef<AxisToPropagationDetailsAttr> |
प्रॉपगेशन के हर फ़ैसले के हिसाब से ऐक्सिस के प्रॉपर्टीगेशन की जानकारी |
SubAxisInfoAttr
इस सब-ऐक्सिस को पूरे ऐक्सिस से कैसे निकाला जाता है, इस बारे में जानकारी
सिंटैक्स:
#sdy.sub_axis_info<
int64_t, # pre_size
int64_t # size
>
जब किसी पूरे ऐक्सिस को n सब-ऐक्सिस में बांटा जाता है, तो ऐक्सिस को [k_1,...,k_n] में बदल दिया जाता है. साथ ही, i-वें सब-ऐक्सिस को, उसके बाईं ओर मौजूद सभी ऐक्सिस के साइज़ m=prod(k_1,...,k_(i-1)) (इसे प्री-साइज़ भी कहा जाता है) और साइज़ k_i के प्रॉडक्ट के तौर पर दिखाया जा सकता है. इसलिए, sub-axis-info एट्रिब्यूट में ये दो नंबर होते हैं और इसे इस तरह दिखाया जाता है: प्री-साइज़ m और साइज़ k के लिए (m)k.
चुनौतियां:
pre-sizeकी वैल्यू कम से कम 1 होनी चाहिए.sizeकी वैल्यू 1 से ज़्यादा है.pre-sizeको पूरे ऐक्सिस के साइज़ को बांटना चाहिए.इसका मतलब है किpre-sizeऔरsize, दोनों को पूरे ऐक्सिस के साइज़ को बांटना चाहिए. साथ ही, सब-ऐक्सिस पूरे ऐक्सिस से आगे नहीं जाना चाहिए.- सब-ऐक्सिस का साइज़, उससे जुड़े पूरे ऐक्सिस के साइज़ के बराबर नहीं है. ऐसे में, पूरे ऐक्सिस का इस्तेमाल किया जाना चाहिए.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| 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
`sum` | `max` | `min` # reduction_op
>
टेंसर शार्डिंग, किसी खास मेश से बंधी होती है. साथ ही, यह सिर्फ़ उस मेश के ऐक्सिस के नामों का रेफ़रंस दे सकती है. डाइमेंशन शार्डिंग से हमें पता चलता है कि टेंसर के हर डाइमेंशन के लिए, किन ऐक्सिस (या सब-ऐक्सिस) के हिसाब से इसे मेजर से माइनर तक शार्ड किया गया है. डाइमेंशन को शेयर न करने वाले अन्य सभी ऐक्सिस को, या तो परोक्ष रूप से या प्रत्यक्ष रूप से (अगर वे दोहराए गए ऐक्सिस की सूची में दिखते हैं) दोहराया जाता है.
ध्यान दें कि किसी टेंसर पर कोई शार्डिंग एट्रिब्यूट न होने का मतलब है कि टेंसर शार्डिंग पूरी तरह से खुली है.
जिस मेश से यह शार्डिंग जुड़ी है उसे किसी सिंबल के नाम से तय किया जा सकता है. इसके लिए, उससे जुड़े MeshOp सिंबल का रेफ़रंस दिया जाता है. इसके अलावा, MeshAttr को इनलाइन भी किया जा सकता है.
शार्डिंग में ऐसे ऐक्सिस हो सकते हैं जिनमें कमी नहीं की गई है. इन्हें unreduced_axes से तय किया जाता है. इसका मतलब है कि इन ऐक्सिस के हिसाब से, टेंसर में कमी नहीं की गई है. उदाहरण के लिए, अगर matmul का कॉन्ट्रैक्टिंग डाइमेंशन, lhs और rhs दोनों में x ऐक्सिस के साथ शार्ड किया गया है, तो नतीजे को x के साथ कम नहीं किया जाता. अनरिड्यूस्ड ऐक्सिस के साथ-साथ, टेंसर पर all-reduce लागू करने से, टेंसर उन ऐक्सिस के साथ रेप्लिकेट हो जाएगा.
हालांकि, कम किए गए ऐक्सिस वाले टेंसर को तुरंत पूरी तरह से कम करने की ज़रूरत नहीं होती. इसे stablehlo.add जैसे लीनियर ऑपरेशन में पास करने पर, कम नहीं किया जा सकता. हालांकि, बाद में इसे पूरी तरह से कम किया जा सकता है. हम मानते हैं कि कटौती का टाइप sum है. आने वाले समय में, अन्य कटौतियों के लिए सहायता उपलब्ध कराई जा सकती है.
चुनौतियां:
dim_shardingsमें मौजूद एलिमेंट,DimensionShardingAttrमें दी गई शर्तों के मुताबिक होने चाहिए.replicated_axesमें मौजूद एलिमेंट,AxisRefListAttrमें दी गई शर्तों के मुताबिक होने चाहिए.unreduced_axesमें मौजूद एलिमेंट,AxisRefListAttrमें दी गई शर्तों के मुताबिक होने चाहिए.- अगर इससे जुड़ा टेंसर टाइप
ShapedTypeनहीं है, तो शार्डिंग की रैंक 0 होनी चाहिए और इसमें कोई भी दोहराया गया ऐक्सिस नहीं होना चाहिए. - अगर यह
ShapedTypeहै, तो:- टेंसर की कोई रैंक होनी चाहिए.
- डाइमेंशन शार्डिंग की संख्या, टेंसर की रैंक के बराबर होती है.
- साइज़ 0 के डाइमेंशन को शार्ड नहीं किया जाता.
dim_shardings,replicated_axes, औरunreduced_axesमें, एक-दूसरे से ओवरलैप होने वाले डुप्लीकेट ऐक्सिस-रेफ़रंस या सब-ऐक्सिस मौजूद नहीं हैं.replicated_axesऔरunreduced_axesमें मौजूद आइटम,mesh_or_refके हिसाब से क्रम में लगाए जाते हैं (AxisRefAttr::getMeshComparatorदेखें).
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| mesh_or_ref | ::mlir::Attribute |
मेश एट्रिब्यूट या फ़्लैट मेश सिंबल के रेफ़रंस एट्रिब्यूट |
| dim_shardings | ::llvm::ArrayRef<DimensionShardingAttr> |
डाइमेंशन की शार्डिंग |
| replicated_axes | ::llvm::ArrayRef<AxisRefAttr> |
ऐक्सिस के रेफ़रंस |
| unreduced_axes | ::llvm::ArrayRef<AxisRefAttr> |
ऐक्सिस के रेफ़रंस |
| reduction_op | ::mlir::sdy::ReductionOp |
ReductionOp टाइप की सूची |
TensorShardingPerValueAttr
किसी ऑप के हर ऑपरेंड/नतीजे के हिसाब से टेंसर शार्डिंग
सिंटैक्स:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
TensorShardingAttr की सूची. इसमें हर ऑपरेंड/ऑपरेशन के नतीजे के लिए एक होता है.
चुनौतियां:
shardingsमें मौजूद एलिमेंट,TensorShardingAttrकी शर्तों को पूरा करते हों.
पैरामीटर:
| पैरामीटर | C++ टाइप | ब्यौरा |
|---|---|---|
| शार्डिंग | ::llvm::ArrayRef<TensorShardingAttr> |
हर वैल्यू के हिसाब से शार्डिंग |
Enums
EdgeNodeType
Edge node type enum
केस:
| चिह्न | वैल्यू | स्ट्रिंग |
|---|---|---|
| OPERAND | 0 |
ऑपरेंड |
| RESULT | 1 |
नतीजा |
PropagationDirection
Propagation direction enum
केस:
| चिह्न | वैल्यू | स्ट्रिंग |
|---|---|---|
| कोई नहीं | 0 |
कोई नहीं |
| FORWARD | 1 |
FORWARD |
| BACKWARD | 2 |
BACKWARD |
| दोनों | 3 |
दोनों |
ReductionOp
Reduction op enum
केस:
| चिह्न | वैल्यू | स्ट्रिंग |
|---|---|---|
| SUM | 0 |
सम करें |
| MAX | 1 |
अधिकतम |
| MIN | 2 |
मिनट |