لهجة 'sdy'

لهجة "شردي" (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 عملية تقسيم بموتر. عمرها الافتراضي هو:

  1. قبل نشر عملية التقسيم، يضيف المستخدمون ShardingConstraintOp.
  2. يستهلك نشر التقسيم ShardingConstraintOp. لا يتوفّر ShardingConstraintOp في نتائج نشر التقسيم. بدلاً من ذلك، يمكن إضافة ReshardOp إذا لزم الأمر.
  3. يحوّل أداة التقسيم عملية 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].
    • عدم تكرار مؤشرات العوامل ضمن كل مجموعة وبين المجموعات

المَعلمات:

المَعلمة نوع 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 دقيقة