'sdy' উপভাষা

শার্ডি (SDY) উপভাষা একটি অক্ষ-ভিত্তিক টেনসর শার্ডিং উপস্থাপনা এবং অতিরিক্ত API উপাদানগুলিকে সংজ্ঞায়িত করে যাতে টেনসরগুলিতে শার্ডিংগুলি সংযুক্ত করা যায়।

অপারেশন

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

গুণাবলী:

বৈশিষ্ট্য 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)

স্পষ্ট সমষ্টি সহ প্রতি-ডিভাইস স্থানীয় কোডের পরিপ্রেক্ষিতে লিখিত একটি অঞ্চলে ঝাঁপ দাও, যেখানে যৌক্তিক আকারগুলি স্থানীয় প্রতি-ডিভাইস ভৌত বাফার আকারের সাথে মেলে এবং সমষ্টিগুলি প্রকৃত ক্রস-ডিভাইস যোগাযোগের সাথে হুবহু মিলে যায়।

বডিটি ম্যানুয়াল_অক্ষে স্থানীয়। যেকোন মুক্ত অক্ষে শরীরের মাধ্যমে বংশবিস্তার ঘটবে - যেগুলি ম্যানুয়াল_অক্ষের তালিকায় নেই।

বৈশিষ্ট্য: IsolatedFromAbove , RecursiveMemoryEffects , SingleBlockImplicitTerminator<ReturnOp> , SingleBlock

গুণাবলী:

বৈশিষ্ট্য MLIR প্রকার বর্ণনা
in_shardings ::mlir::sdy::TensorShardingPerValueAttr একটি অপের অপারেন্ড/ফলাফল প্রতি টেনসর শার্ডিং
out_shardings ::mlir::sdy::TensorShardingPerValueAttr একটি অপের অপারেন্ড/ফলাফল প্রতি টেনসর শার্ডিং
manual_axes ::mlir::sdy::ManualAxesAttr

অপারেন্ডস:

অপারেন্ড বর্ণনা
tensors যেকোনো ধরনের মানের র‌্যাঙ্ক করা টেনসরের বৈচিত্র্য

ফলাফল:

ফলাফল বর্ণনা
results যেকোনো ধরনের মানের র‌্যাঙ্ক করা টেনসরের বৈচিত্র্য

sdy.mesh (sdy::MeshOp)

নাম জাল

সিনট্যাক্স:

operation ::= `sdy.mesh` $sym_name `=` $mesh attr-dict

একটি নতুন নামের জাল সংজ্ঞায়িত করে। একটি মডিউলের সমস্ত মেশে অবশ্যই একই সংখ্যক ডিভাইস থাকতে হবে (একটি ডিভাইস_আইডি সহ মেশ ব্যতীত)। জাল হল একটি 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 , ShardableDataFlowOpInterface

গুণাবলী:

বৈশিষ্ট্য MLIR প্রকার বর্ণনা
name ::mlir::StringAttr স্ট্রিং বৈশিষ্ট্য
in_shardings ::mlir::sdy::TensorShardingPerValueAttr একটি অপের অপারেন্ড/ফলাফল প্রতি টেনসর শার্ডিং
out_shardings ::mlir::sdy::TensorShardingPerValueAttr একটি অপের অপারেন্ড/ফলাফল প্রতি টেনসর শার্ডিং

অপারেন্ডস:

অপারেন্ড বর্ণনা
operands যে কোনো ধরনের বৈচিত্র্যময়

ফলাফল:

ফলাফল বর্ণনা
"নামহীন" যে কোনো ধরনের বৈচিত্র্যময়

sdy.propagation_barrier (sdy::PropagationBarrierOp)

প্রচার বাধা অপারেশন

সিনট্যাক্স:

operation ::= `sdy.propagation_barrier` $input `allowed_direction````=```$allowed_direction attr-dict `:` type($input)

এই অপটি একটি আইডেন্টিটি অপের মতো কাজ করে, ইনপুট হিসাবে নেওয়া একই মান আউটপুট করে। কিন্তু বংশবিস্তার পরিপ্রেক্ষিতে, এটি শুধুমাত্র একটি নির্দিষ্ট দিকে প্রবাহিত হওয়ার অনুমতি দেবে।

এটি ব্যারিয়ার অপ এবং এর অপারেন্ডের ফলাফলের ব্যবহারের মধ্যে শার্ডিংগুলিকে প্রচার করা থেকে বাধা দেয়।

  • FORWARD মানে শার্ডিংগুলি শুধুমাত্র অপারেন্ড থেকে ফলাফলে প্রবাহিত হতে পারে।
  • BACKWARD মানে শার্ডিং শুধুমাত্র ফলাফল থেকে অপারেন্ডে প্রবাহিত হতে পারে।
  • NONE মানে কোন শার্ডিং এই অপের মাধ্যমে প্রচার করতে পারে না।
  • BOTH নির্দিষ্ট করা যাবে না, কারণ এই অপশনটি অপ্রয়োজনীয় হবে৷

বৈশিষ্ট্য: AlwaysSpeculatableImplTrait ইমপ্লট্রেট , Elementwise , SameOperandsAndResultType

ইন্টারফেস: ConditionallySpeculatable , InferTypeOpInterface , NoMemoryEffect (MemoryEffectOpInterface)

প্রভাব: MemoryEffects::Effect{}

গুণাবলী:

বৈশিষ্ট্য MLIR প্রকার বর্ণনা
allowed_direction ::mlir::sdy::প্রচার নির্দেশিকা প্রচার দিক enum

অপারেন্ডস:

অপারেন্ড বর্ণনা
input যেকোন ধরনের মানের র‌্যাঙ্ক করা টেনসর

ফলাফল:

ফলাফল বর্ণনা
result যেকোন ধরনের মানের র‌্যাঙ্ক করা টেনসর

sdy.reshard (sdy::ReshardOp)

একটি ভিন্ন শার্ডিং-এ একটি টেনসর পুনরায় শার্ড করে

সিনট্যাক্স:

operation ::= `sdy.reshard` $input $sharding attr-dict `:` type($result)

ইনপুট টেনসরকে নির্দিষ্ট শার্ডিংয়ের সাথে রিশার্ড করে, যা ইনপুট টেনসরের বিদ্যমান শার্ডিং থেকে আলাদা।

ShardingConstraintOp এবং ReshardOp উভয়ই একটি টেনসরের সাথে একটি শার্ডিং সংযুক্ত করে। তাদের জীবনকাল হল:

  1. শার্ডিং প্রচারের আগে, ব্যবহারকারীদের দ্বারা ShardingConstraintOp যোগ করা হয়।
  2. Sharding প্রচার ShardingConstraintOp গ্রাস করে। শার্ডিং প্রচারের ফলাফলে কোন Sharding ConstraintOp নেই। পরিবর্তে, প্রয়োজন হলে ReshardOp যোগ করা যেতে পারে।
  3. একজন বিভাজনকারী একটি ReshardOp কে একটি সমষ্টিগত অপে (বা একটি আইডেন্টিটি অপ) রূপান্তর করে। বিভাজনকারীর ফলাফলে কোন ReshardOp থাকা উচিত নয়।

// TODO(b/331680067)। অপ্রয়োজনীয় // রিশার্ড অপস অপসারণ করতে একটি ক্যানোনিকালাইজেশন প্যাটার্ন যোগ করুন।

বৈশিষ্ট্য: AlwaysSpeculatableImplTrait ইমপ্লট্রেট , Elementwise , SameOperandsAndResultType

ইন্টারফেস: ConditionallySpeculatable , InferTypeOpInterface , NoMemoryEffect (MemoryEffectOpInterface)

প্রভাব: 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)

একটি মধ্যবর্তী টেনসরের সাথে একটি শার্ডিং সংযুক্ত করে (যেমন একটি মাটমুলের ফলাফল) নির্দেশ করে যে এইভাবে সেই টেনসর, বা এর ব্যবহারের একটি উপসেটকে শার্ড করা উচিত।

যদি শার্ডিংয়ের খোলা মাত্রা এবং অনিয়ন্ত্রিত অক্ষ থাকে তবে এর অর্থ হল টেনসরটি খোলা মাত্রা বরাবর আরও শার্ড করা যেতে পারে।

এই অপশনটি হতে পারে:

  • কোন ব্যবহার নেই (ঝুলন্ত) - যার অর্থ সংযুক্ত শার্ডিং হল কিভাবে ইনপুট টেনসর নিজেই শার্ড করা উচিত।
  • ব্যবহার আছে - যার অর্থ সংযুক্ত শার্ডিং হল শার্ডিং সীমাবদ্ধতা অপের ব্যবহারগুলি কীভাবে শার্ড করা উচিত, যখন ইনপুট টেনসরের অন্যান্য ব্যবহারগুলির একটি আলাদা শার্ডিং থাকতে পারে (যদি ইনপুট টেনসরের অন্য কোনও ব্যবহার না থাকে তবে আচরণটি একই রকম কোন ব্যবহারের ক্ষেত্রে)।

বৈশিষ্ট্য: Elementwise , SameOperandsAndResultType

ইন্টারফেস: InferTypeOpInterface

গুণাবলী:

বৈশিষ্ট্য MLIR প্রকার বর্ণনা
sharding ::mlir::sdy::TensorShardingAttr টেনসর শর্ডিং

অপারেন্ডস:

অপারেন্ড বর্ণনা
input যেকোন ধরনের মানের টেনসর

ফলাফল:

ফলাফল বর্ণনা
result যেকোন ধরনের মানের টেনসর

sdy.sharding_group (sdy::ShardingGroupOp)

শেয়ারিং গ্রুপ অপারেশন

সিনট্যাক্স:

operation ::= `sdy.sharding_group` $input `group_id````=```$group_id attr-dict `:` type($input)

এই অপশনটি শার্ডিং গ্রুপগুলিতে টেনসরগুলি বরাদ্দ করার জন্য একটি ইন্টারফেস সরবরাহ করে (টেনসরগুলির গ্রুপ যা অভিন্ন শার্ডিংয়ের জন্য প্রয়োগ করা হবে)। প্রচারের সময়, একটি গোষ্ঠীর উপাদানগুলিকে শার্ড করার সাথে সাথে অন্য সমস্ত সদস্যকে ঠিক একইভাবে শার্ড করা হবে। এই ক্রিয়াকলাপটি আর্গুমেন্ট গ্রুপ আইডি নেয় এবং কোন ফলাফল দেয় না, কিন্তু পরিবর্তে প্রদত্ত আইডি সহ গ্রুপে ইনপুট টেনসর যোগ করতে অভ্যন্তরীণ শার্ডিং গোষ্ঠী উপস্থাপনা পরিবর্তন করে।

গুণাবলী:

বৈশিষ্ট্য MLIR প্রকার বর্ণনা
group_id ::mlir::IntegerAttr 64-বিট সাইনলেস ইন্টিজার অ্যাট্রিবিউট

অপারেন্ডস:

অপারেন্ড বর্ণনা
input যেকোন ধরনের মানের র‌্যাঙ্ক করা টেনসর

গুণাবলী

AxisRefAttr

একটি পূর্ণ অক্ষ বা একটি বিভক্ত উপ-অক্ষের রেফারেন্স

সিনট্যাক্স:

#sdy.axis_ref<
  ::llvm::StringRef,   # name
  SubAxisInfoAttr   # sub_axis_info
>

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
নাম ::llvm::StringRef নাম
উপ_অক্ষ_তথ্য SubAxisInfoAttr

DimMappingAttr

একটি মাত্রার জন্য ফ্যাক্টর সূচকের তালিকা

সমস্ত ফ্যাক্টর সূচকগুলি অবশ্যই [0, num_factors) সীমার মধ্যে থাকতে হবে এবং একটি খালি তালিকা নির্দেশ করে যে এটি একটি নাল ম্যাপিং (এটি * এর সাথে পার্স/মুদ্রিত), অর্থাৎ মাত্রা কোনো ফ্যাক্টরের সাথে ম্যাপ করা হয়নি।

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
ফ্যাক্টর_সূচক ::llvm::ArrayRef<int64_t>

DimensionShardingAttr

ডাইমেনশন শার্ডিং

মেজর থেকে মাইনর পর্যন্ত টেনসরের ডাইমেনশনকে শার্ড করার জন্য অক্ষের নামের তালিকা, একটি বুলিয়ান নির্দেশ করে যে ডাইমেনশনটি আরও শার্ড করা যায় কিনা, এবং একটি ঐচ্ছিক পূর্ণসংখ্যা যা এই ডাইমেনশন শার্ডিংয়ের অগ্রাধিকার নির্দেশ করে, যা শার্ডিং প্রচারের সময় সম্মানিত হবে। অগ্রাধিকারগুলি ব্যবহারকারীর শার্ডিং টীকা থেকে উদ্ভূত হয় এবং একটি নিম্ন মান উচ্চ অগ্রাধিকার নির্দেশ করে৷ টীকাটিতে অগ্রাধিকার অনুপস্থিত থাকলে সর্বোচ্চ অগ্রাধিকার ধরা হয়।

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
অক্ষ ::llvm::ArrayRef<AxisRefAttr> অক্ষ refs তালিকা
is_closed bool
অগ্রাধিকার std::optional<int64_t>

ManualAxesAttr

সিনট্যাক্স:

#sdy.manual_axes<
  ::llvm::ArrayRef<StringAttr>   # value
>

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
মান ::llvm::ArrayRef<StringAttr>

MeshAttr

অক্ষের জাল এবং ডিভাইসের একটি তালিকা

সিনট্যাক্স:

#sdy.mesh<
  ::llvm::ArrayRef<MeshAxisAttr>,   # axes
  ::llvm::ArrayRef<int64_t>   # device_ids
>

একটি জাল হল অক্ষগুলির একটি তালিকা এবং ডিভাইস আইডিগুলির একটি ঐচ্ছিক তালিকা যা ডিভাইসের ক্রম নির্দেশ করে৷

যদি অক্ষগুলির তালিকা খালি থাকে, জালের আকার 1 এর একটি অন্তর্নিহিত নামহীন অক্ষ রয়েছে৷ এই ক্ষেত্রে, যদি একটি ডিভাইস আইডি তালিকা প্রদান করা না হয়, অন্তর্নিহিত ডিভাইস আইডি তালিকাটি হল [0]; যদি একটি ডিভাইস আইডি তালিকা প্রদান করা হয়, এতে অবশ্যই কোনো অ-নেতিবাচক মানের একটি একক পূর্ণসংখ্যা থাকতে হবে। আমরা এই ম্যাক্সিমাল-শার্ডিং কেসকে কল করি।

সমস্ত নন-সর্বোচ্চ-শার্ডিং ক্ষেত্রে, যদি একটি ডিভাইস আইডি তালিকা নির্দিষ্ট করা থাকে, অক্ষের আকারের পণ্যটি ডিভাইসের সংখ্যার সাথে মেলে। যদি একটি ডিভাইস আইডি তালিকা নির্দিষ্ট করা না থাকে, তাহলে অন্তর্নিহিত ডিভাইস আইডি তালিকা হল iota(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]>

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
অক্ষ ::llvm::ArrayRef<MeshAxisAttr>
device_ids ::llvm::ArrayRef<int64_t>

MeshAxisAttr

একটি জাল নামক অক্ষ

সিনট্যাক্স:

#sdy.mesh_axis<
  ::llvm::StringRef,   # name
  int64_t   # size
>

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
নাম ::llvm::StringRef নাম
আকার int64_t

OpShardingRuleAttr

কিভাবে একটি অপারেশন পার্টিশন করা যেতে পারে তা নির্দিষ্ট করে।

সিনট্যাক্স:

#sdy.op_sharding_rule<
  ::llvm::ArrayRef<int64_t>,   # factor_sizes
  ::llvm::ArrayRef<TensorMappingAttr>,   # operand_mappings
  ::llvm::ArrayRef<TensorMappingAttr>,   # result_mappings
  bool   # is_custom_rule
>

একটি শার্ডিং নিয়ম নির্দিষ্ট করে যে কীভাবে একটি অপারেশনকে অপের বিভিন্ন বৈশিষ্ট্য অনুসারে বিভাজন করা যেতে পারে - যে কোনও বৈশিষ্ট্য, অপারেন্ডের আকার, ফলাফলের আকৃতি ইত্যাদি। উদাহরণস্বরূপ:

%0 = stablehlo.add %arg0, %arg1 {
    sdy.sharding_rule = #sdy.op_sharding_rule<
        ([i, j],[i, j])->([i, j])
        {i=8, j=8}>
} : tensor<8x8xf32>
%1 = stablehlo.dot_general %arg2, %arg3, contracting_dims = [1] x [0] {
  sdy.sharding_rule = #sdy.op_sharding_rule<
      ([i, k],[k, j])->([i, j])
      {i=8, j=16, k=8}>
}: (tensor<8x8xf32>, tensor<8x16xf32>) -> tensor<8x16xf32>

মনে রাখবেন যে আমরা আকার 1 এর ফ্যাক্টরকে অনুমতি দিই যদিও সেগুলিকে শার্ড করা যায় না, এটি মূলত সম্পূর্ণতার জন্য কারণ পয়েন্টওয়াইজ অপের মতো অনেকগুলি অপারেন্ডের আকার এক মাত্রা থাকে যা অপারেন্ড এবং ফলাফল জুড়ে থাকে।

is_custom_rule বর্ণনা করে যে এটি একটি stablehlo.custom_call op এর জন্য ব্যবহারকারী দ্বারা সংজ্ঞায়িত একটি নিয়ম কিনা। বিভাজনকারী জানেন না কিভাবে এই অপ্সগুলিকে পার্টিশন করতে হয়, তাই একজন ব্যবহারকারীকে অবশ্যই তা জানাতে হবে। যখন এটি একটি কাস্টম নিয়ম হয়, তখন নিয়মটি সর্বদা সংরক্ষণ করা হয়/কখনও সরানো হয় না। is_custom_rule শুধুমাত্র stablehlo.custom_call ops এর জন্য সত্য হতে পারে।

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
ফ্যাক্টর_সাইজ ::llvm::ArrayRef<int64_t>
অপারেন্ড_ম্যাপিং ::llvm::ArrayRef<TensorMappingAttr>
ফলাফল_ম্যাপিং ::llvm::ArrayRef<TensorMappingAttr>
হল_কাস্টম_রুল bool

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।

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
pre_size int64_t
আকার int64_t

TensorMappingAttr

একটি টেনসরের প্রতিটি মাত্রার জন্য ফ্যাক্টর ম্যাপিং।

সিনট্যাক্স:

#sdy.tensor_mapping<
  ::llvm::ArrayRef<DimMappingAttr>   # dim_mappings
>

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
dim_mappings ::llvm::ArrayRef<DimMappingAttr>

TensorShardingAttr

টেনসর শর্ডিং

সিনট্যাক্স:

#sdy.sharding<
  ::mlir::Attribute,   # mesh_or_ref
  ::llvm::ArrayRef<DimensionShardingAttr>,   # dim_shardings
  ::llvm::ArrayRef<AxisRefAttr>   # replicated_axes
>

একটি টেনসর শার্ডিং একটি নির্দিষ্ট জালের সাথে আবদ্ধ, এবং শুধুমাত্র সেই জাল থেকে অক্ষের নাম উল্লেখ করতে পারে। ডাইমেনশন শার্ডিংগুলি টেনসরের প্রতিটি ডাইমেনশনের জন্য আমাদেরকে বলে, কোন অক্ষগুলি (বা সাব-অক্ষ) বরাবর এটি বড় থেকে ছোট পর্যন্ত শার্ড করা হয়েছে। অন্য সমস্ত অক্ষ যেগুলি একটি মাত্রাকে শার্ড করে না সেগুলি হয় নিহিত বা স্পষ্টভাবে (যদি সেগুলি প্রতিলিপিকৃত অক্ষের তালিকায় উপস্থিত হয়) প্রতিলিপি করা হয়৷

এই শার্ডিংটি যে জালটির সাথে আবদ্ধ তা হয় একটি চিহ্নের নাম দ্বারা নির্দিষ্ট করা যেতে পারে, একটি সংশ্লিষ্ট MeshOp চিহ্নকে উল্লেখ করে, অথবা একটি ইনলাইনযুক্ত MeshAttr

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
mesh_or_ref ::mlir::Attribute জাল attr বা সমতল জাল প্রতীক রেফারেন্স attr
dim_shardings ::llvm::ArrayRef<DimensionShardingAttr>
replicated_axes ::llvm::ArrayRef<AxisRefAttr> অক্ষ refs তালিকা

TensorShardingPerValueAttr

একটি অপের অপারেন্ড/ফলাফল প্রতি টেনসর শার্ডিং

সিনট্যাক্স:

#sdy.sharding_per_value<
  ::llvm::ArrayRef<TensorShardingAttr>   # shardings
>

পরামিতি:

প্যারামিটার C++ প্রকার বর্ণনা
শার্ডিংস ::llvm::ArrayRef<TensorShardingAttr>

Enums

প্রচারের দিকনির্দেশনা

প্রচার দিক enum

মামলা:

প্রতীক মান স্ট্রিং
কোনটিই নয় 0 কোনটিই নয়
ফরওয়ার্ড 1 ফরওয়ার্ড
পিছনে 2 পিছনে
উভয় 3 উভয়