لهجة 'sdy'

تحدِّد لهجة Shardy (SDY) تمثيلًا لتحليل مصفوفات كثيفة يستند إلى المحاور ومكونات إضافية لواجهة برمجة التطبيقات لإرفاق عمليات التحليل بالمصفوفات.

العمليات

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

السمات:

السمةنوع 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)

انتقِل إلى منطقة مكتوبة بدلًا من الرمز المحلي لكل جهاز باستخدام ميزة "المجموعات النموذجية"

الجسم محلي بالنسبة إلى المحاور اليدوية. سيتمّ النشر من خلال الجسم على أيّ محاور مجانية، أيّ المحاور غير المُدرَجة في قائمة manual_axes.

السمات: 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، مع تكرار/نسخ نص الوظيفة المُسمّاة في نص 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 تعني أنّه لا يمكن تقسيم البيانات إلا من الم Operand إلى النتيجة.
  • تعني BACKWARD أنّ الأجزاء لا يمكن أن تتدفق إلا من النتيجة إلى المعامل.
  • تعني NONE أنّه لا يمكن نشر أي تقسيم من خلال هذه العملية.
  • لا يمكن تحديد BOTH، لأنّ هذا الإجراء سيكون زائداً.

السمات: AlwaysSpeculatableImplTrait وElementwise وSameOperandsAndResultType

الواجهات: ConditionallySpeculatable وInferTypeOpInterface وNoMemoryEffect (MemoryEffectOpInterface)

التأثيرات: MemoryEffects::Effect{}

السمات:

السمةنوع MLIRالوصف
allowed_direction::mlir::sdy::PropagationDirectionAttrتعداد اتجاه الانتشار

الشركاء:

المُعامل الوصف
input مصفوفة مرتبة لأي نوع من القيم

النتائج:

النتيجة الوصف
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 في نتائج أداة التقسيم.

// TODO(b/331680067). أضِف نمطًا لتوحيد البيانات لإزالة عمليات // reshard المتكرّرة.

السمات: AlwaysSpeculatableImplTrait وElementwise وSameOperandsAndResultType

الواجهات: ConditionallySpeculatable وInferTypeOpInterface وNoMemoryEffect (MemoryEffectOpInterface)

التأثيرات: MemoryEffects::Effect{}

السمات:

السمةنوع MLIRالوصف
sharding::mlir::sdy::TensorShardingAttrتقسيم المتّجه

المَعلمات:

المُعامل الوصف
input مصفوفة من قيم أي نوع

النتائج:

النتيجة الوصف
result مصفوفة من قيم أي نوع

sdy.return (sdy::ReturnOp)

تنهي عملية sdy.return المناطق المرتبطة بالعمليات المستندة إلى منطقة sdy وأي عمليات أخرى مستندة إلى منطقة Sharpy. وهي دالة مختلفة: يتم استخدام قائمة قيم كوسيطات في قائمة من القيم (ولكن من النوع نفسه، مثل 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)

تُرفِق هذه الدالة عملية تقسيم إلى مصفوفة وسيطة (مثل نتيجة matmul) للإشارة إلى أنّ هذه هي الطريقة التي يجب بها تقسيم هذه المصفوفة أو مجموعة فرعية من استخداماتها.

إذا كانت عملية التجزئة تحتوي على سمات مفتوحة ومحورَين غير مقيّدين، يعني ذلك أنّه يمكن تقسيم المتجه بشكل أكبر على طول السمات المفتوحة.

يمكن لهذه العملية:

  • لا يكون لها أي استخدامات (غير مرتبطة) - ما يعني أنّ التقسيم المرفق هو الطريقة التي يجب بها تقسيم ملف tensor للدخل نفسه.
  • أن يكون لها استخدامات: ويعني ذلك أنّ التقسيم المرفق هو الطريقة التي يجب تقسيم استخدامات عملية قيد التقسيم بها، في حين أنّ استخدامات ناقلات المصفوفات المدخلة الأخرى قد يكون لها تقسيم مختلف (إذا لم تكن ناقلات المصفوفات المدخلة لها استخدامات أخرى، يكون السلوك هو نفسه في حالة عدم توفّر أي استخدامات).

السمات: 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 الاسم
sub_axis_info SubAxisInfoAttr

DimMappingAttr

قائمة بمؤشرات العوامل لسمة معيّنة

يجب أن تكون جميع فهارس العوامل في النطاق [0، num_factors)، وتشير القائمة الفارغة إلى أنّ هذا تعيين فارغ (يتم تحليل/طباعة باستخدام *)، أي أن البُعد لم يتم ربطه بأي عوامل.

المَعلمات:

المَعلمة نوع C++ الوصف
factor_indices ::llvm::ArrayRef<int64_t>

DimensionShardingAttr

تقسيم السمات

قائمة بأسماء المحاور المطلوب تقسيمها من كبير إلى صغير، وقيمة منطقية تشير إلى ما إذا كان من الممكن تقسيم البعد، وعدد صحيح اختياري يشير إلى أولوية تقسيم هذا البعد، وسيتم أخذه في الاعتبار أثناء عملية النشر على التجزئة. تنشأ الأولويات من التعليقات التوضيحية التي يقسم المستخدم إلى أجزاء وتشير القيمة الأقل إلى أولوية أعلى. يتم الافتراض أنّه يتم استخدام أعلى أولوية عندما لا تكون الأولوية متوفّرة في التعليق التوضيحي.

المَعلمات:

المَعلمة نوع C++ الوصف
المحوران في الرسم البياني ::llvm::ArrayRef<AxisRefAttr> قائمة بمراجع المحاور
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
>

تحدد قاعدة التقسيم كيف يمكن تقسيم عملية ما وفقًا لخصائص مختلفة على op - أي سمات وشكل المعاملات وشكل النتائج، وما إلى ذلك. على سبيل المثال:

%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. لا يعرف أداة التقسيم كيفية تقسيم هذه العمليات، لذا على المستخدم إعلامها بذلك. عندما تكون قاعدة مخصصة، يتم الاحتفاظ بالقاعدة دائمًا/لا تتم إزالتها أبدًا. لا يمكن ضبط is_custom_rule على true إلا لعمليات stablehlo.custom_call.

المَعلمات:

المَعلمة نوع C++ الوصف
factor_sizes ::llvm::ArrayRef<int64_t>
operand_mappings ::llvm::ArrayRef<TensorMappingAttr>
result_mappings ::llvm::ArrayRef<TensorMappingAttr>
is_custom_rule bool

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)) (أي الحجم المسبق) وحجمه. وبالتالي، تحتوي سمة معلومات المحور الفرعي على هذين الرقمين ويتم تمثيلها على النحو التالي: (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 سمة الشبكة أو سمة مرجع رمز الشبكة المسطّحة
dim_shardings ::llvm::ArrayRef<DimensionShardingAttr>
replicated_axes ::llvm::ArrayRef<AxisRefAttr> قائمة بمراجع المحاور

TensorShardingPerValueAttr

تقسيم المتّجه لكلّ عامل تشغيل/نتيجة لعملية تشغيل

البنية:

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

المَعلمات:

المَعلمة نوع C++ الوصف
عمليات التقسيم ::llvm::ArrayRef<TensorShardingAttr>

عمليات التعداد

PropagationDirection

تعداد اتجاه الانتشار

الحالات:

الرمز القيمة سلسلة
لم يتم اختيار لون 0 لم يتم اختيار لون
FORWARD 1 FORWARD
BACKWARD 2 BACKWARD
كلاهما 3 كلاهما