শার্ডি (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 উভয়ই একটি টেনসরের সাথে একটি শার্ডিং সংযুক্ত করে। তাদের জীবনকাল হল:
- শার্ডিং প্রচারের আগে, ব্যবহারকারীদের দ্বারা ShardingConstraintOp যোগ করা হয়।
- Sharding প্রচার ShardingConstraintOp গ্রাস করে। শার্ডিং প্রচারের ফলাফলে কোন Sharding ConstraintOp নেই। পরিবর্তে, প্রয়োজন হলে ReshardOp যোগ করা যেতে পারে।
- একজন বিভাজনকারী একটি 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 | উভয় |