لهجة "شردي" (SDY)
تحدّد لغة Shardy (SDY) تمثيلاً لتجزئة الموتر المستندة إلى المحور، بالإضافة إلى مكوّنات إضافية لواجهة برمجة التطبيقات لربط عمليات التجزئة بالموتّرات.
Version log: 0.0.1: Add unreduced axes to 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)
تنفيذ عملية all-reduce على طول المحاور
البنية:
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 | تعداد عمليات الحدّ |
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)
لكل مجموعة (محاور، src_dim، tgt_dim) في قائمة المَعلمات، تقسّم هذه العملية أجزاء من متّجه متعدّد الأبعاد على طول السمة tgt_dim والمحاور المحدّدة في axes، وتوزّع هذه الأجزاء على طول المحاور، ثم تدمجها على طول السمة src_dim.
هذه العملية هي في الأساس مزيج من عملية all-gather على طول src_dim وaxes، تليها عملية all-slice على طول 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تصاعديًا في جميع المَعلمات.
- يجب أن تستوفي العناصر في
- يؤدي نقل
axesمنsrc_dimإلىtgt_dimفي تقسيم المعامل إلى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)
العملية الثابتة
تُنشئ هذه الدالة موتر output من قيمة ثابتة value.
يُرجى الاطّلاع على: 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 بين المصدرَين 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، يكون ذلك بمثابة جسر من وسيطة 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. سيتم الانتشار من خلال الجسم على أي محاور حرة، أي المحاور غير المدرَجة في قائمة 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.
يجب أن يكون نوع كل وسيط من وسائط الحظر والقيم المعروضة في المنطقة هو نفسه نوع المعامِلات ونوع النتائج للعملية.
مثال:
%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 | تعداد اتجاه الانتشار |
المعاملات:
| المُعامل | الوصف |
|---|---|
input |
متّجه متعدّد الأبعاد مرتّب من أي قيم غير رمزية |
النتائج:
| النتيجة | الوصف |
|---|---|
result |
متّجه متعدّد الأبعاد مرتّب من أي قيم غير رمزية |
sdy.reduce_scatter (sdy::ReduceScatterOp)
تنفيذ عملية reduce-scatter على طول المحاور
البنية:
operation ::= `sdy.reduce_scatter` ($reduction_op^)? $reduce_scatter_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
يقلّل أجزاء من موتر على طول المحاور المحدّدة في reduce_scatter_axes، ثم يوزّع النتيجة على طول المحاور نفسها. هذه العملية هي في الأساس مزيج من sdy.all_reduce متبوعًا بـ sdy.all_slice على طول reduce_scatter_axes نفسه.
القيود:
- يجب استيفاء القيود الواردة في
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 | تعداد عمليات الحدّ |
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)، حيث يتم تطبيق all-gather وsharded-to-unreduced وall-reduce على المحاور نفسها.
مثال:
%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)
تُرفق عملية التقسيم إلى أجزاء بمتّجه متعدّد الأبعاد وسيط (مثل نتيجة عملية ضرب المصفوفات) للإشارة إلى أنّ هذه هي الطريقة التي يجب بها تقسيم هذا المتّجه متعدّد الأبعاد أو مجموعة فرعية من استخداماته.
إذا كان التقسيم إلى أجزاء يتضمّن سمات مفتوحة ومحاور غير مقيّدة، يعني ذلك أنّه يمكن تقسيم المتّجه متعدّد الأبعاد بشكل أكبر على طول السمات المفتوحة.
يمكن أن تكون هذه العمليّة أيًا مما يلي:
- ألا يكون لها استخدامات (معلّقة)، ما يعني أنّ التقسيم المرفق هو الطريقة التي يجب بها تقسيم موتر الإدخال نفسه.
- يحتوي على استخدامات، ما يعني أنّ التقسيم المرفق هو الطريقة التي يجب أن يتم بها تقسيم استخدامات عملية قيود التقسيم، بينما قد يكون للاستخدامات الأخرى لموتر الإدخال تقسيم مختلف (إذا لم يكن لموتر الإدخال استخدامات أخرى، سيكون السلوك هو نفسه كما في حالة عدم وجود استخدامات).
السمات: 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> |
axis refs |
| 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_idsالأصلي هوiota(product(axis_sizes))، وسيكونdevice_idsالمرتب هوiota(product(axis_sizes)).
- يجب ألّا تحتوي العناصر في
المَعلمات:
| المَعلمة | نوع C++ | الوصف |
|---|---|---|
| المحاور | ::llvm::ArrayRef<MeshAxisAttr> |
محاور الشبكة |
| device_ids | ::llvm::ArrayRef<int64_t> |
ترتيب الأجهزة بشكل صريح أو الحد الأقصى لمعرّف الجهاز |
MeshAxisAttr
المحور المسمّى في شبكة
البنية:
#sdy.mesh_axis<
::llvm::StringRef, # name
int64_t # size
>
المَعلمات:
| المَعلمة | نوع C++ | الوصف |
|---|---|---|
| الاسم | ::llvm::StringRef |
الاسم |
| الحجم | int64_t |
حجم هذا المحور |
OpShardingRuleAttr
تحدّد هذه السمة كيفية تقسيم عملية ما.
البنية:
#sdy.op_sharding_rule<
::llvm::ArrayRef<int64_t>, # factor_sizes
::llvm::ArrayRef<TensorMappingAttr>, # operand_mappings
::llvm::ArrayRef<TensorMappingAttr>, # result_mappings
::llvm::ArrayRef<int64_t>, # reduction_factors
::llvm::ArrayRef<int64_t>, # need_replication_factors
::llvm::ArrayRef<int64_t>, # permutation_factors
::llvm::ArrayRef<int64_t>, # blocked_propagation_factors
bool # is_custom_rule
>
تحدّد قاعدة التقسيم كيف يمكن تقسيم عملية معيّنة وفقًا لخصائص مختلفة في العملية، مثل أي سمات وشكل المعامِلات وشكل النتائج وما إلى ذلك. على سبيل المثال:
%0 = stablehlo.add %arg0, %arg1 {
sdy.sharding_rule = #sdy.op_sharding_rule<
([i, j],[i, j])->([i, j])
{i=8, j=8}>
} : tensor<8x8xf32>
%1 = stablehlo.dot_general %arg2, %arg3, contracting_dims = [1] x [0] {
sdy.sharding_rule = #sdy.op_sharding_rule<
([i, k],[k, j])->([i, j])
{i=8, j=16, k=8}>
}: (tensor<8x8xf32>, tensor<8x16xf32>) -> tensor<8x16xf32>
يُرجى العِلم أنّنا نسمح بعوامل ذات حجم 1 على الرغم من أنّه لا يمكن تقسيمها، ويعود ذلك بشكل أساسي إلى الاكتمال، إذ إنّ العديد من العمليات، مثل العمليات النقطية، تتضمّن سمات ذات حجم واحد تتوافق مع المعامِلات والنتائج.
أنواع العوامل:
- يحتوي
reduction_factorsعلى فهارس العوامل التي تتطلّب تقليلًا، مثل أبعاد التعاقد في عملية نقطية. ويمكن أن تكون هذه العوامل في المعامِلات ولكن ليس في النتائج. - تحتوي
need_replication_factorsعلى فهارس العوامل التي تتطلّب تكرارًا كاملاً، مثل السمة التي تمّ ترتيبها في عملية ترتيب. - تحتوي
permutation_factorsعلى فهارس العوامل التي تتطلّب 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)) (المعروف أيضًا باسم pre-size) والحجم
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)، ما يعني أنّ الموتر غير مخفَّض على طول هذه المحاور. على سبيل المثال، إذا تم تقسيم بُعد التعاقد في عملية ضرب المصفوفات على المحور x في كل من الجانب الأيسر والجانب الأيمن، لن يتم تقليل النتيجة على المحور x. سيؤدي تطبيق عملية all-reduce على الموتر على طول المحاور غير المخفَّضة إلى تكرار الموتر على طول هذه المحاور.
ومع ذلك، ليس من الضروري إجراء عملية تقليل شاملة على متّجه متعدّد الأبعاد يتضمّن محاور غير مخفَّضة على الفور، بل يمكن أن يظل غير مخفَّض عند تمريره إلى عمليات خطية مثل stablehlo.add (طالما أنّ كلتا الجهتين اليسرى واليمنى غير مخفَّضتين)، ثم يتم إجراء عملية تقليل شاملة عليه بعد ذلك. نفترض أنّ نوع التخفيض هو "المجموع"، وقد نتيح أنواعًا أخرى من التخفيضات في المستقبل.
القيود:
- يجب أن تستوفي العناصر في
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> |
axis refs |
| unreduced_axes | ::llvm::ArrayRef<AxisRefAttr> |
axis refs |
| reduction_op | ::mlir::sdy::ReductionOp |
تعداد من النوع ReductionOp |
TensorShardingPerValueAttr
تقسيم Tensor إلى أجزاء لكل عامل/نتيجة عملية
البنية:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
قائمة TensorShardingAttr، واحدة لكل عامل أو نتيجة عملية
القيود:
- يجب أن تستوفي العناصر في
shardingsقيودTensorShardingAttr.
المَعلمات:
| المَعلمة | نوع C++ | الوصف |
|---|---|---|
| التقسيم إلى أجزاء | ::llvm::ArrayRef<TensorShardingAttr> |
التقسيم حسب القيمة |
عمليات التعداد
EdgeNodeType
تعداد نوع عُقدة الحافة
الحالات:
| الرمز | القيمة | سلسلة |
|---|---|---|
| OPERAND | 0 |
المعامل |
| النتيجة | 1 |
نتيجة |
PropagationDirection
تعداد اتجاه الانتشار
الحالات:
| الرمز | القيمة | سلسلة |
|---|---|---|
| لم يتم اختيار لون | 0 |
لم يتم اختيار لون |
| FORWARD | 1 |
FORWARD |
| رجوع | 2 |
رجوع |
| BOTH | 3 |
BOTH |
ReductionOp
تعداد عمليات الحدّ من البيانات
الحالات:
| الرمز | القيمة | سلسلة |
|---|---|---|
| SUM | 0 |
الجمع |
| الحد الأقصى | 1 |
الحد الأقصى |
| MIN | 2 |
دقيقة |