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