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

يوضّح ما يلي دلالات العمليات المحدّدة في واجهة XlaBuilder. عادةً، يتم ربط هذه العمليات بشكل مباشر بالعمليات المحدّدة في واجهة RPC في xla_data.proto.

ملاحظة حول التسمية: يتعامل نوع البيانات العام XLA مع مصفوفة N-dimensional تحتوي على عناصر من نوع موحّد (مثل عدد عشري 32 بت). في جميع أنحاء المستندات، يتم استخدام المصفوفة للإشارة إلى مصفوفة ذات أبعاد عشوائية. وللتسهيل، تحمل الحالات الخاصة أسماء أكثر تحديدًا ومألوفة، فعلى سبيل المثال، المتّجه هو مصفوفة أحادية البُعد، والمصفوفة هي مصفوفة ثنائية البُعد.

يمكنك الاطّلاع على مزيد من المعلومات حول بنية عملية في الأشكال والتصميم والتصميم المتجانب.

Abs

يمكنك الاطّلاع أيضًا على XlaBuilder::Abs.

القيمة المطلقة لكل عنصر x -> |x|

Abs(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - abs.

إضافة

يمكنك الاطّلاع أيضًا على XlaBuilder::Add.

تُجري عملية جمع العناصر المتطابقة في lhs وrhs.

Add(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر خيار بديل يتوافق مع البث بأبعاد مختلفة لعملية الإضافة:

Add(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - add.

AddDependency

يمكنك الاطّلاع أيضًا على HloInstruction::AddDependency.

قد يظهر AddDependency في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

AfterAll

يمكنك الاطّلاع أيضًا على XlaBuilder::AfterAll.

تأخذ الدالة AfterAll عددًا متغيرًا من الرموز المميزة وتنتج رمزًا مميزًا واحدًا. الرموز المميزة هي أنواع أساسية يمكن ربطها بين العمليات التي لها آثار جانبية لفرض الترتيب. يمكن استخدام AfterAll كعنصر ربط بين الرموز المميزة لترتيب عملية بعد مجموعة من العمليات.

AfterAll(tokens)

الوسيطات النوع الدلالات
tokens متّجه XlaOp عدد متغيّر من الرموز المميّزة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - after_all.

AllGather

يمكنك الاطّلاع أيضًا على XlaBuilder::AllGather.

تنفّذ عملية التسلسل على مستوى النسخ المتماثلة.

AllGather(operand, all_gather_dimension, shard_count, replica_groups, channel_id, layout, use_global_device_ids)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة للدمج عبر النسخ المتماثلة
all_gather_dimension int64 سمة التسلسل
shard_count int64 حجم كل مجموعة من النسخ المتماثلة
replica_groups متّجه من متّجهات int64 المجموعات التي يتم إجراء عملية التسلسل بينها
channel_id اختياري ChannelHandle معرّف القناة الاختياري للتواصل بين الوحدات
layout اختياري Layout تنشئ هذه الدالة نمط تخطيط سيتم من خلاله تسجيل التخطيط المطابق في الوسيطة
use_global_device_ids اختياري bool تعرِض هذه الدالة القيمة "صحيح" إذا كانت المعرّفات في إعداد ReplicaGroup تمثّل معرّفًا عامًا.
  • replica_groups هي قائمة بمجموعات النسخ المتماثلة التي يتم إجراء التسلسل بينها (يمكن استرداد معرّف النسخة المتماثلة الحالية باستخدام ReplicaId). يحدّد ترتيب النسخ المتماثلة في كل مجموعة ترتيب المواضع التي تظهر بها المدخلات في النتيجة. يجب أن يكون الحقل replica_groups فارغًا (في هذه الحالة، تنتمي جميع النسخ المتماثلة إلى مجموعة واحدة، ويتم ترتيبها من 0 إلى N - 1)، أو أن يحتوي على عدد العناصر نفسه الذي يحتوي عليه عدد النسخ المتماثلة. على سبيل المثال، تنفّذ replica_groups = {0, 2}, {1, 3} عملية تسلسل بين النسختَين المتطابقتَين 0 و2، و1 و3.
  • shard_count هو حجم كل مجموعة من النسخ المتماثلة. نحتاج إلى ذلك في الحالات التي تكون فيها replica_groups فارغة.
  • يتم استخدام channel_id للتواصل بين الوحدات: يمكن فقط لعمليات all-gather التي لها channel_id نفسها أن تتواصل مع بعضها البعض.
  • use_global_device_ids تعرض القيمة "صحيح" إذا كانت المعرّفات في إعداد ReplicaGroup تمثّل معرّفًا عامًا (replica_id * partition_count + partition_id) بدلاً من معرّف نسخة طبق الأصل. يتيح ذلك تجميع الأجهزة بشكل أكثر مرونة إذا كان هذا التخفيض الشامل على مستوى الأقسام والنسخ المتماثلة.

شكل الناتج هو شكل الإدخال الذي تم تكبيره بمقدار all_gather_dimension مرة.shard_count على سبيل المثال، إذا كان هناك نسختان متطابقتان وكانت قيمة المعامِل [1.0, 2.5] و[3.0, 5.25] على التوالي في النسختين المتطابقتين، ستكون قيمة الناتج من هذه العملية حيث all_gather_dim هي 0، هي [1.0, 2.5, 3.0,5.25] في كلتا النسختين المتطابقتين.

يتم تقسيم واجهة برمجة التطبيقات الخاصة بـ AllGather داخليًا إلى تعليمتَين من تعليمات HLO (AllGatherStart وAllGatherDone).

يمكنك الاطّلاع أيضًا على HloInstruction::CreateAllGatherStart.

تعمل AllGatherStart وAllGatherDone كعناصر أساسية في HLO. قد تظهر هذه العمليات في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - all_gather.

AllReduce

يمكنك الاطّلاع أيضًا على XlaBuilder::AllReduce.

تُجري عملية حسابية مخصّصة على مستوى النسخ المتماثلة.

AllReduce(operand, computation, replica_groups, channel_id, shape_with_layout, use_global_device_ids)

الوسيطات النوع الدلالات
operand XlaOp صفيف أو مجموعة غير فارغة من الصفائف لتقليل عدد النسخ المتماثلة
computation XlaComputation احتساب التخفيض
replica_groups ReplicaGroup متّجه المجموعات التي يتم إجراء عمليات التخفيض بينها
channel_id اختياري ChannelHandle معرّف القناة الاختياري للتواصل بين الوحدات
shape_with_layout اختياري Shape تحدّد هذه السمة تنسيق البيانات المنقولة
use_global_device_ids اختياري bool تعرِض هذه الدالة القيمة "صحيح" إذا كانت المعرّفات في إعداد ReplicaGroup تمثّل معرّفًا عامًا.
  • عندما يكون operand مجموعة من المصفوفات، يتم تنفيذ عملية تقليل الكل على كل عنصر من عناصر المجموعة.
  • replica_groups هي قائمة بمجموعات النسخ المتماثلة التي يتم إجراء عملية التصغير بينها (يمكن استرداد معرّف النسخة المتماثلة الحالية باستخدام ReplicaId). يجب أن تكون replica_groups فارغة (في هذه الحالة، تنتمي جميع النسخ المتماثلة إلى مجموعة واحدة)، أو أن تحتوي على العدد نفسه من العناصر مثل عدد النسخ المتماثلة. على سبيل المثال، تنفّذ replica_groups = {0, 2}, {1, 3} عملية تقليل بين النسختَين المتطابقتَين 0 و2، و1 و3.
  • يتم استخدام channel_id للتواصل بين الوحدات: يمكن فقط لعمليات all-reduce التي لها channel_id نفسها أن تتواصل مع بعضها البعض.
  • shape_with_layout: يفرض تخطيط AllReduce على التخطيط المحدّد. يُستخدَم هذا لضمان التنسيق نفسه لمجموعة من عمليات AllReduce التي تم تجميعها بشكل منفصل.
  • use_global_device_ids تعرض القيمة "صحيح" إذا كانت المعرّفات في إعداد ReplicaGroup تمثّل معرّفًا عامًا (replica_id * partition_count + partition_id) بدلاً من معرّف نسخة طبق الأصل. يتيح ذلك تجميع الأجهزة بشكل أكثر مرونة إذا كان هذا التخفيض الشامل على مستوى الأقسام والنسخ المتماثلة.

يكون شكل الإخراج هو الشكل نفسه للإدخال. على سبيل المثال، إذا كان هناك نسختان متطابقتان وكانت قيمة المعامِل [1.0, 2.5] و[3.0, 5.25] على التوالي في النسختين المتطابقتين، ستكون قيمة الناتج من عملية الجمع هذه [4.0, 7.75] في كلتا النسختين المتطابقتين. إذا كان الإدخال عبارة عن مجموعة صفوف، يكون الإخراج عبارة عن مجموعة صفوف أيضًا.

يتطلّب احتساب نتيجة AllReduce الحصول على إدخال واحد من كل نسخة طبق الأصل، لذا إذا نفّذت إحدى النسخ عقدة AllReduce مرات أكثر من الأخرى، ستنتظر النسخة الأولى إلى الأبد. بما أنّ جميع النسخ المتماثلة تشغّل البرنامج نفسه، لا تتوفّر طرق كثيرة لحدوث ذلك، ولكن يمكن أن يحدث عندما يعتمد شرط حلقة while على بيانات من infeed وتتسبّب البيانات التي infeed في تكرار حلقة while لعدد مرات أكبر على نسخة متماثلة واحدة مقارنةً بنسخة أخرى.

يتم تقسيم واجهة برمجة التطبيقات الخاصة بـ AllReduce داخليًا إلى تعليمتَين من تعليمات HLO (AllReduceStart وAllReduceDone).

يمكنك الاطّلاع أيضًا على HloInstruction::CreateAllReduceStart.

تعمل AllReduceStart وAllReduceDone كعناصر أساسية في HLO. قد تظهر هذه العمليات في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

CrossReplicaSum

يمكنك الاطّلاع أيضًا على XlaBuilder::CrossReplicaSum.

تُجري عملية AllReduce مع احتساب المجموع.

CrossReplicaSum(operand, replica_groups)

الوسيطات النوع الدلالات
operand XlaOp صفيف أو مجموعة غير فارغة من الصفائف التي سيتم تقليلها على مستوى النسخ المتماثلة
replica_groups vector of vectors of int64 المجموعات التي يتم إجراء عمليات التخفيض بينها

تعرض مجموع قيمة المعامِل ضمن كل مجموعة فرعية من النسخ المتماثلة. تقدّم جميع النسخ المتماثلة قيمة إدخال واحدة إلى المجموع، وتتلقّى جميع النسخ المتماثلة المجموع الناتج لكل مجموعة فرعية.

AllToAll

يمكنك الاطّلاع أيضًا على XlaBuilder::AllToAll.

‫AllToAll هي عملية جماعية ترسل البيانات من جميع النوى إلى جميع النوى. تتضمّن هذه العملية مرحلتَين:

  1. مرحلة التشتّت في كل نواة، يتم تقسيم المعامِل إلى split_count عدد من الحِزم على طول split_dimensions، ويتم توزيع الحِزم على جميع النوى، على سبيل المثال، يتم إرسال الحزمة رقم i إلى النواة رقم i.
  2. مرحلة الجمع تدمج كل نواة الحِزم المستلَمة على طول concat_dimension.

يمكن ضبط النوى المشارِكة من خلال:

  • replica_groups: تحتوي كل ReplicaGroup على قائمة بمعرّفات النسخ المتماثلة المشارِكة في عملية الحساب (يمكن استرداد معرّف النسخة المتماثلة الحالية باستخدام ReplicaId). سيتم تطبيق AllToAll ضمن المجموعات الفرعية بالترتيب المحدّد. على سبيل المثال، يعني replica_groups = { {1,2,3}, {4,5,0} } أنّه سيتم تطبيق AllToAll ضمن النسخ المتماثلة {1, 2, 3}، وفي مرحلة التجميع، وسيتم ربط الكتل المستلَمة بالترتيب نفسه 1 و2 و3. بعد ذلك، سيتم تطبيق عملية AllToAll أخرى على النسخ المتماثلة 4 و5 و0، وسيكون ترتيب التسلسل أيضًا 4 و5 و0. إذا كانت replica_groups فارغة، تنتمي جميع النسخ المتماثلة إلى مجموعة واحدة، بترتيب تسلسلي حسب ظهورها.

المتطلَّبات الأساسية:

  • يجب أن يكون حجم السمة الخاصة بالمعامل في split_dimension قابلاً للقسمة على split_count.
  • شكل المعامِل ليس مجموعة صفوف.

AllToAll(operand, split_dimension, concat_dimension, split_count, replica_groups, layout, channel_id)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة إدخال ذات n أبعاد
split_dimension int64 قيمة في الفاصل [0,n) تحدّد اسم السمة التي يتم تقسيم المعامل على أساسها
concat_dimension int64 قيمة في الفاصل الزمني [0,n) تحدّد اسم السمة التي يتم ربط الأقسام المقسّمة على طولها
split_count int64 عدد النوى التي تشارك في هذه العملية. إذا كان replica_groups فارغًا، يجب أن يكون هذا هو عدد النسخ المتماثلة، وإلا يجب أن يكون هذا مساويًا لعدد النسخ المتماثلة في كل مجموعة.
replica_groups ReplicaGroupمتّجه تحتوي كل مجموعة على قائمة بمعرّفات النسخ المتماثلة.
layout اختياري Layout تنسيق الذكرى الذي يحدّده المستخدم
channel_id اختياري ChannelHandle معرّف فريد لكل زوج إرسال/استلام

يمكنك الاطّلاع على xla::shapes للحصول على مزيد من المعلومات حول الأشكال والتنسيقات..

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - all_to_all.

‫AllToAll - المثال 1

XlaBuilder b("alltoall");
auto x = Parameter(&b, 0, ShapeUtil::MakeShape(F32, {4, 16}), "x");
AllToAll(
    x,
    /*split_dimension=*/ 1,
    /*concat_dimension=*/ 0,
    /*split_count=*/ 4);

في المثال أعلاه، هناك 4 نوى تشارك في عملية Alltoall. في كل نواة، يتم تقسيم المعامِل إلى 4 أجزاء على طول البُعد 1، وبالتالي يكون لكل جزء شكل f32[4,4]. يتم توزيع الأجزاء الأربعة على جميع النوى. بعد ذلك، يربط كل نواة الأجزاء المستلَمة على طول السمة 0، بترتيب النواة 0-4. وبالتالي، يكون شكل الناتج على كل نواة f32[16,4].

AllToAll - Example 2 - StableHLO

مثال على عملية نقل البيانات AllToAll في StableHLO

في المثال أعلاه، هناك نسختان طبق الأصل تشاركان في AllToAll. في كل نسخة طبق الأصل، يكون شكل المعامِل f32[2,4]. يتم تقسيم المعامِل إلى جزأين على طول البُعد 1، وبالتالي يكون لكل جزء شكل f32[2,2]. بعد ذلك، يتم تبادل الجزأين بين النسخ المتماثلة وفقًا لموضعها في مجموعة النسخ المتماثلة. تجمع كل نسخة طبق الأصل الجزء المقابل لها من كلا المعاملَين وتدمجهما على طول البُعد 0. نتيجةً لذلك، يكون شكل الناتج على كل نسخة هو f32[4,2].

RaggedAllToAll

يمكنك الاطّلاع أيضًا على XlaBuilder::RaggedAllToAll.

تُجري عملية RaggedAllToAll عملية جماعية من الكل إلى الكل، حيث يكون الإدخال والإخراج عبارة عن موترات غير منتظمة.

RaggedAllToAll(input, input_offsets, send_sizes, output, output_offsets, recv_sizes, replica_groups, channel_id)

الوسيطات النوع الدلالات
input XlaOp مصفوفة N من النوع T
input_offsets XlaOp مصفوفة N من النوع T
send_sizes XlaOp مصفوفة N من النوع T
output XlaOp مصفوفة N من النوع T
output_offsets XlaOp مصفوفة N من النوع T
recv_sizes XlaOp مصفوفة N من النوع T
replica_groups ReplicaGroup متّجه تحتوي كل مجموعة على قائمة بمعرّفات النسخ المتماثلة.
channel_id اختياري ChannelHandle معرّف فريد لكل زوج إرسال/استلام

يتم تحديد الموترات غير المنتظمة من خلال مجموعة من ثلاثة موترات:

  • data: يكون موتر data "غير منتظم" على طول البُعد الخارجي، حيث يكون لكل عنصر مفهرس حجم متغير.
  • offsets: يفهرس موتر offsets البُعد الخارجي لموتر data، ويمثّل الإزاحة الأولية لكل عنصر غير منتظم في موتر data.
  • sizes: يمثّل موتر sizes حجم كل عنصر غير منتظم في موتر data، حيث يتم تحديد الحجم بوحدات من العناصر الفرعية. يتم تعريف العنصر الفرعي على أنّه لاحقة شكل موتر "البيانات" التي يتم الحصول عليها من خلال إزالة البُعد "غير المنتظم" الخارجي.
  • يجب أن يكون حجم موترَي offsets وsizes متطابقًا.

مثال على موتر غير منتظم:

data: [8,3] =
{ {a,b,c},{d,e,f},{g,h,i},{j,k,l},{m,n,o},{p,q,r},{s,t,u},{v,w,x} }

offsets: [3] = {0, 1, 4}

sizes: [3] = {1, 3, 4}

// Index 'data' at 'offsets'[0], 'sizes'[0]' // {a,b,c}

// Index 'data' at 'offsets'[1], 'sizes'[1]' // {d,e,f},{g,h,i},{j,k,l}

// Index 'data' at 'offsets'[2], 'sizes'[2]' // {m,n,o},{p,q,r},{s,t,u},{v,w,x}

يجب تقسيم output_offsets بطريقة تتيح لكل نسخة طبق الأصل الحصول على إزاحات من منظور مخرجات النسخة المستهدَفة.

بالنسبة إلى إزاحة الإخراج رقم i، سترسل النسخة المتماثلة الحالية تحديث input[input_offsets[i]:input_offsets[i]+input_sizes[i]] إلى النسخة المتماثلة رقم i التي ستتم كتابتها إلى output_i[output_offsets[i]:output_offsets[i]+send_sizes[i]] في النسخة المتماثلة رقم i output.

على سبيل المثال، إذا كان لدينا نسختان طبق الأصل:

replica 0:
input: [1, 2, 2]
output:[0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 2]
output_offsets: [0, 0]
recv_sizes: [1, 1]

replica 1:
input: [3, 4, 0]
output: [0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 1]
output_offsets: [1, 2]
recv_sizes: [2, 1]

// replica 0's result will be: [1, 3, 0, 0]
// replica 1's result will be: [2, 2, 4, 0]

تتضمّن عملية ragged all-to-all في HLO الوسيطات التالية:

  • input: موتر بيانات إدخال غير منتظم
  • output: موتر بيانات الإخراج غير المنتظم
  • input_offsets: موتر إزاحات الإدخال غير المنتظم.
  • send_sizes: موتر أحجام الإرسال غير المنتظمة
  • output_offsets: مصفوفة من الإزاحات غير المنتظمة في ناتج النسخة المتماثلة المستهدَفة.
  • recv_sizes: موتر أحجام الاستلام غير المنتظمة

يجب أن يكون لجميع موترات *_offsets و*_sizes الشكل نفسه.

يتوفّر شكلان لموترَي *_offsets و*_sizes:

  • [num_devices] حيث يمكن أن يرسل التحديث غير المنتظم من الكل إلى الكل تحديثًا واحدًا على الأكثر إلى كل جهاز بعيد في مجموعة النسخ المتماثلة. على سبيل المثال:
for (remote_device_id : replica_group) {
     SEND input[input_offsets[remote_device_id]],
     output[output_offsets[remote_device_id]],
     send_sizes[remote_device_id] }
  • [num_devices, num_updates] حيث يمكن أن يرسل التحديث غير المنتظم من الكل إلى الكل ما يصل إلى num_updates إلى الجهاز البعيد نفسه (كل تحديث بإزاحة مختلفة)، لكل جهاز بعيد في مجموعة النسخ المتماثلة.

على سبيل المثال:

for (remote_device_id : replica_group) {
    for (update_idx : num_updates) {
        SEND input[input_offsets[remote_device_id][update_idx]],
        output[output_offsets[remote_device_id][update_idx]]],
        send_sizes[remote_device_id][update_idx] } }

و

يمكنك الاطّلاع أيضًا على XlaBuilder::And.

تُجري عملية AND على مستوى العناصر في موترَين lhs وrhs.

And(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل من "And" يتيح البث بأبعاد مختلفة:

And(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - and.

غير متزامنة

راجِع أيضًا HloInstruction::CreateAsyncStart وHloInstruction::CreateAsyncUpdate وHloInstruction::CreateAsyncDone.

AsyncDone وAsyncStart وAsyncUpdate هي تعليمات HLO داخلية تُستخدم في العمليات غير المتزامنة وتعمل كعناصر أساسية في HLO. قد تظهر هذه العمليات في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

Atan2

يمكنك الاطّلاع أيضًا على XlaBuilder::Atan2.

تُجري هذه الدالة عملية atan2 على مستوى كل عنصر في lhs وrhs.

Atan2(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

تتوفّر صيغة بديلة مع إمكانية البث بأبعاد مختلفة للدالة Atan2:

Atan2(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - atan2.

BatchNormGrad

يمكنك أيضًا الاطّلاع على XlaBuilder::BatchNormGrad وورقة البحث الأصلية حول التسوية الدفعية للحصول على وصف تفصيلي للخوارزمية.

تحسب هذه الدالة تدرّجات التسوية الدفعية.

BatchNormGrad(operand, scale, batch_mean, batch_var, grad_output, epsilon, feature_index)

الوسيطات النوع الدلالات
operand XlaOp المصفوفة ذات الأبعاد n المطلوب تسويتها (x)
scale XlaOp مصفوفة أحادية البُعد (\(\gamma\))
batch_mean XlaOp مصفوفة أحادية البُعد (\(\mu\))
batch_var XlaOp مصفوفة أحادية البُعد (\(\sigma^2\))
grad_output XlaOp التدرّجات التي تم تمريرها إلى BatchNormTraining (\(\nabla y\))
epsilon float قيمة إبسيلون (\(\epsilon\))
feature_index int64 فهرس سمة الميزة في operand

بالنسبة إلى كل ميزة في سمة الميزة (feature_index هو فهرس سمة الميزة في operand)، تحسب العملية التدرجات بالنسبة إلى operand وoffset وscale على مستوى جميع السمات الأخرى. يجب أن يكون feature_index فهرسًا صالحًا لسمة الميزة في operand.

يتم تحديد التدرّجات الثلاثة من خلال الصيغ التالية (بافتراض مصفوفة رباعية الأبعاد operand وفهرس سمة البُعد l وحجم الدفعة m والأحجام المكانية w وh):

\[ \begin{split} c_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sigma^2_l+\epsilon} \right) \\\\ d_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \\\\ \nabla x_{ijkl} &= \frac{\gamma_{l} }{\sqrt{\sigma^2_{l}+\epsilon} } \left( \nabla y_{ijkl} - d_l - c_l (x_{ijkl} - \mu_{l}) \right) \\\\ \nabla \gamma_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sqrt{\sigma^2_{l}+\epsilon} } \right) \\\\\ \nabla \beta_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \end{split} \]

تمثّل المدخلات batch_mean وbatch_var قيم اللحظات على مستوى الدُفعات والأبعاد المكانية.

نوع الناتج هو مجموعة من ثلاثة معرّفات:

النواتج النوع الدلالات
grad_operand XlaOp تدرّج اللون بالنسبة إلى الإدخال operand (\(\nabla x\))
grad_scale XlaOp تدرّج بالنسبة إلى الإدخال **scale ** (\(\nabla\gamma\))
grad_offset XlaOp تدرّج اللون بالنسبة إلى الإدخال offset(\(\nabla\beta\))

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - batch_norm_grad.

BatchNormInference

يمكنك أيضًا الاطّلاع على XlaBuilder::BatchNormInference وورقة البحث الأصلية حول التسوية الدفعية للحصول على وصف تفصيلي للخوارزمية.

تعمل هذه الدالة على تسوية مصفوفة على مستوى الدُفعات والسمات المكانية.

BatchNormInference(operand, scale, offset, mean, variance, epsilon, feature_index)

الوسيطات النوع الدلالات
operand XlaOp صفيف n أبعاد سيتم تسويته
scale XlaOp مصفوفة أحادية البُعد
offset XlaOp مصفوفة أحادية البُعد
mean XlaOp مصفوفة أحادية البُعد
variance XlaOp مصفوفة أحادية البُعد
epsilon float قيمة إبسيلون
feature_index int64 فهرس سمة الميزة في operand

بالنسبة إلى كل ميزة في سمة الميزة (feature_index هو فهرس سمة الميزة في operand)، تحسب العملية المتوسط والتباين في جميع السمات الأخرى، وتستخدم المتوسط والتباين لتسوية كل عنصر في operand. يجب أن يكون feature_index فهرسًا صالحًا لسمة الميزة في operand.

BatchNormInference مكافئة لاستدعاء BatchNormTraining بدون احتساب mean وvariance لكل مجموعة. ويستخدم الإدخالين mean وvariance كقيم مقدَّرة. والغرض من هذه العملية هو تقليل وقت الاستجابة في الاستدلال، ومن هنا جاءت التسمية BatchNormInference.

الناتج هو مصفوفة عادية ذات n أبعاد لها الشكل نفسه كشكل الإدخال operand.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - batch_norm_inference.

BatchNormTraining

يمكنك أيضًا الاطّلاع على XlaBuilder::BatchNormTraining وthe original batch normalization paper للحصول على وصف تفصيلي للخوارزمية.

تعمل هذه الدالة على تسوية مصفوفة على مستوى الدُفعات والسمات المكانية.

BatchNormTraining(operand, scale, offset, epsilon, feature_index)

الوسيطات النوع الدلالات
operand XlaOp المصفوفة ذات الأبعاد n المطلوب تسويتها (x)
scale XlaOp مصفوفة أحادية البُعد (\(\gamma\))
offset XlaOp مصفوفة أحادية البُعد (\(\beta\))
epsilon float قيمة إبسيلون (\(\epsilon\))
feature_index int64 فهرس سمة الميزة في operand

بالنسبة إلى كل ميزة في سمة الميزة (feature_index هو فهرس سمة الميزة في operand)، تحسب العملية المتوسط والتباين في جميع السمات الأخرى، وتستخدم المتوسط والتباين لتسوية كل عنصر في operand. يجب أن يكون feature_index فهرسًا صالحًا لسمة الميزة في operand.

تكون الخوارزمية على النحو التالي لكل مجموعة في operand \(x\) تحتوي على m عناصر بحجم الأبعاد المكانية w وh (بافتراض أنّ operand هي مصفوفة رباعية الأبعاد):

  • تحسب هذه الدالة متوسط الدُفعات \(\mu_l\) لكل ميزة l في سمة الميزة: \(\mu_l=\frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h x_{ijkl}\)

  • تحسب هذه الدالة تباين الدُفعات \(\sigma^2_l\): $\sigma^2l=\frac{1}{mwh}\sum{i=1}^m\sum{j=1}^w\sum{k=1}^h (x_{ijkl} - \mu_l)^2$

  • التسوية والقياس والتغيير: \(y_{ijkl}=\frac{\gamma_l(x_{ijkl}-\mu_l)}{\sqrt[2]{\sigma^2_l+\epsilon} }+\beta_l\)

تتم إضافة قيمة إبسيلون، وهي عادةً رقم صغير، لتجنُّب أخطاء القسمة على صفر.

نوع الناتج هو مجموعة من ثلاثة XlaOp:

النواتج النوع الدلالات
output XlaOp مصفوفة ذات n أبعاد لها الشكل نفسه كشكل الإدخال operand (y)
batch_mean XlaOp مصفوفة أحادية البُعد (\(\mu\))
batch_var XlaOp مصفوفة أحادية البُعد (\(\sigma^2\))

batch_mean وbatch_var هما لحظات يتم احتسابها على مستوى الدُفعة والسمات المكانية باستخدام الصيغ أعلاه.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - batch_norm_training.

Bitcast

يمكنك الاطّلاع أيضًا على HloInstruction::CreateBitcast.

قد يظهر Bitcast في عمليات تفريغ HLO، ولكن ليس الهدف أن ينشئ المستخدمون النهائيون هذه العمليات يدويًا.

BitcastConvertType

يمكنك الاطّلاع أيضًا على XlaBuilder::BitcastConvertType.

على غرار tf.bitcast في TensorFlow، تنفّذ هذه الدالة عملية bitcast على مستوى العناصر من شكل بيانات إلى شكل مستهدَف. يجب أن يتطابق حجم الإدخال والإخراج: على سبيل المثال، تتحوّل عناصر s32 إلى عناصر f32 من خلال روتين bitcast، وسيتحوّل عنصر s32 واحد إلى أربعة عناصر s8. يتم تنفيذ Bitcast كعملية إرسال منخفضة المستوى، لذا ستعرض الأجهزة التي تستخدم تمثيلات مختلفة للأرقام العشرية نتائج مختلفة.

BitcastConvertType(operand, new_element_type)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T بالأبعاد D
new_element_type PrimitiveType النوع U

يجب أن تتطابق أبعاد المعامِل والشكل المستهدف، باستثناء البُعد الأخير الذي سيتغير حسب نسبة حجم العنصر الأساسي قبل التحويل وبعده.

يجب ألا تكون أنواع عناصر المصدر والوجهة عبارة عن مجموعات.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - bitcast_convert.

Bitcast-converting to primitive type of different width

تتيح تعليمات BitcastConvert HLO الحالة التي لا يساوي فيها حجم نوع عنصر الإخراج T' حجم عنصر الإدخال T. بما أنّ العملية بأكملها هي عبارة عن بث جزئي من الناحية المفاهيمية ولا تغيّر البايتات الأساسية، يجب تغيير شكل العنصر الناتج. بالنسبة إلى B = sizeof(T), B' = sizeof(T')، هناك حالتان محتملتان.

أولاً، عندما B > B'، يحصل شكل الناتج على بُعد جديد أصغر حجمًا يبلغ B/B'. على سبيل المثال:

  f16[10,2]{1,0} %output = f16[10,2]{1,0} bitcast-convert(f32[10]{0} %input)

تبقى القاعدة كما هي بالنسبة إلى الكميات العددية الفعّالة:

  f16[2]{0} %output = f16[2]{0} bitcast-convert(f32[] %input)

بدلاً من ذلك، بالنسبة إلى B' > B، تتطلّب التعليمات أن يكون آخر بُعد منطقي لشكل الإدخال مساويًا B'/B، ويتم حذف هذا البُعد أثناء عملية التحويل:

  f32[10]{0} %output = f32[10]{0} bitcast-convert(f16[10,2]{1,0} %input)

يُرجى العِلم أنّ عمليات التحويل بين عروض بتات مختلفة ليست على مستوى العناصر.

البث

يمكنك الاطّلاع أيضًا على XlaBuilder::Broadcast.

تضيف هذه الدالة سمات إلى مصفوفة من خلال تكرار البيانات في المصفوفة.

Broadcast(operand, broadcast_sizes)

الوسيطات النوع الدلالات
operand XlaOp الصفيف المطلوب تكراره
broadcast_sizes ArraySlice<int64> أحجام السمات الجديدة

يتم إدراج السمات الجديدة على اليسار، أي إذا كان broadcast_sizes يتضمّن القيم {a0, ..., aN} وكان شكل المعامِل يتضمّن السمات {b0, ..., bM}، فإنّ شكل الناتج يتضمّن السمات {a0, ..., aN, b0, ..., bM}.

يتم فهرسة السمات الجديدة في نُسخ من المعامِل، أي

output[i0, ..., iN, j0, ..., jM] = operand[j0, ..., jM]

على سبيل المثال، إذا كان operand عددًا قياسيًا f32 بقيمة 2.0f، وكان broadcast_sizes هو {2, 3}، ستكون النتيجة مصفوفة بالشكل f32[2, 3] وستكون جميع القيم في النتيجة هي 2.0f.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - البث.

BroadcastInDim

يمكنك الاطّلاع أيضًا على XlaBuilder::BroadcastInDim.

توسّع هذه الدالة حجم وعدد أبعاد مصفوفة من خلال تكرار البيانات في المصفوفة.

BroadcastInDim(operand, out_dim_size, broadcast_dimensions)

الوسيطات النوع الدلالات
operand XlaOp الصفيف المطلوب تكراره
out_dim_size ArraySlice<int64> أحجام أبعاد الشكل المستهدَف
broadcast_dimensions ArraySlice<int64> تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد في شكل المعامِل

يشبه هذا النوع Broadcast، ولكنّه يتيح إضافة سمات في أي مكان وتوسيع السمات الحالية بحجم 1.

يتم بث operand إلى الشكل الموصوف بـ out_dim_size. تربط broadcast_dimensions أبعاد operand بأبعاد الشكل المستهدف، أي أنّ البُعد رقم i في المعامِل يتم ربطه بالبُعد رقم broadcast_dimension[i] في شكل الناتج. يجب أن تكون أبعاد operand بحجم 1 أو بنفس حجم البُعد في شكل الإخراج الذي يتم الربط به. يتم ملء السمات المتبقية بسمات بحجم 1. بعد ذلك، يتم البث على طول هذه الأبعاد المتدهورة للوصول إلى شكل الناتج. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

الاتصال

يمكنك الاطّلاع أيضًا على XlaBuilder::Call.

يستدعي عملية حسابية باستخدام الوسيطات المحدّدة.

Call(computation, operands...)

الوسيطات النوع الدلالات
computation XlaComputation عملية حسابية من النوع T_0, T_1, ..., T_{N-1} -> S مع N مَعلمة من أي نوع
operands تسلسل N XlaOps وسيطات N من أي نوع

يجب أن تتطابق عدد المعلمات وأنواعها في operands مع معلمات computation. يُسمح بعدم تضمين operands.

CompositeCall

يمكنك الاطّلاع أيضًا على XlaBuilder::CompositeCall.

تتضمّن عملية مؤلَّفة من عمليات StableHLO أخرى، تتلقّى مدخلات وcomposite_attributes وتنتج نتائج. يتم تنفيذ دلالات العملية من خلال سمة التجزئة. يمكن استبدال العملية المركّبة بعملية التحلّل بدون تغيير دلالات البرنامج. في الحالات التي لا يؤدي فيها تضمين عملية التحليل إلى توفير دلالات العملية نفسها، يُفضّل استخدام custom_call.

يُستخدَم حقل الإصدار (القيمة التلقائية هي 0) للإشارة إلى وقت تغيير دلالات العنصر المركّب.

يتم تنفيذ هذه العملية كـ kCall مع السمة is_composite=true. يتم تحديد الحقل decomposition من خلال السمة computation. تخزّن سمات الواجهة الأمامية السمات المتبقية التي تبدأ بالبادئة composite..

مثال على عملية CompositeCall:

f32[] call(f32[] %cst), to_apply=%computation, is_composite=true,
frontend_attributes = {
  composite.name="foo.bar",
  composite.attributes={n = 1 : i32, tensor = dense<1> : tensor<i32>},
  composite.version="1"
}

CompositeCall(computation, operands..., name, attributes, version)

الوسيطات النوع الدلالات
computation XlaComputation عملية حسابية من النوع T_0, T_1, ..., T_{N-1} -> S مع N مَعلمة من أي نوع
operands تسلسل N XlaOps عدد متغيّر من القيم
name string اسم العنصر المركّب
attributes اختياري string قاموس اختياري للسمات بتنسيق السلسلة
version اختياري int64 عدد التعديلات على الإصدارات التي يجب إجراؤها على دلالات العملية المركّبة

إنّ decomposition الخاص بعملية ليس حقلاً يُطلق عليه اسم، بل يظهر كسمة to_apply تشير إلى الدالة التي تحتوي على التنفيذ الأدنى مستوى، أي to_apply=%funcname.

يمكنك الاطّلاع على مزيد من المعلومات حول التركيب والتحليل على مواصفات StableHLO.

Cbrt

يمكنك الاطّلاع أيضًا على XlaBuilder::Cbrt.

عملية الجذر التكعيبي لكل عنصر x -> cbrt(x).

Cbrt(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة cbrt أيضًا الوسيط الاختياري result_accuracy:

Cbrt(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - cbrt.

تقريب للأعلى

يمكنك الاطّلاع أيضًا على XlaBuilder::Ceil.

دالة السقف لكل عنصر x -> ⌈x⌉

Ceil(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - ceil.

Cholesky

يمكنك الاطّلاع أيضًا على XlaBuilder::Cholesky.

تحسب هذه الدالة تحليل شوليسكي لمجموعة من المصفوفات المحددة الموجبة المتماثلة (الهرميتية).

Cholesky(a, lower)

الوسيطات النوع الدلالات
a XlaOp مصفوفة من نوع معقّد أو نقطة عائمة بأكثر من بُعدَين.
lower bool تحديد ما إذا كان سيتم استخدام المثلث العلوي أو السفلي من a

إذا كانت lower هي true، يتم احتساب المصفوفات المثلثية السفلية l بحيث يكون $a = l . ‫l^T$. إذا كانت lower هي false، يتم احتساب المصفوفات المثلثية العلوية u بحيث تكون \(a = u^T . u\).

تتم قراءة بيانات الإدخال من المثلث السفلي/العلوي من a فقط، وذلك استنادًا إلى قيمة lower. ويتم تجاهل القيم من المثلث الآخر. يتم عرض بيانات الإخراج في المثلث نفسه، أما القيم في المثلث الآخر، فيتم تحديدها حسب التنفيذ ويمكن أن تكون أي شيء.

إذا كان a يحتوي على أكثر من سمتَين، يتم التعامل مع a على أنّه مجموعة من المصفوفات، حيث تكون جميع السمات باستثناء السمتَين الثانويتَين سمات مجمّعة.

إذا لم تكن a متماثلة (هيرميتية) ومحددة موجبة، ستكون النتيجة محددة حسب التنفيذ.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - cholesky.

عقدة تقييد القيم

يمكنك الاطّلاع أيضًا على XlaBuilder::Clamp.

تثبّت هذه العقدة قيمة عامل ضمن النطاق بين الحدّ الأدنى والحدّ الأقصى.

Clamp(min, operand, max)

الوسيطات النوع الدلالات
min XlaOp مصفوفة من النوع T
operand XlaOp مصفوفة من النوع T
max XlaOp مصفوفة من النوع T

بالنظر إلى معامل وقيمتَي الحد الأدنى والأقصى، تعرض هذه الدالة المعامل إذا كان ضمن النطاق بين الحد الأدنى والأقصى، وإلا تعرض قيمة الحد الأدنى إذا كان المعامل أقل من هذا النطاق أو قيمة الحد الأقصى إذا كان المعامل أعلى من هذا النطاق. أي clamp(a, x, b) = min(max(a, x), b).

يجب أن تكون جميع المصفوفات الثلاثة بالشكل نفسه. بدلاً من ذلك، يمكن أن يكون min و/أو max عددًا قياسيًا من النوع T، وذلك كشكل محدود من البث.

مثال مع القيم العددية min وmax:

let operand: s32[3] = {-1, 5, 9};
let min: s32 = 0;
let max: s32 = 6;
==>
Clamp(min, operand, max) = s32[3]{0, 5, 6};

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - clamp.

تصغير

يمكنك الاطّلاع أيضًا على XlaBuilder::Collapse. وعملية tf.reshape

تدمج هذه الدالة أبعاد الصفيف في بُعد واحد.

Collapse(operand, dimensions)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T
dimensions int64 متّجه مجموعة فرعية متسلسلة ومرتّبة من سمات T

يستبدل Collapse المجموعة الفرعية المحدّدة من سمات المعامِل بسمة واحدة. وسيطات الإدخال هي مصفوفة عشوائية من النوع T ومتّجه ثابت في وقت الترجمة لفهارس الأبعاد. يجب أن تكون فهارس السمات مجموعة فرعية متسلسلة ومرتبة (من أرقام السمات المنخفضة إلى المرتفعة) من سمات T. وبالتالي، فإنّ {0, 1, 2} أو {0, 1} أو {1, 2} هي مجموعات سمات صالحة، ولكنّ {1, 0} أو {0, 2} غير صالحة. ويتم استبدالها بسمة جديدة واحدة في الموضع نفسه في تسلسل السمات الذي تم استبدالها فيه، ويكون حجم السمة الجديدة مساويًا لناتج أحجام السمات الأصلية. أصغر رقم سمة في dimensions هو السمة الأبطأ تغيُّرًا (الأكثر أهمية) في مجموعة الحلقات التي تدمج هذه السمات، وأكبر رقم سمة هو الأسرع تغيُّرًا (الأقل أهمية). اطّلِع على عامل التشغيل tf.reshape إذا كنت بحاجة إلى ترتيب أكثر عمومية للطي.

على سبيل المثال، لنفترض أنّ v هي مصفوفة من 24 عنصرًا:

let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
{ {20, 21, 22}, {25, 26, 27} },
{ {30, 31, 32}, {35, 36, 37} },
{ {40, 41, 42}, {45, 46, 47} } };

// Collapse to a single dimension, leaving one dimension.
let v012 = Collapse(v, {0,1,2});
then v012 == f32[24] {10, 11, 12, 15, 16, 17,
20, 21, 22, 25, 26, 27,
30, 31, 32, 35, 36, 37,
40, 41, 42, 45, 46, 47};

// Collapse the two lower dimensions, leaving two dimensions.
let v01 = Collapse(v, {0,1});
then v01 == f32[4x6] { {10, 11, 12, 15, 16, 17},
{20, 21, 22, 25, 26, 27},
{30, 31, 32, 35, 36, 37},
{40, 41, 42, 45, 46, 47} };

// Collapse the two higher dimensions, leaving two dimensions.
let v12 = Collapse(v, {1,2});
then v12 == f32[8x3] { {10, 11, 12},
{15, 16, 17},
{20, 21, 22},
{25, 26, 27},
{30, 31, 32},
{35, 36, 37},
{40, 41, 42},
{45, 46, 47} };

Clz

يمكنك الاطّلاع أيضًا على XlaBuilder::Clz.

تحسب هذه الدالة عدد الأصفار البادئة لكل عنصر.

Clz(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

CollectiveBroadcast

يمكنك الاطّلاع أيضًا على XlaBuilder::CollectiveBroadcast.

يبث البيانات على مستوى النسخ المتماثلة. يتم إرسال البيانات من المعرّف الأول للنسخة المتطابقة في كل مجموعة إلى المعرّفات الأخرى في المجموعة نفسها. إذا لم يكن معرّف النسخة المتطابقة في أي مجموعة نسخ متطابقة، سيكون الناتج على تلك النسخة المتطابقة عبارة عن موتر يتألف من أصفار في shape.

CollectiveBroadcast(operand, replica_groups, channel_id)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
replica_groups ReplicaGroupمتّجه تحتوي كل مجموعة على قائمة بمعرّفات النسخ المتماثلة.
channel_id اختياري ChannelHandle معرّف فريد لكل زوج إرسال/استلام

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - collective_broadcast.

CollectivePermute

يمكنك الاطّلاع أيضًا على XlaBuilder::CollectivePermute.

‫CollectivePermute هي عملية جماعية ترسل البيانات وتتلقّاها على مستوى النسخ المتماثلة.

CollectivePermute(operand, source_target_pairs, channel_id, inplace)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة إدخال ذات n أبعاد
source_target_pairs <int64, int64> متّجه قائمة بأزواج (source_replica_id وtarget_replica_id). بالنسبة إلى كل زوج، يتم إرسال المعامِل من النسخة المتماثلة المصدر إلى النسخة المتماثلة الهدف.
channel_id اختياري ChannelHandle معرّف القناة الاختياري للتواصل بين الوحدات
inplace اختياري bool تحديد ما إذا كان يجب إجراء التبديل في المكان

يُرجى العِلم أنّ هناك القيود التالية على source_target_pairs:

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

يتم تقسيم واجهة برمجة التطبيقات الخاصة بعملية CollectivePermute داخليًا إلى تعليمتَين من لغة HLO (CollectivePermuteStart وCollectivePermuteDone).

يمكنك الاطّلاع أيضًا على HloInstruction::CreateCollectivePermuteStart.

تعمل CollectivePermuteStart وCollectivePermuteDone كعناصر أساسية في HLO. قد تظهر هذه العمليات في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - collective_permute.

مقارنة

يمكنك الاطّلاع أيضًا على XlaBuilder::Compare.

تُجري مقارنة بين عناصر lhs وrhs في ما يلي:

Eq

يمكنك الاطّلاع أيضًا على XlaBuilder::Eq.

تُجري هذه الدالة مقارنة يساوي بين عناصر lhs وrhs.

\(lhs = rhs\)

Eq(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

تتوفّر صيغة بديلة تتوافق مع البث بأبعاد مختلفة للمعادلة:

Eq(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

يتوفّر ترتيب إجمالي للأعداد العشرية في Eq، وذلك من خلال فرض ما يلي:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

EqTotalOrder(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد في شكل المعامِل

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - compare.

Ne

يمكنك الاطّلاع أيضًا على XlaBuilder::Ne.

تُجري هذه الدالة مقارنة لا يساوي بين عناصر lhs وrhs.

\(lhs != rhs\)

Ne(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل من Ne يتيح البث بأبعاد مختلفة:

Ne(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

يجب أن يكون إجمالي الطلب أكبر من الأعداد العشرية العائمة بالنسبة إلى Ne، وذلك من خلال فرض ما يلي:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

NeTotalOrder(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد في شكل المعامِل

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - compare.

Ge

يمكنك الاطّلاع أيضًا على XlaBuilder::Ge.

تُجري هذه الدالة مقارنة greater-or-equal-than بين عناصر lhs وrhs.

\(lhs >= rhs\)

Ge(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر إصدار بديل من Ge يتيح البث بأبعاد مختلفة:

Ge(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

يجب أن يكون إجمالي الطلب أكبر من أرقام النقطة العائمة، وذلك من خلال فرض ما يلي:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

GtTotalOrder(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد في شكل المعامِل

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - compare.

Gt

يمكنك الاطّلاع أيضًا على XlaBuilder::Gt.

تُجري مقارنة أكبر من على مستوى العناصر بين lhs وrhs.

\(lhs > rhs\)

Gt(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل مع إمكانية البث بأبعاد مختلفة لـ Gt:

Gt(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - compare.

Le

يمكنك الاطّلاع أيضًا على XlaBuilder::Le.

تُجري هذه الدالة مقارنة less-or-equal-than على مستوى العناصر بين lhs وrhs.

\(lhs <= rhs\)

Le(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر إصدار بديل من Le يتوافق مع البث بأبعاد مختلفة:

Le(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

يجب أن يتيح Le إجمالي طلب يتجاوز أرقام النقطة العائمة، وذلك من خلال فرض ما يلي:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

LeTotalOrder(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد في شكل المعامِل

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - compare.

Lt

يمكنك الاطّلاع أيضًا على XlaBuilder::Lt.

تُجري هذه الدالة مقارنة أصغر من على مستوى العناصر بين lhs وrhs.

\(lhs < rhs\)

Lt(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر خيار بديل مع إمكانية البث بأبعاد مختلفة لـ Lt:

Lt(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

يتوفّر دعم لإجمالي الطلب على الأرقام العشرية في Lt، وذلك من خلال فرض ما يلي:

\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]

LtTotalOrder(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - compare.

متقدّم

يمكنك الاطّلاع أيضًا على XlaBuilder::Complex.

تُجري هذه الدالة عملية تحويل على مستوى كل عنصر إلى قيمة مركّبة من زوج من القيم الحقيقية والتخيّلية، lhs وrhs.

Complex(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل مع إمكانية البث بأبعاد مختلفة للنوع Complex:

Complex(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - complex.

ConcatInDim (دمج)

يمكنك الاطّلاع أيضًا على XlaBuilder::ConcatInDim.

تنشئ الدالة Concatenate مصفوفة من معاملات مصفوفات متعددة. تحتوي المصفوفة على عدد الأبعاد نفسه الذي تحتويه كل من معاملات مصفوفة الإدخال (التي يجب أن تحتوي على عدد الأبعاد نفسه الذي تحتويه كل منها)، كما تحتوي على الوسيطات بالترتيب الذي تم تحديده.

Concatenate(operands..., dimension)

الوسيطات النوع الدلالات
operands تسلسل N XlaOp مصفوفات N من النوع T بالأبعاد [L0, L1, ...]. يجب أن يكون N >= 1.
dimension int64 قيمة في الفاصل الزمني [0, N) تحدّد اسم السمة التي سيتم ربطها بين operands.

باستثناء dimension، يجب أن تكون جميع السمات متطابقة. ويرجع ذلك إلى أنّ XLA لا تتوافق مع المصفوفات "غير المنتظمة". يُرجى أيضًا العِلم أنّه لا يمكن ربط القيم ذات البُعد 0 (لأنّه من المستحيل تسمية السمة التي يتم الربط على أساسها).

مثال أحادي الأبعاد:

Concat({ {2, 3}, {4, 5}, {6, 7} }, 0)
//Output:  {2, 3, 4, 5, 6, 7}

مثال ثنائي الأبعاد:

let a = { {1, 2},
         {3, 4},
         {5, 6} };

let b = { {7, 8} };

Concat({a, b}, 0)

//Output:  { {1, 2},
//          {3, 4},
//          {5, 6},
//          {7, 8} }

المخطط:

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - concatenate.

الجملة الشرطية

يمكنك الاطّلاع أيضًا على XlaBuilder::Conditional.

Conditional(predicate, true_operand, true_computation, false_operand, false_computation)

الوسيطات النوع الدلالات
predicate XlaOp عدد صحيح من النوع PRED
true_operand XlaOp وسيطة من النوع \(T_0\)
true_computation XlaComputation XlaComputation of type \(T_0 \to S\)
false_operand XlaOp وسيطة من النوع \(T_1\)
false_computation XlaComputation XlaComputation of type \(T_1 \to S\)

تنفيذ true_computation إذا كانت قيمة predicate هي true، وتنفيذ false_computation إذا كانت قيمة predicate هي false، وعرض النتيجة

يجب أن تقبل الدالة true_computation وسيطة واحدة من النوع \(T_0\) ، وسيتم استدعاؤها باستخدام true_operand الذي يجب أن يكون من النوع نفسه. يجب أن تقبل الدالة false_computation وسيطة واحدة من النوع \(T_1\) ، وسيتم استدعاؤها باستخدام false_operand الذي يجب أن يكون من النوع نفسه. يجب أن يكون نوع القيمة المعروضة لكل من true_computation وfalse_computation هو نفسه.

يُرجى العِلم أنّه سيتم تنفيذ أحد الإجراءَين true_computation وfalse_computation فقط استنادًا إلى قيمة predicate.

Conditional(branch_index, branch_computations, branch_operands)

الوسيطات النوع الدلالات
branch_index XlaOp عدد صحيح من النوع S32
branch_computations تسلسل N XlaComputation XlaComputations من النوع \(T_0 \to S , T_1 \to S , ..., T_{N-1} \to S\)
branch_operands تسلسل N XlaOp وسيطات من النوع \(T_0 , T_1 , ..., T_{N-1}\)

ينفّذ branch_computations[branch_index] ويعرض النتيجة. إذا كان branch_index عبارة عن S32 أصغر من 0 أو أكبر من أو يساوي N، يتم تنفيذ branch_computations[N-1] كفرع تلقائي.

يجب أن تقبل كل branch_computations[b] وسيطة واحدة من النوع \(T_b\) ، وسيتم استدعاؤها باستخدام branch_operands[b] الذي يجب أن يكون من النوع نفسه. يجب أن يكون نوع القيمة المعروضة لكل branch_computations[b] هو نفسه.

يُرجى العِلم أنّه سيتم تنفيذ أحد الإجراءَين branch_computations فقط استنادًا إلى قيمة branch_index.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - if.

ثابت

يمكنك الاطّلاع أيضًا على XlaBuilder::ConstantLiteral.

تُنشئ هذه الدالة output من قيمة ثابتة literal.

Constant(literal)

الوسيطات النوع الدلالات
literal LiteralSlice عرض ثابت Literal حالي

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - ثابت.

ConvertElementType

يمكنك الاطّلاع أيضًا على XlaBuilder::ConvertElementType.

على غرار static_cast على مستوى العناصر في C++، تنفّذ ConvertElementType عملية تحويل على مستوى العناصر من شكل بيانات إلى شكل مستهدف. يجب أن تتطابق الأبعاد، وأن يكون التحويل على مستوى العناصر، مثلاً، تصبح عناصر s32 عناصر f32 من خلال روتين تحويل من s32 إلى f32.

ConvertElementType(operand, new_element_type)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T بالأبعاد D
new_element_type PrimitiveType النوع U

يجب أن تتطابق أبعاد المعامِل وشكل الهدف. يجب ألا تكون أنواع عناصر المصدر والوجهة عبارة عن مجموعات.

ستنفّذ عملية تحويل، مثل T=s32 إلى U=f32، روتين تحويل من عدد صحيح إلى عدد عشري، مثل التقريب إلى أقرب عدد زوجي.

let a: s32[3] = {0, 1, 2};
let b: f32[3] = convert(a, f32);
then b == f32[3]{0.0, 1.0, 2.0}

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - convert.

Conv (الالتفاف)

يمكنك الاطّلاع أيضًا على XlaBuilder::Conv.

تحسب هذه الدالة عملية التفاف من النوع المستخدَم في الشبكات العصبية. في هذه الحالة، يمكن اعتبار الالتفاف على أنّه نافذة ذات n بُعد تتحرّك على مساحة أساسية ذات n بُعد، ويتم إجراء عملية حسابية لكل موضع ممكن للنافذة.

Conv يتم وضع تعليمات الالتفاف في قائمة الانتظار ضمن عملية الحساب، والتي تستخدم أرقام أبعاد الالتفاف التلقائية بدون تمديد.

يتم تحديد المساحة المتروكة بطريقة مختصرة على النحو التالي: SAME أو VALID. تضيف عملية التعبئة SAME إلى الإدخال (lhs) أصفارًا ليكون شكل الإخراج مماثلاً لشكل الإدخال عند عدم أخذ الخطوات في الاعتبار. تعني المساحة المتروكة الصالحة ببساطة عدم وجود مساحة متروكة.

Conv(lhs, rhs, window_strides, padding, feature_group_count, batch_group_count, precision_config, preferred_element_type)

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة ذات (n+2) بُعد للإدخالات
rhs XlaOp مصفوفة ذات (n+2) بُعد لأوزان النواة
window_strides ArraySlice<int64> مصفوفة ذات n أبعاد لخطوات النواة
padding Padding تعداد المساحة المتروكة
feature_group_count int64 عدد مجموعات الميزات
batch_group_count int64 عدد مجموعات الدفعات
precision_config اختياري PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد لنوع العنصر العددي

تتوفّر مستويات متزايدة من عناصر التحكّم في Conv:

ليكن n هو عدد الأبعاد المكانية. الوسيطة lhs هي عبارة عن مصفوفة ذات (n+2) بُعد تصف المساحة الأساسية. يُطلق على هذا الاسم "الإدخال"، مع أنّ الجانب الأيسر هو أيضًا إدخال. في الشبكة العصبية، تكون هذه القيم هي عمليات التفعيل الخاصة بالمدخلات. السمات n+2 هي، بهذا الترتيب:

  • batch: يمثّل كل إحداثي في هذا البُعد إدخالاً مستقلاً يتم إجراء الالتفاف له.
  • z/depth/features: يحتوي كل موضع (y,x) في المساحة الأساسية على متّجه مرتبط به، ويتم إدخاله في هذه السمة.
  • spatial_dims: يصف الأبعاد المكانية n التي تحدّد المساحة الأساسية التي تتحرّك النافذة عليها.

الوسيطة rhs هي عبارة عن مصفوفة (n+2) ذات أبعاد تصف فلتر/نواة/نافذة الالتفاف. السمات هي، بهذا الترتيب:

  • output-z: تمثّل هذه السمة z الناتج.
  • input-z: يجب أن يساوي حجم هذه السمة مضروبًا في feature_group_count حجم السمة z في الجانب الأيسر.
  • spatial_dims: يصف الأبعاد المكانية n التي تحدّد النافذة ذات الأبعاد المتعددة التي تتحرّك في جميع أنحاء المنطقة الأساسية.

تحدّد الوسيطة window_strides خطوة النافذة الالتفافية في الأبعاد المكانية. على سبيل المثال، إذا كانت الخطوة في البُعد المكاني الأول هي 3، لا يمكن وضع النافذة إلا في الإحداثيات التي يكون فيها الفهرس المكاني الأول قابلاً للقسمة على 3.

تحدّد الوسيطة padding مقدار المساحة المتروكة التي سيتم تطبيقها على المساحة الأساسية. يمكن أن تكون قيمة المساحة المتروكة سالبة، وتشير القيمة المطلقة للمساحة المتروكة السالبة إلى عدد العناصر التي يجب إزالتها من البُعد المحدّد قبل إجراء الالتفاف. تحدّد padding[0] مساحة الحشو للسمة y، وتحدّد padding[1] مساحة الحشو للسمة x. يحتوي كل زوج على مسافة بادئة منخفضة كعنصر أول ومسافة بادئة عالية كعنصر ثانٍ. يتم تطبيق المساحة المتروكة المنخفضة في اتجاه الفهارس المنخفضة، بينما يتم تطبيق المساحة المتروكة العالية في اتجاه الفهارس العالية. على سبيل المثال، إذا كانت قيمة padding[1] هي (2,3)، سيتم إضافة صفرَين على اليمين و3 أصفار على اليسار في البُعد المكاني الثاني. استخدام الحشو هو بمثابة إدراج قيم الأصفار نفسها في الإدخال (lhs) قبل إجراء الالتفاف.

تحدّد الوسيطتان lhs_dilation وrhs_dilation عامل التمدد الذي سيتم تطبيقه على الجانب الأيسر والجانب الأيمن، على التوالي، في كل بُعد مكاني. إذا كان عامل التمدد في بُعد مكاني هو d، يتم ضمنيًا وضع d-1 ثقوب بين كل إدخال في هذا البُعد، ما يؤدي إلى زيادة حجم المصفوفة. يتم ملء الثقوب بقيمة no-op، والتي تعني أصفارًا بالنسبة إلى الالتفاف.

يُطلق على تمديد الجانب الأيمن أيضًا اسم الالتفاف التوسعي. لمزيد من التفاصيل، يمكنك الاطّلاع على tf.nn.atrous_conv2d. يُطلق على توسيع الجانب الأيمن أيضًا اسم الالتفاف المنقول. لمزيد من التفاصيل، يُرجى الاطّلاع على tf.nn.conv2d_transpose.

يمكن استخدام الوسيطة feature_group_count (القيمة التلقائية 1) لعمليات الالتفاف المجمّعة. يجب أن يكون feature_group_count قاسمًا لكل من سمة الإدخال وسمة الإخراج. إذا كانت قيمة feature_group_count أكبر من 1، يعني ذلك أنّ أبعاد الميزات المدخلة والمخرجة وأبعاد الميزات المخرجة rhs مقسّمة بالتساوي إلى العديد من المجموعات feature_group_count، وتتألف كل مجموعة من تسلسل فرعي متتالٍ من الميزات. يجب أن يكون بُعد ميزة الإدخال rhs مساويًا لبُعد ميزة الإدخال lhs مقسومًا على feature_group_count (وبالتالي، سيكون له حجم مجموعة من ميزات الإدخال). يتم استخدام المجموعات ذات الترتيب i معًا لاحتساب feature_group_count للعديد من الالتفافات المنفصلة. يتم ربط نتائج عمليات الالتفاف هذه معًا في سمة الإخراج.

بالنسبة إلى الالتفاف العميق، سيتم ضبط وسيطة feature_group_count على بُعد ميزة الإدخال، وسيتم إعادة تشكيل الفلتر من [filter_height, filter_width, in_channels, channel_multiplier] إلى [filter_height, filter_width, 1, in_channels * channel_multiplier]. لمزيد من التفاصيل، يمكنك الاطّلاع على tf.nn.depthwise_conv2d.

يمكن استخدام وسيطة batch_group_count (القيمة التلقائية 1) للفلاتر المجمّعة أثناء الانتشار العكسي. يجب أن يكون batch_group_count أحد قواسم حجم سمة الدفعة lhs (الإدخال). إذا كانت قيمة batch_group_count أكبر من 1، يعني ذلك أنّ حجم مجموعة النتائج يجب أن يكون input batch / batch_group_count. يجب أن يكون batch_group_count قاسمًا لحجم الميزة الناتج.

يتضمّن شكل الإخراج الأبعاد التالية، بهذا الترتيب:

  • batch: يجب أن يساوي حجم هذه السمة مضروبًا في batch_group_count حجم السمة batch في الجانب الأيسر.
  • z: الحجم نفسه الذي يظهر به output-z على النواة (rhs)
  • spatial_dims: قيمة واحدة لكل موضع صالح لنافذة الالتفاف.

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

يتم تحديد مواضع النافذة الالتفافية الصالحة من خلال الخطوات وحجم المساحة الأساسية بعد إضافة المساحة المتروكة.

لوصف ما تفعله عملية الالتفاف، لنأخذ عملية التفاف ثنائية الأبعاد، ونختار بعض الإحداثيات الثابتة batch وz وy وx في الناتج. بعد ذلك، (y,x) هو موضع إحدى زوايا النافذة ضمن المساحة الأساسية (مثل الزاوية العلوية اليسرى، حسب طريقة تفسيرك للأبعاد المكانية). لدينا الآن نافذة ثنائية الأبعاد، مأخوذة من المساحة الأساسية، حيث ترتبط كل نقطة ثنائية الأبعاد بمتّجه أحادي الأبعاد، وبالتالي نحصل على مربّع ثلاثي الأبعاد. من النواة الالتفافية، بما أنّنا ثبّتنا الإحداثي الناتج z، لدينا أيضًا مربّع ثلاثي الأبعاد. للمربّعين الأبعاد نفسها، لذا يمكننا جمع حاصل ضرب العناصر المتناظرة بين المربّعين (على غرار الجداء النقطي). هذه هي قيمة الناتج.

يُرجى العِلم أنّه إذا كان output-z مثلاً ‫5، سيؤدي كل موضع في النافذة إلى إنشاء 5 قيم في الناتج ضمن السمة z للناتج. تختلف هذه القيم في الجزء المستخدَم من النواة الالتفافية، إذ يتوفّر مربّع ثلاثي الأبعاد منفصل من القيم المستخدَمة لكل إحداثي output-z. ويمكنك اعتبارها 5 عمليات التفاف منفصلة مع فلتر مختلف لكل منها.

في ما يلي رمز زائف لالتفاف ثنائي الأبعاد مع الحشو والخطوة:

for (b, oz, oy, ox) { // output coordinates
  value = 0;
  for (iz, ky, kx) { // kernel coordinates and input z
    iy = oy*stride_y + ky - pad_low_y;
    ix = ox*stride_x + kx - pad_low_x;
    if ((iy, ix) inside the base area considered without padding) {
      value += input(b, iz, iy, ix) * kernel(oz, iz, ky, kx);
    }
  }
  output(b, oz, oy, ox) = value;
}

يُستخدَم precision_config للإشارة إلى إعدادات الدقة. يحدّد المستوى ما إذا كان يجب أن تحاول الأجهزة إنشاء المزيد من تعليمات الرموز البرمجية للآلة لتوفير محاكاة أكثر دقة لنوع البيانات عند الحاجة (أي محاكاة f32 على وحدة معالجة Tensor Processing Unit التي لا تتوافق إلا مع عمليات ضرب المصفوفات bf16). يمكن أن تكون القيم DEFAULT أو HIGH أو HIGHEST. تفاصيل إضافية في أقسام MXU

preferred_element_type هو عنصر عددي من أنواع الإخراج ذات الدقة الأعلى/الأدنى المستخدَمة للتجميع. تقترح السمة preferred_element_type نوع التجميع للعملية المحدّدة، ولكنّ ذلك ليس مضمونًا. يتيح ذلك لبعض برامج الخلفية للأجهزة تجميع البيانات في نوع مختلف وتحويلها إلى نوع الإخراج المفضّل.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - الالتفاف.

ConvWithGeneralPadding

يمكنك الاطّلاع أيضًا على XlaBuilder::ConvWithGeneralPadding.

ConvWithGeneralPadding(lhs, rhs, window_strides, padding, feature_group_count, batch_group_count, precision_config, preferred_element_type)

كما هو الحال في Conv حيث يكون إعداد المساحة المتروكة صريحًا.

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة ذات (n+2) بُعد للإدخالات
rhs XlaOp مصفوفة ذات (n+2) بُعد لأوزان النواة
window_strides ArraySlice<int64> مصفوفة ذات n أبعاد لخطوات النواة
padding ArraySlice< pair<int64,int64>> مصفوفة n-d من (منخفض، مرتفع) حشو
feature_group_count int64 عدد مجموعات الميزات
batch_group_count int64 عدد مجموعات الدفعات
precision_config اختياري PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد لنوع العنصر العددي

ConvWithGeneralDimensions

يمكنك الاطّلاع أيضًا على XlaBuilder::ConvWithGeneralDimensions.

ConvWithGeneralDimensions(lhs, rhs, window_strides, padding, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type)

هي نفسها Conv حيث تكون أرقام السمات واضحة.

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة إدخالات ذات (n+2) بُعد
rhs XlaOp مصفوفة أوزان النواة ذات (n+2) بُعد
window_strides ArraySlice<int64> مصفوفة n-d من خطوات النواة
padding Padding تعداد المساحة المتروكة
dimension_numbers ConvolutionDimensionNumbers عدد السمات
feature_group_count int64 عدد مجموعات الميزات
batch_group_count int64 عدد مجموعات الدفعات
precision_config اختياري PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد نوع العنصر العددي

ConvGeneral

يمكنك الاطّلاع أيضًا على XlaBuilder::ConvGeneral.

ConvGeneral(lhs, rhs, window_strides, padding, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type)

كما هو الحال في Conv حيث تكون أرقام السمات وإعدادات المساحة المتروكة محدّدة بوضوح

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة إدخالات ذات (n+2) بُعد
rhs XlaOp مصفوفة أوزان النواة ذات (n+2) بُعد
window_strides ArraySlice<int64> مصفوفة n-d من خطوات النواة
padding ArraySlice< pair<int64,int64>> مصفوفة n-d من (منخفض، مرتفع) الحشو
dimension_numbers ConvolutionDimensionNumbers عدد السمات
feature_group_count int64 عدد مجموعات الميزات
batch_group_count int64 عدد مجموعات الدفعات
precision_config اختياري PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد نوع العنصر العددي

ConvGeneralDilated

يمكنك الاطّلاع أيضًا على XlaBuilder::ConvGeneralDilated.

ConvGeneralDilated(lhs, rhs, window_strides, padding, lhs_dilation, rhs_dilation, dimension_numbers, feature_group_count, batch_group_count, precision_config, preferred_element_type, window_reversal)

هي نفسها Conv حيث تكون إعدادات المساحة المتروكة وعوامل التمدد وأرقام الأبعاد واضحة.

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة إدخالات ذات (n+2) بُعد
rhs XlaOp مصفوفة أوزان النواة ذات (n+2) بُعد
window_strides ArraySlice<int64> مصفوفة n-d من خطوات النواة
padding ArraySlice< pair<int64,int64>> مصفوفة n-d من (منخفض، مرتفع) الحشو
lhs_dilation ArraySlice<int64> n-d lhs dilation factor array
rhs_dilation ArraySlice<int64> n-d rhs dilation factor array
dimension_numbers ConvolutionDimensionNumbers عدد السمات
feature_group_count int64 عدد مجموعات الميزات
batch_group_count int64 عدد مجموعات الدفعات
precision_config اختياري PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد نوع العنصر العددي
window_reversal اختياري vector<bool> علامة تُستخدَم لعكس السمة بشكل منطقي قبل تطبيق الالتفاف

نسخ

يمكنك الاطّلاع أيضًا على HloInstruction::CreateCopyStart.

يتم تقسيم Copy داخليًا إلى تعليمتَي HLO هما CopyStart وCopyDone. تعمل Copy وCopyStart وCopyDone كعناصر أساسية في HLO. قد تظهر هذه العمليات في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

Cos

راجِع أيضًاXlaBuilder::Cos.

جيب التمام العنصري x -> cos(x)

Cos(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة Cos أيضًا الوسيطة الاختيارية result_accuracy:

Cos(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - cosine.

عصا

يمكنك الاطّلاع أيضًا على XlaBuilder::Cosh.

جيب التمام الزائدي لكل عنصر x -> cosh(x)

Cosh(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة cosh أيضًا استخدام الوسيطة الاختيارية result_accuracy:

Cosh(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

CustomCall

يمكنك الاطّلاع أيضًا على XlaBuilder::CustomCall.

استدعاء دالة يقدّمها المستخدم ضمن عملية حسابية

تتوفّر مستندات CustomCall في تفاصيل المطوّر - مكالمات XLA المخصّصة.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - custom_call.

درجة

يمكنك الاطّلاع أيضًا على XlaBuilder::Div.

تُجري هذه الدالة عملية قسمة كل عنصر من المقسوم lhs على العنصر المقابل له في المقسوم عليه rhs.

Div(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يؤدي تجاوز سعة قسمة الأعداد الصحيحة (قسمة الأعداد الصحيحة الموقّعة أو غير الموقّعة أو الباقي من القسمة على صفر أو قسمة الأعداد الصحيحة الموقّعة أو الباقي من قسمة INT_SMIN على -1) إلى إنتاج قيمة محددة التنفيذ.

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل من Div يتيح البث بأبعاد مختلفة:

Div(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - divide.

النطاق

يمكنك الاطّلاع أيضًا على HloInstruction::CreateDomain.

قد يظهر Domain في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئه المستخدمون النهائيون يدويًا.

نقطة

يمكنك الاطّلاع أيضًا على XlaBuilder::Dot.

Dot(lhs, rhs, precision_config, preferred_element_type)

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة من النوع T
rhs XlaOp مصفوفة من النوع T
precision_config اختياري PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد لنوع العنصر العددي

تعتمد الدلالات الدقيقة لهذه العملية على ترتيب المعامِلات:

الإدخال الناتج الدلالات
المتّجه [n] dot المتّجه [n] الكمية القياسية الجداء النقطي للمتجه
المصفوفة [m x k] dot المتجه [k] المتّجه [م] ضرب المصفوفة في المتّجه
المصفوفة [m x k] dot المصفوفة [k x n] المصفوفة [m x n] ضرب المصفوفات

تُجري العملية مجموع المنتجات على مستوى البُعد الثاني من lhs (أو البُعد الأول إذا كان يتضمّن بُعدًا واحدًا) والبُعد الأول من rhs. وهي السمات "المتعاقد عليها". يجب أن يكون حجم الأبعاد المختصرة لكل من lhs وrhs متطابقًا. في الواقع، يمكن استخدامها لإجراء ضرب نقطي بين المتجهات أو ضرب متجه/مصفوفة أو ضرب مصفوفة/مصفوفة.

يُستخدَم precision_config للإشارة إلى إعدادات الدقة. يحدّد المستوى ما إذا كان يجب أن تحاول الأجهزة إنشاء المزيد من تعليمات الرموز البرمجية للآلة لتوفير محاكاة أكثر دقة لنوع البيانات عند الحاجة (أي محاكاة f32 على وحدة معالجة Tensor Processing Unit التي لا تتوافق إلا مع عمليات ضرب المصفوفات bf16). يمكن أن تكون القيم DEFAULT أو HIGH أو HIGHEST. تفاصيل إضافية في أقسام MXU

preferred_element_type هو عنصر عددي من أنواع الإخراج ذات الدقة الأعلى/الأدنى المستخدَمة للتجميع. تنصح preferred_element_type باستخدام نوع التجميع للعملية المحدّدة، ولكن ليس مضمونًا أن يكون متاحًا. يتيح ذلك لبعض برامج الخلفية للأجهزة تجميع البيانات في نوع مختلف وتحويلها إلى نوع الإخراج المفضّل.

للحصول على معلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - dot.

DotGeneral

يمكنك الاطّلاع أيضًا على XlaBuilder::DotGeneral.

DotGeneral(lhs, rhs, dimension_numbers, precision_config, preferred_element_type)

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة من النوع T
rhs XlaOp مصفوفة من النوع T
dimension_numbers DotDimensionNumbers أرقام الأبعاد الخاصة بالتعاقدات والدفعات
precision_config اختياري PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد لنوع العنصر القياسي

تشبه هذه السمة Dot، ولكنها تتيح تحديد أرقام أبعاد التعاقد والدفعات لكل من lhs وrhs.

حقول DotDimensionNumbers النوع الدلالات
lhs_contracting_dimensions repeated int64 أرقام سمات lhs
rhs_contracting_dimensions repeated int64 أرقام سمات rhs
lhs_batch_dimensions repeated int64 lhs أرقام سمات الدُفعات
rhs_batch_dimensions repeated int64 rhs أرقام سمات الدُفعات

تُجري DotGeneral مجموع المنتجات على السمات المتناقصة المحدّدة في dimension_numbers.

ليس من الضروري أن تتطابق أرقام سمات التعاقد المرتبطة من lhs وrhs، ولكن يجب أن تتطابق أحجام السمات.

مثال يتضمّن أرقام سمات التعاقد:

lhs = { {1.0, 2.0, 3.0},
        {4.0, 5.0, 6.0} }

rhs = { {1.0, 1.0, 1.0},
        {2.0, 2.0, 2.0} }

DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(1);
dnums.add_rhs_contracting_dimensions(1);

DotGeneral(lhs, rhs, dnums) -> { { 6.0, 12.0},
                                 {15.0, 30.0} }

يجب أن تتطابق أحجام السمات لأرقام سمات الدُفعات المرتبطة من lhs وrhs.

مثال مع أرقام سمات الدُفعات (حجم الدفعة 2، مصفوفات 2x2):

lhs = { { {1.0, 2.0},
          {3.0, 4.0} },
        { {5.0, 6.0},
          {7.0, 8.0} } }

rhs = { { {1.0, 0.0},
          {0.0, 1.0} },
        { {1.0, 0.0},
          {0.0, 1.0} } }

DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(2);
dnums.add_rhs_contracting_dimensions(1);
dnums.add_lhs_batch_dimensions(0);
dnums.add_rhs_batch_dimensions(0);

DotGeneral(lhs, rhs, dnums) -> {
    { {1.0, 2.0},
      {3.0, 4.0} },
    { {5.0, 6.0},
      {7.0, 8.0} } }
الإدخال الناتج الدلالات
[b0, m, k] dot [b0, k, n] [b0, m, n] batch matmul
[b0, b1, m, k] dot [b0, b1, k, n] [b0, b1, m, n] batch matmul

ويترتّب على ذلك أنّ رقم السمة الناتجة يبدأ بسمة الدفعة، ثم السمة lhs غير المجمَّعة/غير الدفعية، وأخيرًا السمة rhs غير المجمَّعة/غير الدفعية.

يُستخدَم precision_config للإشارة إلى إعدادات الدقة. يحدّد المستوى ما إذا كان يجب أن تحاول الأجهزة إنشاء المزيد من تعليمات الرموز البرمجية للآلة لتوفير محاكاة أكثر دقة لنوع البيانات عند الحاجة (أي محاكاة f32 على وحدة معالجة Tensor Processing Unit التي لا تتوافق إلا مع عمليات ضرب المصفوفات bf16). يمكن أن تكون القيم DEFAULT أو HIGH أو HIGHEST. يمكنك الاطّلاع على تفاصيل إضافية في أقسام "تجربة الوسائط المتعددة".

preferred_element_type هو عنصر عددي من أنواع الإخراج ذات الدقة الأعلى/الأدنى المستخدَمة للتجميع. تقترح السمة preferred_element_type نوع التجميع للعملية المحدّدة، ولكنّ ذلك ليس مضمونًا. يتيح ذلك لبعض برامج الخلفية للأجهزة تجميع البيانات في نوع مختلف وتحويلها إلى نوع الإخراج المفضّل.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - dot_general.

ScaledDot

يمكنك الاطّلاع أيضًا على XlaBuilder::ScaledDot.

ScaledDot(lhs, lhs_scale, rhs, rhs_scale, dimension_number, precision_config,preferred_element_type)

الوسيطات النوع الدلالات
lhs XlaOp مصفوفة من النوع T
rhs XlaOp مصفوفة من النوع T
lhs_scale XlaOp مصفوفة من النوع T
rhs_scale XlaOp مصفوفة من النوع T
dimension_number ScatterDimensionNumbers أرقام السمات لعملية التشتيت
precision_config PrecisionConfig تعداد لمستوى الدقة
preferred_element_type اختياري PrimitiveType تعداد نوع العنصر العددي

مشابه لـ DotGeneral

تُنشئ هذه الدالة عملية ضرب نقطي موسّعة مع المعامِلات "lhs" و"lhs_scale" و"rhs" و"rhs_scale"، مع تحديد أبعاد التجميع والدُفعات في "dimension_numbers".

RaggedDot

يمكنك الاطّلاع أيضًا على XlaBuilder::RaggedDot.

للاطّلاع على تفاصيل حول عملية احتساب RaggedDot، يُرجى الاطّلاع على StableHLO - chlo.ragged_dot.

DynamicReshape

يمكنك الاطّلاع أيضًا على XlaBuilder::DynamicReshape.

هذه العملية مطابقة وظيفيًا لعملية reshape، ولكن يتم تحديد شكل النتيجة بشكل ديناميكي من خلال output_shape.

DynamicReshape(operand, dim_sizes, new_size_bounds, dims_are_dynamic)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة N ذات أبعاد من النوع T
dim_sizes متّجه XlaOP أحجام المتجهات ذات الأبعاد N
new_size_bounds متّجه int63 متّجه حدود ذو N بُعد
dims_are_dynamic متّجه bool N dimensional dynamic dim

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - dynamic_reshape.

DynamicSlice

يمكنك الاطّلاع أيضًا على XlaBuilder::DynamicSlice.

تستخرج الدالة DynamicSlice مصفوفة فرعية من مصفوفة الإدخال في dynamic start_indices. يتم تمرير حجم الشريحة في كل بُعد في size_indices، الذي يحدّد نقطة نهاية فواصل الشرائح الحصرية في كل بُعد: [البداية، البداية + الحجم). يجب أن يكون شكل start_indices أحادي الأبعاد، وأن يكون حجم البُعد مساويًا لعدد أبعاد operand.

DynamicSlice(operand, start_indices, slice_sizes)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة N ذات أبعاد من النوع T
start_indices تسلسل N XlaOp قائمة تضم N عددًا صحيحًا عدديًا أصغر من 0x0A تحتوي على فهارس البداية لشريحة كل بُعد. يجب أن تكون القيمة أكبر من صفر أو تساويه.
size_indices ArraySlice<int64> قائمة بأعداد صحيحة N تتضمّن حجم الشريحة لكل بُعد. يجب أن تكون كل قيمة أكبر من صفر، ويجب أن يكون المجموع بين قيمة البداية والحجم أقل من أو يساوي حجم السمة لتجنُّب الالتفاف حول حجم السمة.

يتم احتساب فهارس الشرائح الفعّالة من خلال تطبيق عملية التحويل التالية لكل فهرس i في [1, N) قبل تنفيذ الشريحة:

start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - slice_sizes[i])

يضمن ذلك أن تكون الشريحة المستخرَجة دائمًا ضمن الحدود بالنسبة إلى صفيف المعامِل. إذا كانت الشريحة ضمن الحدود قبل تطبيق عملية التحويل، لن يكون للتحويل أي تأثير.

مثال أحادي الأبعاد:

let a = {0.0, 1.0, 2.0, 3.0, 4.0};
let s = {2};

DynamicSlice(a, s, {2});
// Result: {2.0, 3.0}

مثال ثنائي الأبعاد:

let b =
{ {0.0,  1.0,  2.0},
  {3.0,  4.0,  5.0},
  {6.0,  7.0,  8.0},
  {9.0, 10.0, 11.0} }
let s = {2, 1}

DynamicSlice(b, s, {2, 2});
//Result:
// { { 7.0,  8.0},
//   {10.0, 11.0} }

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - dynamic_slice.

DynamicUpdateSlice

يمكنك الاطّلاع أيضًا على XlaBuilder::DynamicUpdateSlice.

تنشئ DynamicUpdateSlice نتيجة وهي قيمة مصفوفة الإدخال operand، مع استبدال شريحة update في start_indices. يحدّد شكل update شكل المصفوفة الفرعية للنتيجة التي يتم تعديلها. يجب أن يكون شكل start_indices أحادي الأبعاد، وأن يكون حجم البُعد مساويًا لعدد أبعاد operand.

DynamicUpdateSlice(operand, update, start_indices)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة N ذات أبعاد من النوع T
update XlaOp مصفوفة N ذات أبعاد من النوع T تحتوي على تعديل الشريحة. يجب أن يكون كل بُعد من أبعاد شكل التعديل أكبر من الصفر، ويجب أن يكون المجموع start + update أقل من أو يساوي حجم المعامِل لكل بُعد لتجنُّب إنشاء فهارس تعديل خارج النطاق.
start_indices تسلسل N XlaOp قائمة تضم N عددًا صحيحًا عدديًا أصغر من 0x0A تحتوي على فهارس البداية لشريحة كل بُعد. يجب أن تكون القيمة أكبر من صفر أو تساويه.

يتم احتساب فهارس الشرائح الفعّالة من خلال تطبيق عملية التحويل التالية لكل فهرس i في [1, N) قبل تنفيذ الشريحة:

start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - update.dimension_size[i])

يضمن ذلك أن يكون الجزء المعدَّل دائمًا ضمن حدود مصفوفة المعامِلات. إذا كانت الشريحة ضمن الحدود قبل تطبيق عملية التحويل، لن يكون للتحويل أي تأثير.

مثال أحادي الأبعاد:

let a = {0.0, 1.0, 2.0, 3.0, 4.0}
let u = {5.0, 6.0}
let s = {2}

DynamicUpdateSlice(a, u, s)
// Result: {0.0, 1.0, 5.0, 6.0, 4.0}

مثال ثنائي الأبعاد:

let b =
{ {0.0,  1.0,  2.0},
  {3.0,  4.0,  5.0},
  {6.0,  7.0,  8.0},
  {9.0, 10.0, 11.0} }
let u =
{ {12.0, 13.0},
  {14.0, 15.0},
  {16.0, 17.0} }

let s = {1, 1}

DynamicUpdateSlice(b, u, s)
// Result:
// { {0.0,  1.0,  2.0},
//   {3.0, 12.0, 13.0},
//   {6.0, 14.0, 15.0},
//   {9.0, 16.0, 17.0} }

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - dynamic_update_slice.

Erf

يمكنك الاطّلاع أيضًا على XlaBuilder::Erf.

دالة الخطأ لكل عنصر x -> erf(x) حيث:

\(\text{erf}(x) = \frac{2}{\sqrt{\pi} }\int_0^x e^{-t^2} \, dt\).

Erf(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة Erf أيضًا استخدام الوسيطة الاختيارية result_accuracy:

Erf(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

ينتهي في

يمكنك الاطّلاع أيضًا على XlaBuilder::Exp.

الدالة الأسية الطبيعية لكل عنصر x -> e^x

Exp(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح Exp أيضًا استخدام الوسيطة الاختيارية result_accuracy:

Exp(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - exponential.

Expm1

يمكنك الاطّلاع أيضًا على XlaBuilder::Expm1.

قيمة الأس الطبيعي لكل عنصر مطروحًا منها واحد x -> e^x - 1

Expm1(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة Expm1 أيضًا استخدام الوسيطة الاختيارية result_accuracy:

Expm1(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - exponential_minus_one.

Fft

يمكنك الاطّلاع أيضًا على XlaBuilder::Fft.

تنفّذ عملية XLA FFT تحويلات فورييه المباشرة والعكسية للمدخلات والمخرجات الحقيقية والمركّبة. تتوفّر تحويلات فورييه السريعة المتعدّدة الأبعاد على ما يصل إلى 3 محاور.

Fft(operand, ftt_type, fft_length)

الوسيطات النوع الدلالات
operand XlaOp المصفوفة التي نريد إجراء تحويل فورييه عليها.
fft_type FftType اطّلِع على الجدول التالي لمزيد من المعلومات.
fft_length ArraySlice<int64> أطوال النطاق الزمني للمحاور التي يتم تحويلها هذا الإجراء ضروري بشكل خاص لعملية IRFFT من أجل تحديد الحجم المناسب للمحور الأقرب، لأنّ RFFT(fft_length=[16]) له شكل الإخراج نفسه مثل RFFT(fft_length=[17]).
FftType الدلالات
FFT تحويل فورييه السريع من الأعداد المركّبة إلى الأعداد المركّبة لم يتم تغيير الشكل.
IFFT تحويل فورييه السريع المعقّد إلى المعقّد المعكوس لم يتم تغيير الشكل.
RFFT تحويل فورييه السريع من الأعداد الحقيقية إلى الأعداد المركّبة يتم تقليل شكل المحور الأقرب إلى fft_length[-1] // 2 + 1 إذا كانت fft_length[-1] قيمة غير صفرية، مع حذف الجزء المعكوس المترافق من الإشارة المحوَّلة بعد تردد Nyquist.
IRFFT تحويل FFT من عدد حقيقي إلى عدد مركّب معكوس (أي يأخذ عددًا مركّبًا ويعرض عددًا حقيقيًا) يتم توسيع شكل المحور الأقرب إلى fft_length[-1] إذا كانت fft_length[-1] قيمة غير صفرية، ما يشير إلى جزء الإشارة المحوَّلة الذي يتجاوز تردد Nyquist من المرافق العكسي للأجزاء من 1 إلى fft_length[-1] // 2 + 1.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - fft.

تحويل فورييه المتعدد الأبعاد

عند توفير أكثر من fft_length واحد، يكون ذلك مكافئًا لتطبيق سلسلة من عمليات تحويل فورييه السريع على كل محور من المحاور الداخلية. يُرجى العِلم أنّه في الحالتين real->complex وcomplex->real، يتم إجراء تحويل المحور الأقرب (فعليًا) أولاً (RFFT؛ آخر تحويل في IRFFT)، ولهذا السبب يكون المحور الأقرب هو المحور الذي يتغير حجمه. بعد ذلك، ستكون عمليات تحويل المحاور الأخرى معقّدة->معقّدة.

تفاصيل التنفيذ

تستند عملية تحويل فورييه السريع (FFT) لوحدة المعالجة المركزية إلى TensorFFT من Eigen. تستخدم وحدة معالجة الرسومات (GPU) خوارزمية تحويل فورييه السريع (FFT) من NVIDIA.

الطابق

يمكنك الاطّلاع أيضًا على XlaBuilder::Floor.

الجزء الصحيح من كل عنصر x -> ⌊x⌋.

Floor(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - floor.

فيوجن

يمكنك الاطّلاع أيضًا على HloInstruction::CreateFusion.

تمثّل عملية Fusion تعليمات HLO وتعمل كعنصر أساسي في HLO. قد يظهر هذا الرمز في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئه المستخدمون النهائيون يدويًا.

Gather

تجمع عملية XLA عدة شرائح (كل شريحة بإزاحة وقت تشغيل مختلفة محتملة) من مصفوفة إدخال.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - gather.

الدلالات العامة

يمكنك الاطّلاع أيضًا على XlaBuilder::Gather. للحصول على وصف أكثر وضوحًا، يُرجى الاطّلاع على قسم "الوصف غير الرسمي" أدناه.

gather(operand, start_indices, dimension_numbers, slice_sizes, indices_are_sorted)

الوسيطات النوع الدلالات
operand XlaOp الصفيف الذي نجمع البيانات منه.
start_indices XlaOp مصفوفة تحتوي على فهارس البدء للشرائح التي نجمعها.
dimension_numbers GatherDimensionNumbers البُعد في start_indices الذي "يحتوي" على الفهارس الأولية. يمكنك الاطّلاع أدناه على وصف تفصيلي.
slice_sizes ArraySlice<int64> slice_sizes[i] هي حدود الشريحة في السمة i.
indices_are_sorted bool لتحديد ما إذا كان سيتم ترتيب الفهارس حسب المتصل.

لتسهيل الأمر، نصنّف السمات في مصفوفة الإخراج التي لا تظهر في offset_dims على أنّها batch_dims.

المخرجات هي مصفوفة تتضمّن batch_dims.size + offset_dims.size سمة.

يجب أن تساوي قيمة operand.rank مجموع قيمتَي offset_dims.size وcollapsed_slice_dims.size. يجب أيضًا أن تكون قيمة slice_sizes.size مساوية لقيمة operand.rank.

إذا كانت قيمة index_vector_dim تساوي start_indices.rank، سنعتبر ضمنيًا أنّ start_indices يتضمّن بُعدًا لاحقًا 1 (أي إذا كان شكل start_indices هو [6,7] وكانت قيمة index_vector_dim هي 2، سنعتبر ضمنيًا أنّ شكل start_indices هو [6,7,1]).

يتم احتساب حدود مصفوفة الإخراج على طول السمة i على النحو التالي:

  1. إذا كانت i متوفّرة في batch_dims (أي تساوي batch_dims[k] لبعض k)، نختار حدود السمة المطابقة من start_indices.shape، مع تخطّي index_vector_dim (أي نختار start_indices.shape.dims[k] إذا كان k < index_vector_dim، وstart_indices.shape.dims[k+1] في الحالات الأخرى).

  2. إذا كان i متوفّرًا في offset_dims (أي يساوي offset_dims[k] لبعض k)، نختار الحدّ المطابق من slice_sizes بعد أخذ collapsed_slice_dims في الاعتبار (أي نختار adjusted_slice_sizes[k] حيث adjusted_slice_sizes هو slice_sizes مع إزالة الحدود في الفهارس collapsed_slice_dims).

رياضيًا، يتم حساب فهرس المعامِل In الذي يتوافق مع فهرس الناتج Out على النحو التالي:

  1. ليكن G = { Out[k] for k in batch_dims }. استخدِم G لتقسيم المتّجه S بحيث يكون S[i] = start_indices[Combine(G, i)] حيث إنّ Combine(A, b) تُدرِج b في الموضع index_vector_dim في A. يُرجى العِلم أنّ هذه السمة تكون محددة جيدًا حتى إذا كانت G فارغة: إذا كانت G فارغة، فإنّ S = start_indices.

  2. أنشئ فهرسًا أوليًا، Sin، في operand باستخدام S من خلال توزيع S باستخدام start_index_map. في ما يلي المزيد من التفاصيل:

    1. Sin[start_index_map[k]] = S[k] if k < start_index_map.size.

    2. Sin[_] = 0 في الحالات الأخرى.

  3. أنشئ فهرسًا Oin في operand من خلال توزيع الفهارس في سمات الإزاحة في Out وفقًا لمجموعة collapsed_slice_dims. في ما يلي المزيد من التفاصيل:

    1. Oin[remapped_offset_dims(k)] = Out[offset_dims[k]] if k < offset_dims.size (يتم تحديد remapped_offset_dims أدناه).

    2. Oin[_] = 0 في الحالات الأخرى.

  4. In هي Oin + Sin حيث + هي عملية جمع على مستوى العناصر.

remapped_offset_dims هي دالة رتيبة مع نطاق [0, offset_dims.size) ومدى [0, operand.rank) \ collapsed_slice_dims. لذا، إذا كان، على سبيل المثال، إذا كان offset_dims.size هو 4 وoperand.rank هو 6 وcollapsed_slice_dims هو {0، 2}، فإنّ remapped_offset_dims هو {01، 13، 24، 35}.

في حال ضبط indices_are_sorted على "صحيح"، يمكن أن يفترض XLA أنّ المستخدم رتّب start_indices (ترتيب تصاعدي، بعد توزيع قيمه وفقًا start_index_map). إذا لم تكن كذلك، سيتم تحديد الدلالات حسب التنفيذ.

الوصف غير الرسمي والأمثلة

بشكل غير رسمي، يتطابق كل فهرس Out في مصفوفة الإخراج مع عنصر E في مصفوفة المعامِلات، ويتم حسابه على النحو التالي:

  • نستخدم سمات المجموعة في Out للبحث عن فهرس بدء من start_indices.

  • نستخدم start_index_map لربط الفهرس الأوّلي (الذي قد يكون حجمه أقل من operand.rank) بفهرس أوّلي "كامل" في operand.

  • نقسم بشكل ديناميكي شريحة بحجم slice_sizes باستخدام الفهرس الكامل للبداية.

  • نعيد تشكيل الشريحة من خلال تصغير سمات collapsed_slice_dims. بما أنّه يجب أن يكون لجميع أبعاد الشرائح المصغّرة حدّ يساوي 1، فإنّ عملية إعادة التشكيل هذه تكون صالحة دائمًا.

  • نستخدم أبعاد الإزاحة في Out للفهرسة في هذا الجزء للحصول على عنصر الإدخال E المقابل لفهرس الإخراج Out.

تم ضبط index_vector_dim على start_indices.rank - 1 في جميع الأمثلة التالية. لا تؤدي القيم الأكثر إثارة للاهتمام في index_vector_dim إلى تغيير العملية بشكل أساسي، ولكنها تجعل التمثيل المرئي أكثر صعوبة.

للحصول على فكرة عن كيفية عمل كل ما سبق معًا، لنلقِ نظرة على مثال يجمع 5 شرائح من الشكل [8,6] من مصفوفة [16,11]. يمكن تمثيل موضع شريحة في مصفوفة [16,11] كمتجه فهرس بالشكل S64[2]، وبالتالي يمكن تمثيل مجموعة من 5 مواضع كمصفوفة S64[5,2].

يمكن بعد ذلك وصف سلوك عملية التجميع على أنّه تحويل فهرس يأخذ [G،O0،O1]، وهو فهرس في شكل الإخراج، ويربطه بعنصر في مصفوفة الإدخال بالطريقة التالية:

نختار أولاً متّجه (X,Y) من مصفوفة فهارس التجميع باستخدام G. يكون العنصر في مصفوفة الإخراج عند الفهرس [G,O0,O1] هو العنصر في مصفوفة الإدخال عند الفهرس [X+O0,Y+O1].

slice_sizes هي [8,6]، التي تحدد نطاق O0 وO1، وهذا بدوره يحدد حدود الشريحة.

تعمل عملية التجميع هذه كشريحة ديناميكية مجمّعة مع G كبعد مجمّع.

قد تكون فهارس التجميع متعدّدة الأبعاد. على سبيل المثال، يمكن ترجمة نسخة أكثر عمومية من المثال أعلاه باستخدام مصفوفة "جمع الفهارس" بالشكل [4,5,2] على النحو التالي:

مرة أخرى، يعمل هذا كشريحة ديناميكية مجمّعة G0 وG1 كسمات مجمّعة. لا يزال حجم الشريحة [8,6].

تعمّم عملية التجميع في XLA الدلالات غير الرسمية الموضّحة أعلاه بالطرق التالية:

  1. يمكننا ضبط السمات التي تمثّل سمات الإزاحة في شكل الإخراج (السمات التي تحتوي على O0 وO1 في المثال الأخير). يتم تحديد سمات الدفعة الناتجة (السمات التي تحتوي على G0 وG1 في المثال الأخير) على أنّها سمات ناتجة ليست سمات إزاحة.

  2. قد يكون عدد سمات الإزاحة في الناتج الظاهرة بشكل صريح في شكل الناتج أقل من عدد سمات الإزاحة في الإدخال. يجب أن يكون حجم شريحة الأبعاد "المفقودة"، والتي يتم إدراجها بشكل صريح على أنّها collapsed_slice_dims، هو 1. بما أنّ حجم الشريحة هو 1، فإنّ الفهرس الصالح الوحيد هو 0، ولا يؤدي حذفها إلى حدوث أي غموض.

  3. قد يحتوي الجزء الذي تم استخراجه من مصفوفة "جمع الفهارس" (X وY في المثال الأخير) على عدد أقل من العناصر مقارنةً بعدد سمات مصفوفة الإدخال، ويحدّد الربط الواضح كيفية توسيع الفهرس ليتضمّن عدد السمات نفسه الذي تتضمّنه مصفوفة الإدخال.

كمثال أخير، نستخدم (2) و (3) لتنفيذ tf.gather_nd:

يتم استخدام G0 وG1 لتقسيم فهرس البداية من مصفوفة فهارس التجميع كالمعتاد، باستثناء أنّ فهرس البداية يحتوي على عنصر واحد فقط، وهو X. وبالمثل، هناك فهرس إزاحة واحد فقط للناتج بالقيمة O0. ومع ذلك، قبل استخدامها كفهارس في مصفوفة الإدخال، يتم توسيعها وفقًا لـ "تجميع ربط الفهرس" (start_index_map في الوصف الرسمي) و "ربط الإزاحة" (remapped_offset_dims في الوصف الرسمي) إلى [X,0] و[0,O0] على التوالي، ما يؤدي إلى [X,O0]. بعبارة أخرى، يرتبط فهرس الإخراج [G0,G1,O0] بفهرس الإدخال [GatherIndices[G0,G1,0],O0]، ما يمنحنا دلالات tf.gather_nd.

slice_sizes لهذا الطلب هو [1,11]. ويعني هذا بشكل بديهي أنّ كل فهرس X في مصفوفة فهارس التجميع يختار صفًا كاملاً، والنتيجة هي تسلسل جميع هذه الصفوف.

GetDimensionSize

يمكنك الاطّلاع أيضًا على XlaBuilder::GetDimensionSize.

تعرض هذه الدالة حجم البُعد المحدّد للمعامل. يجب أن يكون المعامِل على شكل مصفوفة.

GetDimensionSize(operand, dimension)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة إدخال ذات n أبعاد
dimension int64 قيمة في الفاصل [0, n) تحدّد السمة

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - get_dimension_size.

GetTupleElement

يمكنك الاطّلاع أيضًا على XlaBuilder::GetTupleElement.

فهارس في مجموعة بقيمة ثابتة في وقت الترجمة

يجب أن تكون القيمة ثابتة في وقت الترجمة حتى يتمكّن استنتاج الشكل من تحديد نوع القيمة الناتجة.

وهذا مشابه لـ std::get<int N>(t) في C++‎. من الناحية النظرية:

let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);
let element_1: s32 = gettupleelement(t, 1); // Inferred shape matches s32.

يمكنك الاطّلاع أيضًا على tf.tuple.

GetTupleElement(tuple_data, index)

الوسيطة النوع الدلالات
tuple_data XlaOP الصف
index int64 فهرس شكل المجموعة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - get_tuple_element.

Imag

يمكنك الاطّلاع أيضًا على XlaBuilder::Imag.

الجزء التخيلي من شكل مركّب (أو حقيقي) على مستوى كل عنصر x -> imag(x). إذا كان المعامِل من نوع النقطة العائمة، يتم عرض 0.

Imag(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - imag.

Infeed

يمكنك الاطّلاع أيضًا على XlaBuilder::Infeed.

Infeed(shape, config)

الوسيطة النوع الدلالات
shape Shape شكل البيانات التي يتم قراءتها من واجهة Infeed يجب ضبط حقل التنسيق الخاص بالشكل ليطابق تنسيق البيانات المرسَلة إلى الجهاز، وإلا سيكون سلوكه غير محدّد.
config اختياري string إعدادات العملية

يقرأ عنصر بيانات واحدًا من واجهة البث الضمني Infeed للجهاز، ويفسّر البيانات على أنّها الشكل المحدّد وتصميمه، ويعرض XlaOp للبيانات. يُسمح بتنفيذ عمليات Infeed متعددة في عملية حسابية واحدة، ولكن يجب أن يكون هناك ترتيب إجمالي بين عمليات Infeed. على سبيل المثال، يكون للرمزين Infeed في الرمز أدناه ترتيب إجمالي لأنّ هناك تبعية بين حلقتَي while.

result1 = while (condition, init = init_value) {
  Infeed(shape)
  }

result2 = while (condition, init = result1) {
  Infeed(shape)
  }

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

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - infeed.

أمواج هادئة قصيرة

يمكنك الاطّلاع أيضًا على XlaBuilder::Iota.

Iota(shape, iota_dimension)

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

الوسيطات النوع الدلالات
shape Shape شكل الصفيف الذي تم إنشاؤه بواسطة Iota()
iota_dimension int64 السمة التي سيتمّ زيادة قيمتها.

على سبيل المثال، تعرض الدالة Iota(s32[4, 8], 0)

[[0, 0, 0, 0, 0, 0, 0, 0 ],
 [1, 1, 1, 1, 1, 1, 1, 1 ],
 [2, 2, 2, 2, 2, 2, 2, 2 ],
 [3, 3, 3, 3, 3, 3, 3, 3 ]]

يمكن إرجاع المشتريات مقابل Iota(s32[4, 8], 1).

[[0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ],
 [0, 1, 2, 3, 4, 5, 6, 7 ]]

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - iota.

IsFinite

يمكنك الاطّلاع أيضًا على XlaBuilder::IsFinite.

تختبر هذه الدالة ما إذا كان كل عنصر من عناصر operand عددًا محدودًا، أي ليس موجبًا أو سالبًا بلا حدود، وليس NaN. تعرض هذه الدالة مصفوفة من قيم PRED بالشكل نفسه كالإدخال، حيث يكون كل عنصر true إذا كان عنصر الإدخال المقابل محدودًا فقط.

IsFinite(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - is_finite.

السجل

يمكنك الاطّلاع أيضًا على XlaBuilder::Log.

اللوغاريتم الطبيعي لكل عنصر x -> ln(x)

Log(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة log أيضًا الوسيط الاختياري result_accuracy:

Log(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - log.

Log1p

يمكنك الاطّلاع أيضًا على XlaBuilder::Log1p.

اللوغاريتم الطبيعي المعدَّل x -> ln(1+x) لكل عنصر

Log1p(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة Log1p أيضًا الوسيط result_accuracy الاختياري:

Log1p(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - log_plus_one.

لوجستي

يمكنك الاطّلاع أيضًا على XlaBuilder::Logistic.

عملية حساب الدالة اللوجستية على مستوى العناصر x -> logistic(x)

Logistic(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة اللوجستية أيضًا الوسيطة الاختيارية result_accuracy:

Logistic(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - logistic.

خريطة

يمكنك الاطّلاع أيضًا على XlaBuilder::Map.

Map(operands..., computation, dimensions)

الوسيطات النوع الدلالات
operands تسلسل N XlaOps مصفوفات N من الأنواع T0..T{N-1}
computation XlaComputation عملية حسابية من النوع T_0, T_1, .., T_{N + M -1} -> S مع N مَعلمات من النوع T وM من أي نوع.
dimensions int64 array مصفوفة سمات الخريطة
static_operands تسلسل N XlaOps عمليات ثابتة لخريطة العمليات

تطبِّق هذه الدالة دالة عددية على مصفوفات operands المحدّدة، ما يؤدي إلى إنشاء مصفوفة بالأبعاد نفسها حيث يكون كل عنصر هو نتيجة الدالة التي تم ربطها بالعناصر المقابلة في المصفوفات المُدخَلة.

الدالة التي تم ربطها هي عملية حسابية عشوائية مع شرط أن تتضمّن N مدخلاً من النوع العددي T ومخرجًا واحدًا من النوع S. يحتوي الناتج على الأبعاد نفسها التي تحتوي عليها المعامِلات، باستثناء أنّه يتم استبدال نوع العنصر T بنوع العنصر S.

على سبيل المثال: Map(op1, op2, op3, computation, par1) تربط elem_out <- computation(elem1, elem2, elem3, par1) بكل فهرس (متعدد الأبعاد) في صفائف الإدخال لإنتاج صفيف الإخراج.

لمزيد من المعلومات حول StableHLO، يمكنك الاطّلاع على StableHLO - map.

الحد الأقصى

يمكنك الاطّلاع أيضًا على XlaBuilder::Max.

تُجري هذه الدالة عملية الحد الأقصى على مستوى العناصر في الموترَين lhs وrhs.

Max(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر إصدار بديل من Max يتوافق مع البث بأبعاد مختلفة:

Max(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - الحد الأقصى.

الحد الأدنى

يمكنك الاطّلاع أيضًا على XlaBuilder::Min.

تُجري عملية الحد الأدنى على مستوى العناصر في lhs وrhs.

Min(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر صيغة بديلة تتوافق مع البث بأبعاد مختلفة للقيمة Min:

Min(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - الحد الأدنى.

Mul

يمكنك الاطّلاع أيضًا على XlaBuilder::Mul.

تُجري هذه الدالة عملية ضرب العناصر المقابلة في lhs وrhs.

Mul(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل من Mul يتوافق مع البث بأبعاد مختلفة:

Mul(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - multiply.

Neg

يمكنك الاطّلاع أيضًا على XlaBuilder::Neg.

النفي على مستوى العناصر x -> -x

Neg(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - negate.

ليس

يمكنك الاطّلاع أيضًا على XlaBuilder::Not.

تمثّل x -> !(x) المعامل المنطقي not (ليس) على مستوى العناصر.

Not(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - not.

OptimizationBarrier

يمكنك الاطّلاع أيضًا على XlaBuilder::OptimizationBarrier.

يمنع أي عملية تحسين من نقل العمليات الحسابية عبر الحاجز.

OptimizationBarrier(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

يضمن تقييم جميع المدخلات قبل أي عوامل تشغيل تعتمد على مخرجات الحاجز.

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - optimization_barrier.

أو

يمكنك الاطّلاع أيضًا على XlaBuilder::Or.

تُجري عملية OR على مستوى العناصر في lhs وrhs .

Or(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر متغير بديل مع إمكانية البث بأبعاد مختلفة للدالة Or:

Or(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - or.

Outfeed

يمكنك الاطّلاع أيضًا على XlaBuilder::Outfeed.

يكتب المدخلات في موجز الخروج.

Outfeed(operand, shape_with_layout, outfeed_config)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T
shape_with_layout Shape تحدّد هذه السمة تنسيق البيانات التي يتم نقلها
outfeed_config string ثابت الإعدادات لتعليمات Outfeed

يمثّل shape_with_layout الشكل المحدّد الذي نريد إخراجه.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - outfeed.

الوسادة

يمكنك الاطّلاع أيضًا على XlaBuilder::Pad.

Pad(operand, padding_value, padding_config)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T
padding_value XlaOp قيمة عددية من النوع T لملء المساحة المضافة
padding_config PaddingConfig مقدار المساحة المتروكة على كلا الحافتين (منخفضة، مرتفعة) وبين عناصر كل بُعد

توسّع هذه الدالة نطاق مصفوفة operand المحدّدة من خلال إضافة مساحة متروكة حول المصفوفة وكذلك بين عناصر المصفوفة باستخدام padding_value المحدّدة. تحدّد هذه السمة مقدار المساحة المتروكة على الحواف والمساحة المتروكة الداخلية لكل بُعد.padding_config

PaddingConfig هو حقل متكرّر من PaddingConfigDimension، ويحتوي على ثلاثة حقول لكل سمة: edge_padding_low وedge_padding_high وinterior_padding.

تحدّد edge_padding_low وedge_padding_high مقدار المساحة المتروكة المضافة في الطرف الأدنى (بجانب الفهرس 0) والطرف الأعلى (بجانب الفهرس الأعلى) لكل بُعد على التوالي. يمكن أن يكون مقدار المساحة المتروكة على الحواف سالبًا، وتشير القيمة المطلقة للمساحة السالبة إلى عدد العناصر التي يجب إزالتها من السمة المحدّدة.

تحدّد interior_padding مقدار المساحة المتروكة بين أي عنصرَين في كل بُعد، ويجب ألا تكون قيمة سالبة. يحدث الحشو الداخلي منطقيًا قبل الحشو على الحواف، لذا في حال كان الحشو على الحواف سالبًا، تتم إزالة العناصر من المعامِل المحشو داخليًا.

لا تؤدي هذه العملية أي إجراء إذا كانت جميع أزواج الحشو على الحواف هي (0, 0) وكانت جميع قيم الحشو الداخلية هي 0. يوضّح الشكل أدناه أمثلة على قيم edge_padding وinterior_padding المختلفة لمصفوفة ثنائية الأبعاد.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - pad.

المَعلمة

يمكنك الاطّلاع أيضًا على XlaBuilder::Parameter.

يمثّل Parameter إدخال وسيطة إلى عملية حسابية.

PartitionID

يمكنك الاطّلاع أيضًا على XlaBuilder::BuildPartitionId.

تُنتج partition_id العملية الحالية.

PartitionID(shape)

الوسيطات النوع الدلالات
shape Shape شكل البيانات

قد يظهر PartitionID في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئه المستخدمون النهائيون يدويًا.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - partition_id.

PopulationCount

يمكنك الاطّلاع أيضًا على XlaBuilder::PopulationCount.

تحسب هذه الدالة عدد البتات التي تم ضبطها في كل عنصر من عناصر operand.

PopulationCount(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - popcnt.

Pow

يمكنك الاطّلاع أيضًا على XlaBuilder::Pow.

تُجري هذه الدالة عملية رفع كل عنصر من عناصر lhs إلى الأس rhs.

Pow(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر إصدار بديل من Pow يتوافق مع البث بأبعاد مختلفة:

Pow(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - power.

Real

يمكنك الاطّلاع أيضًا على XlaBuilder::Real.

الجزء الحقيقي من الشكل المركّب (أو الحقيقي) على مستوى كل عنصر. x -> real(x). إذا كان نوع المعامِل نقطة عائمة، تعرض الدالة Real القيمة نفسها.

Real(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - real.

Recv

يمكنك الاطّلاع أيضًا على XlaBuilder::Recv.

Recv وRecvWithTokens وRecvToHost هي عمليات تعمل كعناصر أساسية للتواصل في HLO. تظهر هذه العمليات عادةً في عمليات تفريغ HLO كجزء من عمليات الإدخال/الإخراج المنخفضة المستوى أو عمليات النقل بين الأجهزة، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

Recv(shape, handle)

الوسيطات النوع الدلالات
shape Shape شكل البيانات المطلوب تلقّيها
handle ChannelHandle معرّف فريد لكل زوج إرسال/استلام

تتلقّى هذه العملية بيانات بالشكل المحدّد من تعليمات Send في عملية حسابية أخرى تشارك معها معرّف القناة نفسه. تعرض هذه الدالة XlaOp للبيانات المستلَمة.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - recv.

RecvDone

يمكنك الاطّلاع أيضًا على HloInstruction::CreateRecv وHloInstruction::CreateRecvDone.

على غرار Send، تمثّل واجهة برمجة التطبيقات الخاصة بالعميل لعملية Recv عملية التواصل المتزامن. ومع ذلك، يتم تقسيم التعليمات داخليًا إلى تعليمتَين من تعليمات HLO (Recv وRecvDone) لتفعيل عمليات نقل البيانات غير المتزامنة.

Recv(const Shape& shape, int64 channel_id)

تخصّص هذه السمة الموارد اللازمة لتلقّي البيانات من تعليمات Send تتضمّن channel_id نفسه. تعرض هذه السمة سياقًا للموارد المخصّصة، وتستخدمه تعليمات RecvDone التالية لانتظار اكتمال عملية نقل البيانات. السياق هو مجموعة من {مخزن مؤقت للاستلام (الشكل)، معرّف الطلب (U32)} ولا يمكن استخدامه إلا من خلال تعليمات RecvDone.

بالنظر إلى السياق الذي تم إنشاؤه بواسطة تعليمات Recv، ينتظر هذا الإجراء إلى أن يكتمل نقل البيانات ويعرض البيانات التي تم تلقّيها.

الحدّ

يمكنك الاطّلاع أيضًا على XlaBuilder::Reduce.

تطبِّق دالة اختزال على صفيف واحد أو أكثر بالتوازي.

Reduce(operands..., init_values..., computation, dimensions_to_reduce)

الوسيطات النوع الدلالات
operands تسلسل N XlaOp مصفوفات N من النوع T_0,..., T_{N-1}
init_values تسلسل N XlaOp تمثّل N قيمًا عددية من النوع T_0,..., T_{N-1}.
computation XlaComputation احتساب النوع T_0,..., T_{N-1}, T_0, ...,T_{N-1} -> Collate(T_0,..., T_{N-1})
dimensions_to_reduce int64 array مصفوفة غير مرتبة من السمات التي سيتم تقليلها.

المكان:

  • يجب أن تكون قيمة N أكبر من أو تساوي 1.
  • يجب أن تكون عملية الحساب "ترابطية تقريبًا" (راجِع ما يلي).
  • يجب أن تتطابق أبعاد جميع مصفوفات الإدخال.
  • يجب أن تشكّل جميع القيم الأولية هوية ضمن computation.
  • إذا كان N = 1، تكون قيمة Collate(T) هي T.
  • إذا كان N > 1، Collate(T_0, ..., T_{N-1}) عبارة عن مجموعة من عناصر N من النوع T.

تقلّل هذه العملية من سمة واحدة أو أكثر لكل صفيف إدخال إلى قيم عددية. عدد أبعاد كل صفيف معروض هو number_of_dimensions(operand) - len(dimensions). يكون الناتج من العملية Collate(Q_0, ..., Q_N) حيث Q_i عبارة عن مصفوفة من النوع T_i، ويتم توضيح أبعادها أدناه.

يُسمح للأنظمة الخلفية المختلفة بإعادة ربط عملية احتساب التخفيض. ويمكن أن يؤدي ذلك إلى اختلافات عددية، لأنّ بعض دوال الاختزال، مثل الجمع، ليست ترابطية بالنسبة إلى الأرقام العشرية. ومع ذلك، إذا كان نطاق البيانات محدودًا، يكون جمع الأعداد العشرية قريبًا بما يكفي من أن يكون ترابطيًا لمعظم الاستخدامات العملية.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - reduce.

أمثلة

عند تقليل عدد العناصر في بُعد واحد في صفيف أحادي الأبعاد واحد يتضمّن القيم [10, 11, 12, 13]، باستخدام دالة تقليل f (هذا هو computation)، يمكن حساب ذلك على النحو التالي:

f(10, f(11, f(12, f(init_value, 13)))

ولكن هناك أيضًا العديد من الاحتمالات الأخرى، مثل

f(init_value, f(f(10, f(init_value, 11)), f(f(init_value, 12), f(init_value, 13))))

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

result_shape <- remove all dims in dimensions from operand_shape

# Iterate over all elements in result_shape. The number of r's here is equal
# to the number of dimensions of the result.
for r0 in range(result_shape[0]), r1 in range(result_shape[1]), ...:
  # Initialize this result element
  result[r0, r1...] <- 0

  # Iterate over all the reduction dimensions
  for d0 in range(dimensions[0]), d1 in range(dimensions[1]), ...:
    # Increment the result element with the value of the operand's element.
    # The index of the operand's element is constructed from all ri's and di's
    # in the right order (by construction ri's and di's together index over the
    # whole operand shape).
    result[r0, r1...] += operand[ri... di]

في ما يلي مثال على تقليل حجم مصفوفة ثنائية الأبعاد (مصفوفة). الشكل يتضمّن بُعدَين، البُعد 0 بحجم 2 والبُعد 1 بحجم 3:

نتائج تقليل الأبعاد 0 أو 1 باستخدام دالة "إضافة":

يُرجى العِلم أنّ نتيجتَي الاختزال هما مصفوفتان أحاديتَا البُعد. يعرض المخطّط البياني أحد العناصر كعمود والآخر كصف لتسهيل العرض فقط.

للحصول على مثال أكثر تعقيدًا، إليك مصفوفة ثلاثية الأبعاد. عدد أبعادها هو 3، والبعد 0 بحجم 4، والبعد 1 بحجم 2، والبعد 2 بحجم 3. للتسهيل، يتم تكرار القيم من 1 إلى 6 في البُعد 0.

على غرار المثال الثنائي الأبعاد، يمكننا تقليل بُعد واحد فقط. إذا قلّلنا البُعد 0، على سبيل المثال، سنحصل على مصفوفة ثنائية الأبعاد تم فيها طيّ جميع القيم في البُعد 0 إلى قيمة عددية:

|  4   8  12 |
| 16  20  24 |

إذا قلّلنا السمة 2، سنحصل أيضًا على مصفوفة ثنائية الأبعاد تم فيها دمج جميع القيم في السمة 2 في قيمة عددية:

| 6  15 |
| 6  15 |
| 6  15 |
| 6  15 |

يُرجى العِلم أنّ الترتيب النسبي بين السمات المتبقية في الإدخال يتم الاحتفاظ به في الإخراج، ولكن قد يتم تعيين أرقام جديدة لبعض السمات (بما أنّ عدد السمات يتغيّر).

يمكننا أيضًا تقليل أبعاد متعددة. تؤدي إضافة سمات تقليل 0 و1 إلى إنشاء مصفوفة أحادية البعد [20, 28, 36].

يؤدي تقليل حجم المصفوفة الثلاثية الأبعاد على جميع أبعادها إلى إنتاج القيمة العددية 84.

Variadic Reduce

عند استخدام N > 1، يكون تطبيق دالة الاختزال أكثر تعقيدًا بعض الشيء، لأنّه يتم تطبيقه في الوقت نفسه على جميع المدخلات. يتم تقديم المعامِلات إلى عملية الحساب بالترتيب التالي:

  • تشغيل القيمة المخفَّضة للمعامل الأول
  • ...
  • تشغيل قيمة مخفَّضة للمعامل رقم N
  • قيمة الإدخال للمعامل الأول
  • ...
  • قيمة الإدخال للعامل الحسابي رقم N

على سبيل المثال، ضع في اعتبارك دالة الاختزال التالية التي يمكن استخدامها لحساب الحد الأقصى وargmax لمصفوفة أحادية البعد بالتوازي:

f: (Float, Int, Float, Int) -> Float, Int
f(max, argmax, value, index):
  if value >= max:
    return (value, index)
  else:
    return (max, argmax)

بالنسبة إلى مصفوفات الإدخال أحادية الأبعاد V = Float[N], K = Int[N] والقيم الأولية I_V = Float, I_K = Int، تكون النتيجة f_(N-1) لعملية الاختزال على مستوى سمة الإدخال الوحيدة مكافئة للتطبيق المتكرّر التالي:

f_0 = f(I_V, I_K, V_0, K_0)
f_1 = f(f_0.first, f_0.second, V_1, K_1)
...
f_(N-1) = f(f_(N-2).first, f_(N-2).second, V_(N-1), K_(N-1))

سيؤدي تطبيق هذا الاختزال على مصفوفة من القيم ومصفوفة من الفهارس التسلسلية (أي iota) إلى تكرار مشترك على المصفوفات، وسيعرض مجموعة تحتوي على القيمة القصوى والفهرس المطابق.

ReducePrecision

يمكنك الاطّلاع أيضًا على XlaBuilder::ReducePrecision.

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

ReducePrecision(operand, exponent_bits, mantissa_bits)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T ذي النقطة العائمة
exponent_bits int32 عدد وحدات البت الخاصة بالأس في التنسيق ذي الدقة المنخفضة
mantissa_bits int32 عدد بتات الجزء الكسري في التنسيق ذي الدقة المنخفضة

والنتيجة هي صفيف من النوع T. يتم تقريب قيم الإدخال إلى أقرب قيمة يمكن تمثيلها باستخدام عدد محدد من بتات الجزء الكسري (باستخدام دلالات "التقريب إلى أقرب عدد زوجي")، ويتم حصر أي قيم تتجاوز النطاق المحدد بعدد بتات الأس في اللانهاية الموجبة أو السالبة. يتم الاحتفاظ بقيم NaN، ولكن قد يتم تحويلها إلى قيم NaN أساسية.

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

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - reduce_precision.

ReduceScatter

يمكنك الاطّلاع أيضًا على XlaBuilder::ReduceScatter.

‫ReduceScatter هي عملية جماعية تنفّذ بشكل فعّال عملية AllReduce ثم توزّع النتيجة بتقسيمها إلى shard_count حزمة على طول scatter_dimension، وتتلقّى النسخة المتماثلة i في مجموعة النسخ المتماثلة الحزمة ith.

ReduceScatter(operand, computation, scatter_dimension, shard_count, replica_groups, channel_id, layout, use_global_device_ids)

الوسيطات النوع الدلالات
operand XlaOp صفيف أو مجموعة غير فارغة من الصفائف لتقليل عدد النسخ المتماثلة.
computation XlaComputation احتساب التخفيض
scatter_dimension int64 السمة المطلوب توزيعها.
shard_count int64 عدد الحِزم المطلوب تقسيمها scatter_dimension
replica_groups ReplicaGroup متّجه المجموعات التي يتم إجراء عمليات التخفيض بينها
channel_id اختياري ChannelHandle معرّف القناة الاختياري للتواصل بين الوحدات
layout اختياري Layout تنسيق الذاكرة الذي يحدّده المستخدم
use_global_device_ids اختياري bool علامة يحدّدها المستخدم
  • عندما يكون operand مجموعة من المصفوفات، يتم تنفيذ عملية reduce-scatter على كل عنصر من عناصر المجموعة.
  • replica_groups هي قائمة بمجموعات النسخ المتماثلة التي يتم إجراء عملية التصغير بينها (يمكن استرداد معرّف النسخة المتماثلة الحالية باستخدام ReplicaId). ويحدّد ترتيب النسخ المتماثلة في كل مجموعة ترتيب توزيع نتيجة عملية التصغير. يجب أن يكون الحقل replica_groups فارغًا (وفي هذه الحالة تنتمي جميع النسخ المتطابقة إلى مجموعة واحدة)، أو أن يحتوي على عدد العناصر نفسه الذي يتضمّنه عدد النسخ المتطابقة. عندما يكون هناك أكثر من مجموعة نسخ متطابقة، يجب أن تكون جميعها بالحجم نفسه. على سبيل المثال، تنفّذ replica_groups = {0, 2}, {1, 3} عملية تقليل بين النسختين المتطابقتين 0 و2، و1 و3، ثم توزع النتيجة.
  • shard_count هو حجم كل مجموعة من النسخ المتماثلة. نحتاج إلى ذلك في الحالات التي تكون فيها replica_groups فارغة. إذا لم يكن replica_groups فارغًا، يجب أن تكون قيمة shard_count مساوية لحجم كل مجموعة من النسخ المتطابقة.
  • يتم استخدام channel_id للتواصل بين الوحدات: يمكن فقط لعمليات reduce-scatter التي لها channel_id نفسها التواصل مع بعضها البعض.
  • layout يمكنك الاطّلاع على xla::shapes للحصول على مزيد من المعلومات حول التنسيقات.
  • use_global_device_ids هي علامة يحدّدها المستخدم. عندما تكون القيمة false(تلقائية)، تكون الأرقام في replica_groups هي ReplicaId عندما تكون true هي replica_groups التي تمثّل معرّفًا عامًا (ReplicaID*partition_count + partition_id). على سبيل المثال:
    • مع نسختَين متطابقتَين و4 أقسام،
    • replica_groups={ {0,1,4,5},{2,3,6,7} } and use_global_device_ids=true
    • group[0] = (0,0), (0,1), (1,0), (1,1)
    • group[1] = (0,2), (0,3), (1,2), (1,3)
    • حيث يمثّل كل زوج (replica_id, partition_id).

شكل الإخراج هو شكل الإدخال مع تصغيره scatter_dimension مرة بمقدار shard_count. على سبيل المثال، إذا كان هناك نسختان طبق الأصل وكانت قيمة المعامِل [1.0, 2.25] و[3.0, 5.25] على التوالي في النسختين، ستكون قيمة الناتج من هذه العملية حيث scatter_dim هي 0، [4.0] للنسخة الأولى و[7.5] للنسخة الثانية.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - reduce_scatter.

ReduceScatter - Example 1 - StableHLO

مثال على عملية ReduceScatter لتدفّق بيانات StableHLO

في المثال أعلاه، هناك نسختان طبق الأصل تشاركان في عملية ReduceScatter. في كل نسخة طبق الأصل، يكون للمعامل الشكل f32[2,4]. يتم إجراء عملية تقليل شاملة (مجموع) على مستوى النسخ المتماثلة، ما يؤدي إلى إنتاج قيمة مخفَّضة بالشكل f32[2,4] على كل نسخة متماثلة. بعد ذلك، يتم تقسيم هذه القيمة المخفَّضة إلى جزأين على طول البُعد 1، بحيث يكون لكل جزء شكل f32[2,2]. يتلقّى كل نسخة طبق الأصل ضمن مجموعة العمليات الجزء الذي يتوافق مع موضعها في المجموعة. نتيجةً لذلك، يكون الناتج على كل نسخة طبق الأصل بالشكل f32[2,2].

ReduceWindow

يمكنك الاطّلاع أيضًا على XlaBuilder::ReduceWindow.

تطبِّق دالة تقليل على جميع العناصر في كل نافذة من سلسلة من مصفوفات متعددة الأبعاد، ما يؤدي إلى إنتاج مصفوفة واحدة أو مجموعة من مصفوفات N متعددة الأبعاد كناتج. تحتوي كل مصفوفة إخراج على عدد العناصر نفسه الذي يتضمّنه عدد المواضع الصالحة للنافذة. يمكن التعبير عن طبقة التجميع على أنّها ReduceWindow. على غرار Reduce، يتم دائمًا تمرير computation المطبَّق إلى init_values على يمين المعادلة.

ReduceWindow(operands..., init_values..., computation, window_dimensions, window_strides, padding)

الوسيطات النوع الدلالات
operands N XlaOps تسلسل من مصفوفات متعددة الأبعاد من النوع T_0,..., T_{N-1}، يمثّل كل منها مساحة القاعدة التي يتم وضع النافذة عليها.
init_values N XlaOps تمثّل هذه السمة قيم N الأولية لعملية التصغير، قيمة واحدة لكل من معاملات N. لمزيد من التفاصيل، اطّلِع على مقالة التقليل.
computation XlaComputation دالة الاختزال من النوع T_0, ..., T_{N-1}, T_0, ..., T_{N-1} -> Collate(T_0, ..., T_{N-1})، التي سيتم تطبيقها على العناصر في كل نافذة من جميع المعاملات المدخلة.
window_dimensions ArraySlice<int64> مصفوفة أعداد صحيحة لقيم سمات النافذة
window_strides ArraySlice<int64> مصفوفة أعداد صحيحة لقيم خطوة النافذة
base_dilations ArraySlice<int64> صفيف من الأعداد الصحيحة لقيم التمدد الأساسية
window_dilations ArraySlice<int64> مصفوفة أعداد صحيحة لقيم تمديد النافذة
padding Padding نوع الحشو للنافذة (Padding::kSame، الذي يحشو بحيث يكون شكل الإخراج هو نفسه شكل الإدخال إذا كانت الخطوة 1، أو Padding::kValid، الذي لا يستخدم أي حشو و "يوقف" النافذة عندما لا تعود مناسبة)

المكان:

  • يجب أن تكون قيمة N أكبر من أو تساوي 1.
  • يجب أن تتطابق أبعاد جميع مصفوفات الإدخال.
  • إذا كان N = 1، تكون قيمة Collate(T) هي T.
  • إذا كان N > 1، Collate(T_0, ..., T_{N-1}) عبارة عن مجموعة من عناصر N من النوع (T0,...T{N-1}).

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - reduce_window.

ReduceWindow - Example 1

الإدخال هو مصفوفة بحجم [4x6]، وكلا window_dimensions وwindow_stride_dimensions هما [2x3].

// Create a computation for the reduction (maximum).
XlaComputation max;
{
  XlaBuilder builder(client_, "max");
  auto y = builder.Parameter(0, ShapeUtil::MakeShape(F32, {}), "y");
  auto x = builder.Parameter(1, ShapeUtil::MakeShape(F32, {}), "x");
  builder.Max(y, x);
  max = builder.Build().value();
}

// Create a ReduceWindow computation with the max reduction computation.
XlaBuilder builder(client_, "reduce_window_2x3");
auto shape = ShapeUtil::MakeShape(F32, {4, 6});
auto input = builder.Parameter(0, shape, "input");
builder.ReduceWindow(
    input,
    /*init_val=*/builder.ConstantLiteral(LiteralUtil::MinValue(F32)),
    *max,
    /*window_dimensions=*/{2, 3},
    /*window_stride_dimensions=*/{2, 3},
    Padding::kValid);

تشير خطوة مقدارها 1 في أحد الأبعاد إلى أنّ موضع نافذة في البُعد يبعد بمقدار عنصر واحد عن النافذة المجاورة. لتحديد أنّه لا تتداخل أي نوافذ مع بعضها البعض، يجب أن تكون window_stride_dimensions مساوية لـ window_dimensions. يوضّح الشكل أدناه استخدام قيمتَين مختلفتَين للخطوة. يتم تطبيق الحشو على كل بُعد من أبعاد الإدخال، وتكون العمليات الحسابية مماثلة لما لو تم إدخال البيانات بالأبعاد التي تظهر بعد الحشو.

للحصول على مثال غير بسيط على الحشو، ضع في اعتبارك حساب الحد الأدنى لنافذة التصغير (القيمة الأولية هي MAX_FLOAT) باستخدام البُعد 3 والخطوة 2 على مصفوفة الإدخال [10000, 1000, 100, 10, 1]. تحسب عملية الحشو kValid الحد الأدنى على مدى نافذتَين صالحتَين: [10000, 1000, 100] و[100, 10, 1]، ما يؤدي إلى الناتج [100, 1]. تعمل الدالة Padding kSame أولاً على إضافة مساحة إلى المصفوفة بحيث يكون الشكل بعد نافذة التصغير هو نفسه شكل الإدخال للخطوة الواحدة من خلال إضافة عناصر أولية على كلا الجانبين، ما يؤدي إلى الحصول على [MAX_VALUE, 10000, 1000, 100, 10, 1, MAX_VALUE]. يؤدي تنفيذ reduce-window على المصفوفة المكمّلة إلى تشغيل ثلاث نوافذ [MAX_VALUE, 10000, 1000] و[1000, 100, 10] و[10, 1, MAX_VALUE]، وينتج عنه [1000, 10, 1].

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

ReduceWindow - المثال 2 - StableHLO

مثال على عملية ReduceWindow لـ StableHLO

في المثال أعلاه:

الإدخال) يحتوي المعامِل على شكل إدخال S32[3,2]. مع قيم [[1,2],[3,4],[5,6]]

الخطوة 1) يؤدي التمدّد الأساسي مع العامل 2 على طول بُعد الصف إلى إدراج فجوات بين كل صف من المعامِل. يتم تطبيق مساحة متروكة من صفَّين في الأعلى وصف واحد في الأسفل بعد التوسيع. ونتيجةً لذلك، يصبح الموتر أطول.

الخطوة 2) يتم تحديد نافذة بالشكل [2,1]، مع تمديد النافذة [3,1]. وهذا يعني أنّ كل نافذة تختار عنصرَين من العمود نفسه، ولكن يتم أخذ العنصر الثاني بعد ثلاثة صفوف من العنصر الأول بدلاً من أن يكون أسفله مباشرةً.

الخطوة 3) يتم بعد ذلك تمرير النوافذ على المعامِل مع الخطوة [4,1]. يؤدي ذلك إلى نقل النافذة أربعة صفوف للأسفل في كل مرة، مع إزاحة عمود واحد في كل مرة أفقيًا. يتم ملء خلايا المساحة المتروكة بالقيمة init_value (في هذه الحالة init_value = 0)، ويتم تجاهل القيم التي "تندرج" ضمن خلايا التمديد. بسبب الخطوة والحشو، تتداخل بعض النوافذ مع الأصفار والفجوات فقط، بينما تتداخل النوافذ الأخرى مع قيم الإدخال الحقيقية.

الخطوة 4) ضمن كل نافذة، يتم دمج العناصر باستخدام دالة الاختزال (a, b) → a + b، بدءًا من القيمة الأولية 0. لا ترى النافذتان العلويتان سوى المساحات الفارغة والثقوب، لذا تكون النتائج 0. تعرض النوافذ السفلية القيمتين 3 و4 من الإدخال وتعرضهما كنتائج.

النتائج) يكون الناتج النهائي بالشكل S32[2,2]، مع القيم: [[0,0],[3,4]]

Rem

يمكنك الاطّلاع أيضًا على XlaBuilder::Rem.

تعرض هذه الدالة باقي القسمة بين كل عنصر من عناصر المقسوم lhs وعناصر المقسوم عليه rhs.

تُستمد إشارة النتيجة من المقسوم، وتكون القيمة المطلقة للنتيجة دائمًا أقل من القيمة المطلقة للمقسوم عليه.

Rem(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر إصدار بديل من Rem يتوافق مع البث بأبعاد مختلفة:

Rem(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - remainder.

ReplicaId

يمكنك الاطّلاع أيضًا على XlaBuilder::ReplicaId.

تعرِض هذه السمة المعرّف الفريد (عدد صحيح غير سالب من 32 بت) للنسخة المتماثلة.

ReplicaId()

المعرّف الفريد لكل نسخة طبق الأصل هو عدد صحيح غير موقّع في الفترة [0, N)، حيث N هو عدد النسخ المتماثلة. بما أنّ جميع النسخ المتماثلة تشغّل البرنامج نفسه، فإنّ استدعاء ReplicaId() في البرنامج سيعرض قيمة مختلفة على كل نسخة متماثلة.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - replica_id.

تغيير الشكل

يمكنك الاطّلاع أيضًا على XlaBuilder::Reshape. وعملية Collapse

تعيد تشكيل أبعاد الصفيف إلى إعداد جديد.

Reshape(operand, dimensions)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T
dimensions int64 متّجه متّجه أحجام السمات الجديدة

من الناحية المفاهيمية، تعمل الدالة reshape أولاً على تسوية المصفوفة إلى متّجه أحادي البُعد من قيم البيانات، ثم تحسّن هذا المتّجه إلى شكل جديد. وسيطات الإدخال هي مصفوفة عشوائية من النوع T، ومتّجه ثابت في وقت الترجمة يتضمّن فهارس الأبعاد، ومتّجه ثابت في وقت الترجمة يتضمّن أحجام الأبعاد للنتيجة. يحدّد المتّجه dimensions حجم مصفوفة الإخراج. القيمة في الفهرس 0 في dimensions هي حجم السمة 0، والقيمة في الفهرس 1 هي حجم السمة 1، وهكذا. يجب أن يكون ناتج ضرب أبعاد dimensions مساويًا لناتج ضرب أحجام أبعاد المعامِل. عند تحويل المصفوفة المضغوطة إلى مصفوفة متعددة الأبعاد محدّدة بواسطة dimensions، يتم ترتيب الأبعاد في dimensions من الأبطأ تغيرًا (الأكثر أهمية) إلى الأسرع تغيرًا (الأقل أهمية).

على سبيل المثال، لنفترض أنّ v هي مصفوفة من 24 عنصرًا:

let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
                    { {20, 21, 22}, {25, 26, 27} },
                    { {30, 31, 32}, {35, 36, 37} },
                    { {40, 41, 42}, {45, 46, 47} } };

let v012_24 = Reshape(v, {24});
then v012_24 == f32[24] {10, 11, 12, 15, 16, 17, 20, 21, 22, 25, 26, 27,
                         30, 31, 32, 35, 36, 37, 40, 41, 42, 45, 46, 47};

let v012_83 = Reshape(v, {8,3});
then v012_83 == f32[8x3] { {10, 11, 12}, {15, 16, 17},
                          {20, 21, 22}, {25, 26, 27},
                          {30, 31, 32}, {35, 36, 37},
                          {40, 41, 42}, {45, 46, 47} };

في حالة خاصة، يمكن أن تحوّل عملية إعادة التشكيل صفيفًا يتضمّن عنصرًا واحدًا إلى قيمة عددية والعكس صحيح. على سبيل المثال:

Reshape(f32[1x1] { {5} }, {}) == 5;
Reshape(5, {1,1}) == f32[1x1] { {5} };

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - إعادة التشكيل.

تغيير الشكل (صريح)

يمكنك الاطّلاع أيضًا على XlaBuilder::Reshape.

Reshape(shape, operand)

عملية إعادة تشكيل تستخدم شكلاً مستهدفًا صريحًا

الوسيطات النوع الدلالات
shape Shape شكل الإخراج من النوع T
operand XlaOp مصفوفة من النوع T

Rev (عكس)

يمكنك الاطّلاع أيضًا على XlaBuilder::Rev.

Rev(operand, dimensions)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T
dimensions ArraySlice<int64> السمات المطلوب عكس ترتيبها

تعكس هذه الدالة ترتيب العناصر في الصفيف operand على طول dimensions المحدّد، ما يؤدي إلى إنشاء صفيف إخراج بالشكل نفسه. يتم تخزين كل عنصر من عناصر مصفوفة المعامِلات في فهرس متعدّد الأبعاد في مصفوفة الإخراج عند فهرس تم تحويله. يتم تحويل الفهرس المتعدد الأبعاد من خلال عكس الفهرس في كل بُعد سيتم عكسه (أي إذا كان أحد أبعاد الحجم N هو أحد الأبعاد التي سيتم عكسها، سيتم تحويل الفهرس i إلى N - 1 - i).

أحد استخدامات العملية Rev هو عكس مصفوفة أوزان الالتفاف على طول بُعدَي النافذة أثناء حساب التدرّج في الشبكات العصبية.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - reverse.

RngNormal

يمكنك الاطّلاع أيضًا على XlaBuilder::RngNormal.

تنشئ هذه الدالة مصفوفة ناتجة بالشكل المحدّد مع أرقام عشوائية تم إنشاؤها وفقًا \(N(\mu, \sigma)\) للتوزيع الطبيعي. يجب أن يكون للمَعلمتَين \(\mu\) و \(\sigma\)ولشكل الإخراج نوع أساسي من الفاصلة العائمة. يجب أن تكون المَعلمات أيضًا ذات قيمة عددية.

RngNormal(mu, sigma, shape)

الوسيطات النوع الدلالات
mu XlaOp عدد قياسي من النوع T يحدّد متوسط الأرقام التي تم إنشاؤها
sigma XlaOp عدد قياسي من النوع T يحدّد الانحراف المعياري للقيمة التي تم إنشاؤها
shape Shape شكل الإخراج من النوع T

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - rng.

RngUniform

يمكنك الاطّلاع أيضًا على XlaBuilder::RngUniform.

تنشئ هذه الدالة ناتجًا بالشكل المحدّد مع أرقام عشوائية تم إنشاؤها باتّباع التوزيع المنتظم على الفاصل الزمني \([a,b)\). يجب أن يكون نوع المَعلمات ونوع عنصر الإخراج نوعًا منطقيًا أو نوعًا متكاملاً أو نوعًا ذا فاصلة عائمة، ويجب أن تكون الأنواع متسقة. لا تتوافق الخلفيات البرمجية لوحدة المعالجة المركزية ووحدة معالجة الرسومات حاليًا إلا مع F64 وF32 وF16 وBF16 وS64 وU64 وS32 وU32. بالإضافة إلى ذلك، يجب أن تكون المَعلمات ذات قيمة عددية. إذا \(b <= a\) كانت النتيجة محدّدة حسب التنفيذ.

RngUniform(a, b, shape)

الوسيطات النوع الدلالات
a XlaOp عدد قياسي من النوع T يحدّد الحد الأدنى للفترة
b XlaOp عدد قياسي من النوع T يحدّد الحدّ الأعلى للفترة
shape Shape شكل الإخراج من النوع T

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - rng.

RngBitGenerator

يمكنك الاطّلاع أيضًا على XlaBuilder::RngBitGenerator.

تنشئ هذه العملية ناتجًا بالشكل المحدّد مملوءًا بوحدات بت عشوائية موحّدة باستخدام الخوارزمية المحدّدة (أو الإعداد التلقائي للخلفية) وتعرض حالة معدَّلة (بالشكل نفسه للحالة الأولية) والبيانات العشوائية التي تم إنشاؤها.

الحالة الأولية هي الحالة الأولية لإنشاء الرقم العشوائي الحالي. ويعتمد ذلك على الخوارزمية المستخدَمة والشكل المطلوب والقيم الصالحة.

من المضمون أن تكون النتيجة دالة قطعية للحالة الأولية، ولكن لا يمكن ضمان أن تكون قطعية بين الخلفيات وإصدارات مختلفة من المترجم.

RngBitGenerator(algorithm, initial_state, shape)

الوسيطات النوع الدلالات
algorithm RandomAlgorithm خوارزمية مولّد الأرقام العشوائية الزائفة التي سيتم استخدامها
initial_state XlaOp الحالة الأولية لخوارزمية مولّد الأرقام العشوائية الزائفة
shape Shape شكل الإخراج للبيانات التي تم إنشاؤها

القيم المتاحة لـ algorithm:

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - rng_bit_generator.

RngGetAndUpdateState

يمكنك الاطّلاع أيضًا على HloInstruction::CreateRngGetAndUpdateState.

يتم تقسيم واجهة برمجة التطبيقات لعمليات Rng المختلفة داخليًا إلى تعليمات HLO، بما في ذلك RngGetAndUpdateState.

تعمل RngGetAndUpdateState كعنصر أساسي في HLO. قد يظهر هذا الرمز في عمليات تفريغ HLO، ولكن ليس من المفترض أن ينشئه المستخدمون النهائيون يدويًا.

الدورة

يمكنك الاطّلاع أيضًا على XlaBuilder::Round.

التقريب حسب العناصر، مع إبعاد القيم المتساوية عن الصفر

Round(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

RoundNearestAfz

يمكنك الاطّلاع أيضًا على XlaBuilder::RoundNearestAfz.

تنفيذ عملية تقريب على مستوى كل عنصر إلى أقرب عدد صحيح، مع إبعاد القيم المتساوية عن الصفر

RoundNearestAfz(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - round_nearest_afz.

RoundNearestEven

يمكنك الاطّلاع أيضًا على XlaBuilder::RoundNearestEven.

تقريب العناصر، مع ربط القيم المتساوية بأقرب عدد زوجي

RoundNearestEven(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - round_nearest_even.

Rsqrt

يمكنك الاطّلاع أيضًا على XlaBuilder::Rsqrt.

المعاملة المتبادلة لكل عنصر من عناصر عملية الجذر التربيعي x -> 1.0 / sqrt(x).

Rsqrt(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة Rsqrt أيضًا الوسيط الاختياري result_accuracy:

Rsqrt(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعددة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - rsqrt.

فحص

يمكنك الاطّلاع أيضًا على XlaBuilder::Scan.

تطبِّق دالة تقليل على صفيف في بُعد معيّن، ما يؤدي إلى إنشاء حالة نهائية وصفيف من القيم الوسيطة.

Scan(inputs..., inits..., to_apply, scan_dimension, is_reverse, is_associative)

الوسيطات النوع الدلالات
inputs تسلسل m XlaOp مصفوفات البحث
inits تسلسل k XlaOp عمليات النقل الأولية
to_apply XlaComputation عملية حسابية من النوع i_0, ..., i_{m-1}, c_0, ..., c_{k-1} -> (o_0, ..., o_{n-1}, c'_0, ..., c'_{k-1})
scan_dimension int64 السمة التي سيتم البحث فيها.
is_reverse bool إذا كانت القيمة صحيحة، يتم البحث بترتيب عكسي.
is_associative bool (ثلاثي الحالات) إذا كانت القيمة صحيحة، تكون العملية ترابطية.

يتم تطبيق الدالة to_apply بالتسلسل على العناصر في inputs على طول scan_dimension. إذا كانت قيمة is_reverse هي false، تتم معالجة العناصر بالترتيب 0 إلى N-1، حيث N هو حجم scan_dimension. إذا كانت قيمة is_reverse هي true، تتم معالجة العناصر من N-1 إلى 0.

تتضمّن الدالة to_apply معاملات m + k:

  1. m عناصر حالية من inputs
  2. تحمل k قيمًا من الخطوة السابقة (أو inits للعنصر الأول).

تعرض الدالة to_apply صفًا من قيم n + k:

  1. n عناصر من outputs
  2. k قيم جديدة لحقائب السفر

تنتج عملية "الفحص" مجموعة من قيم n + k:

  1. مصفوفات الإخراج n التي تحتوي على قيم الإخراج لكل خطوة
  2. تحمل k القيم النهائية بعد معالجة جميع العناصر.

يجب أن تتطابق أنواع إدخالات m مع أنواع مَعلمات m الأولى في to_apply مع إضافة بُعد مسح ضوئي. يجب أن تتطابق أنواع مخرجات n مع أنواع القيم المعروضة الأولى من n في to_apply مع إضافة بُعد مسح ضوئي. يجب أن يكون حجم البُعد الإضافي للمسح الضوئي بين جميع المدخلات والمخرجات هو N. يجب أن تتطابق أنواع آخر معلَمات k وقيم الإرجاع الخاصة بـ to_apply بالإضافة إلى عمليات تهيئة k.

على سبيل المثال (m, n, k == 1, N == 3)، بالنسبة إلى قيمة الحمل الأولية i، أدخِل [a, b, c]، الدالة f(x, c) -> (y, c')، وscan_dimension=0، is_reverse=false:

  • الخطوة 0: f(a, i) -> (y0, c0)
  • الخطوة 1: f(b, c0) -> (y1, c1)
  • الخطوة 2: f(c, c1) -> (y2, c2)

ناتج Scan هو ([y0, y1, y2], c2).

رسم بياني للنقاط المبعثرة

يمكنك الاطّلاع أيضًا على XlaBuilder::Scatter.

تنشئ عملية التشتيت في XLA تسلسلاً من النتائج التي تمثّل قيم الصفيف الإدخال operands، مع تعديل عدة شرائح (في الفهارس المحدّدة بواسطة scatter_indices) باستخدام تسلسل القيم في updates باستخدام update_computation.

Scatter(operands..., scatter_indices, updates..., update_computation, dimension_numbers, indices_are_sorted, unique_indices)

الوسيطات النوع الدلالات
operands تسلسل N XlaOp مصفوفات N من النوع T_0, ..., T_N سيتم توزيعها.
scatter_indices XlaOp مصفوفة تحتوي على فهارس البدء للشرائح التي يجب توزيعها.
updates تسلسل N XlaOp مصفوفات N من النوع T_0, ..., T_N يحتوي updates[i] على القيم التي يجب استخدامها لتشتيت operands[i].
update_computation XlaComputation عملية الحساب التي سيتم استخدامها لدمج القيم الحالية في مصفوفة الإدخال والتعديلات أثناء التوزيع يجب أن يكون هذا الحساب من النوع T_0, ..., T_N, T_0, ..., T_N -> Collate(T_0, ..., T_N).
index_vector_dim int64 السمة في scatter_indices التي تحتوي على فهارس البدء
update_window_dims ArraySlice<int64> مجموعة السمات في شكل updates التي تمثّل أبعاد النافذة.
inserted_window_dims ArraySlice<int64> مجموعة أبعاد النافذة التي يجب إدراجها في شكل updates.
scatter_dims_to_operand_dims ArraySlice<int64> خريطة أبعاد من مؤشرات التشتت إلى مساحة مؤشر المعامِل. يتم تفسير هذا الصفيف على أنّه ربط بين i وscatter_dims_to_operand_dims[i] . يجب أن تكون النسبة بينهما متطابقة تمامًا.
dimension_number ScatterDimensionNumbers أرقام السمات لعملية التشتيت
indices_are_sorted bool لتحديد ما إذا كان سيتم ترتيب الفهارس حسب المتصل أم لا.
unique_indices bool تحديد ما إذا كان المتصل يضمن أن تكون الفهارس فريدة.

المكان:

  • يجب أن تكون قيمة N أكبر من أو تساوي 1.
  • يجب أن تتضمّن جميع السمات operands[0]، ...، operands[N-1] الأبعاد نفسها.
  • يجب أن تتضمّن جميع السمات updates[0]، ...، updates[N-1] الأبعاد نفسها.
  • إذا كان N = 1، تكون قيمة Collate(T) هي T.
  • إذا كان N > 1، Collate(T_0, ..., T_N) عبارة عن مجموعة من عناصر N من النوع T.

إذا كانت index_vector_dim تساوي scatter_indices.rank، نعتبر ضمنيًا أنّ scatter_indices يتضمّن بُعدًا لاحقًا 1.

نعرّف update_scatter_dims من النوع ArraySlice<int64> على أنّه مجموعة الأبعاد في شكل updates التي لا تقع في update_window_dims، بترتيب تصاعدي.

يجب أن تلتزم وسيطات الدالة scatter بالقيود التالية:

  • يجب أن تحتوي كل مصفوفة updates على update_window_dims.size + scatter_indices.rank - 1 أبعاد.

  • يجب أن تتوافق حدود السمة i في كل مصفوفة updates مع ما يلي:

    • إذا كان i متوفّرًا في update_window_dims (أي يساوي update_window_dims[k] لبعض قيم k)، يجب ألا يتجاوز الحدّ الأقصى للسمة i في updates الحدّ الأقصى المقابل لـ operand بعد أخذ inserted_window_dims في الاعتبار (أي adjusted_window_bounds[k]، حيث يحتوي adjusted_window_bounds على الحدود القصوى لـ operand مع إزالة الحدود القصوى في الفهارس inserted_window_dims).
    • إذا كانت i متوفّرة في update_scatter_dims (أي تساوي update_scatter_dims[k] لبعض قيم k)، يجب أن يكون الحدّ الخاص بالسمة i في updates مساويًا للحدّ المقابل في scatter_indices، مع تخطّي index_vector_dim (أي scatter_indices.shape.dims[k]، إذا كانت k < index_vector_dim وscatter_indices.shape.dims[k+1] في الحالات الأخرى).
  • يجب أن يكون update_window_dims بترتيب تصاعدي، وألا يتضمّن أي أرقام أبعاد مكرّرة، وأن يكون ضمن النطاق [0, updates.rank).

  • يجب أن يكون inserted_window_dims بترتيب تصاعدي، وألا يتضمّن أي أرقام أبعاد مكرّرة، وأن يكون ضمن النطاق [0, operand.rank).

  • يجب أن تساوي قيمة operand.rank مجموع قيمتَي update_window_dims.size وinserted_window_dims.size.

  • يجب أن تكون قيمة scatter_dims_to_operand_dims.size مساويةً لقيمة scatter_indices.shape.dims[index_vector_dim]، ويجب أن تكون قيمهما ضمن النطاق [0, operand.rank).

بالنسبة إلى الفهرس U في كل مصفوفة updates، يتم احتساب الفهرس I المقابل في مصفوفة operands المقابلة التي يجب تطبيق هذا التعديل عليها على النحو التالي:

  1. ليكن G = { U[k] for k in update_scatter_dims }. استخدِم G للبحث عن متجه فهرس S في مصفوفة scatter_indices بحيث يكون S[i] = scatter_indices[Combine(G, i)] حيث تُدرج الدالة Combine(A, b) القيمة b في المواضع index_vector_dim في A.
  2. أنشئ فهرسًا Sin في operand باستخدام S من خلال التوزيع S باستخدام خريطة scatter_dims_to_operand_dims. بشكل أكثر رسمية:
    1. Sin[scatter_dims_to_operand_dims[k]] = S[k] if k < scatter_dims_to_operand_dims.size.
    2. Sin[_] = 0 في الحالات الأخرى.
  3. أنشئ فهرسًا Win في كل مصفوفة operands من خلال توزيع الفهارس في update_window_dims في U وفقًا لـ inserted_window_dims. بشكل أكثر رسمية:
    1. Win[window_dims_to_operand_dims(k)] = U[k] if k is in update_window_dims، حيث window_dims_to_operand_dims هي الدالة الرتيبة ذات المجال [0, update_window_dims.size) والنطاق [0, operand.rank) \ inserted_window_dims. (على سبيل المثال، إذا كانت قيمة update_window_dims.size هي 4، وقيمة operand.rank هي 6، وقيمة inserted_window_dims هي {0، 2}، ستكون قيمة window_dims_to_operand_dims هي {01، 13، 24، 35}).
    2. Win[_] = 0 في الحالات الأخرى.
  4. I هي Win + Sin حيث + هي عملية جمع على مستوى العناصر.

باختصار، يمكن تعريف عملية التشتيت على النحو التالي.

  • اضبط قيمة output على operands، أي لكل الفهارس J، ولكل الفهارس O في المصفوفة operands[J]:
    output[J][O] = operands[J][O]
  • لكل فهرس U في المصفوفة updates[J] والفهرس المقابل O في المصفوفة operand[J]، إذا كان O فهرسًا صالحًا لـ output:
    (output[0][O], ..., output[N-1][O]) =update_computation(output[0][O], ..., ,output[N-1][O],updates[0][U], ...,updates[N-1][U])

إنّ ترتيب تطبيق التحديثات غير محدّد. لذلك، عندما تشير فهارس متعدّدة في updates إلى الفهرس نفسه في operands، ستكون القيمة المقابلة في output غير قطعية.

يُرجى العِلم أنّ المَعلمة الأولى التي يتم تمريرها إلى update_computation ستكون دائمًا القيمة الحالية من الصفيفة output، وستكون المَعلمة الثانية دائمًا القيمة من الصفيفة updates. ويكون ذلك مهمًا بشكل خاص في الحالات التي لا تكون فيها update_computation تبادلية.

في حال ضبط indices_are_sorted على "صحيح"، يمكن أن يفترض XLA أنّ المستخدم رتّب scatter_indices (ترتيبًا تصاعديًا، بعد توزيع القيم وفقًا scatter_dims_to_operand_dims). إذا لم تكن كذلك، يتم تحديد الدلالات حسب التنفيذ.

إذا تم ضبط unique_indices على "صحيح"، يمكن أن يفترض XLA أنّ جميع العناصر الموزّعة فريدة. لذا، يمكن أن تستخدم XLA عمليات غير ذرية. إذا تم ضبط unique_indices على "صحيح" وكانت الفهارس التي يتم توزيعها غير فريدة، سيتم تحديد الدلالات حسب التنفيذ.

بشكل غير رسمي، يمكن اعتبار عملية التوزيع عكسًا لعملية التجميع، أي أنّ عملية التوزيع تعدّل العناصر في الإدخال التي يتم استخراجها بواسطة عملية التجميع المقابلة.

للحصول على وصف غير رسمي مفصّل وأمثلة، يُرجى الرجوع إلى قسم "الوصف غير الرسمي" ضمن Gather.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - scatter.

Scatter - Example 1 - StableHLO

مثال على عملية نقل بيانات Scatter في StableHLO

في الصورة أعلاه، يمثّل كل صف في الجدول مثالاً على فهرس تعديل واحد. لنراجع الخطوات من اليسار(فهرس التعديل) إلى اليمين(فهرس النتائج):

يحتوي الإدخال) input على الشكل S32[2,3,4,2]. يجب أن يكون لتنسيق scatter_indices الشكل S64[2,2,3,2]. updates لها الشكل S32[2,2,3,1,2].

تعديل الفهرس) كجزء من المدخلات التي يتم تزويدنا بها update_window_dims:[3,4]. يخبرنا ذلك أنّ السمتَين 3 و4 في updates هما أبعاد النافذة، وتم تمييزهما باللون الأصفر. يتيح لنا ذلك استنتاج أنّ update_scatter_dims = [0,1,2].

تعديل مؤشر التشتت) يعرض لنا updated_scatter_dims لكل منها. (اللون غير الأصفر لعمود "تعديل الفهرس")

فهرس البداية) عند النظر إلى صورة scatter_indices tensor، يمكننا أن نرى أنّ القيم من الخطوة السابقة (تعديل فهرس التشتت) تمنحنا موقع فهرس البداية. من index_vector_dim، نعرف أيضًا بُعد starting_indices الذي يحتوي على فهارس البداية، وهو البُعد 3 بحجم 2 في scatter_indices.

يخبرنا (Full Start Index) scatter_dims_to_operand_dims = [2,1] أنّ العنصر الأول من متجه الفهرس ينتقل إلى البُعد 2 الخاص بالمعامل. يتم نقل العنصر الثاني من متّجه الفهرس إلى البُعد 1 الخاص بالمعامل. يتم ملء أبعاد المعامِل المتبقية بالقيمة 0.

مؤشر التجميع الكامل) يمكننا أن نرى المنطقة المميّزة باللون الأرجواني معروضة في هذا العمود(مؤشر التجميع الكامل) وعمود مؤشر التشتت للتعديل وعمود مؤشر التعديل.

مؤشر ملء الشاشة) يتم احتسابه من update_window_dimensions [3,4].

فهرس النتيجة) هو مجموع فهرس البداية الكامل وفهرس التجميع الكامل وفهرس النافذة الكاملة في موتر operand. لاحظ أنّ المناطق المميّزة باللون الأخضر تتوافق مع الشكل operand أيضًا. تم تخطّي الصف الأخير لأنّه يقع خارج موتر operand.

اختيار

يمكنك الاطّلاع أيضًا على XlaBuilder::Select.

تنشئ هذه الدالة مصفوفة إخراج من عناصر مصفوفتَي إدخال، استنادًا إلى قيم مصفوفة مسند.

Select(pred, on_true, on_false)

الوسيطات النوع الدلالات
pred XlaOp مصفوفة من النوع PRED
on_true XlaOp مصفوفة من النوع T
on_false XlaOp مصفوفة من النوع T

يجب أن يكون للمصفوفتَين on_true وon_false الشكل نفسه. وهذا هو أيضًا شكل مصفوفة الإخراج. يجب أن يكون للمصفوفة pred عدد الأبعاد نفسه كما هو الحال في on_true وon_false، مع نوع العنصر PRED.

بالنسبة إلى كل عنصر P من pred، يتم أخذ العنصر المقابل من مصفوفة الإخراج من on_true إذا كانت قيمة P هي true، ومن on_false إذا كانت قيمة P هي false. بما أنّ pred هو شكل مقيّد من البث، يمكن أن يكون pred عددًا قياسيًا من النوع PRED. في هذه الحالة، يتم أخذ مصفوفة الإخراج بالكامل من on_true إذا كانت قيمة pred هي true، ومن on_false إذا كانت قيمة pred هي false.

مثال على pred غير عددي:

let pred: PRED[4] = {true, false, false, true};
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 200, 300, 4};

مثال باستخدام pred:

let pred: PRED = true;
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 2, 3, 4};

يمكن إجراء عمليات اختيار بين الصفوف. تُعد المجموعات الثنائية من الأنواع العددية لهذا الغرض. إذا كان on_true وon_false عبارة عن مجموعات (يجب أن يكون لها الشكل نفسه)، يجب أن يكون pred عددًا قياسيًا من النوع PRED.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - select.

SelectAndScatter

يمكنك الاطّلاع أيضًا على XlaBuilder::SelectAndScatter.

يمكن اعتبار هذه العملية عملية مركّبة تحسب أولاً ReduceWindow على مصفوفة operand لاختيار عنصر من كل نافذة، ثم تنثر مصفوفة source على فهارس العناصر المحدّدة لإنشاء مصفوفة إخراج بالشكل نفسه لمصفوفة المعامِل. يتم استخدام الدالة الثنائية select لاختيار عنصر من كل نافذة من خلال تطبيقها على كل نافذة، ويتم استدعاؤها مع الخاصية التي يكون فيها متجه الفهرس الخاص بالمعلَمة الأولى أصغر معجميًا من متجه الفهرس الخاص بالمعلَمة الثانية. تعرض الدالة select القيمة true إذا تم اختيار المَعلمة الأولى، وتعرض القيمة false إذا تم اختيار المَعلمة الثانية، ويجب أن تكون الدالة متعدية (أي إذا كانت select(a, b) وselect(b, c) هما true، ستكون select(a, c) أيضًا true) حتى لا يعتمد العنصر المحدّد على ترتيب العناصر التي تم اجتيازها لنافذة معيّنة.

يتم تطبيق الدالة scatter على كل فهرس محدّد في مصفوفة الإخراج. تتلقّى هذه الدالة مَعلمتَين قياسيتَين:

  1. القيمة الحالية في الفهرس المحدّد في مصفوفة الإخراج
  2. قيمة التشتّت من source التي تنطبق على الفهرس المحدّد

تجمع هذه الدالة بين المَعلمتَين وتعرض قيمة عددية يتم استخدامها لتعديل القيمة في الفهرس المحدّد في مصفوفة الإخراج. في البداية، يتم ضبط جميع فهارس مصفوفة الإخراج على init_value.

تكون مصفوفة الإخراج بالشكل نفسه لمصفوفة operand، ويجب أن تكون مصفوفة source بالشكل نفسه لنتيجة تطبيق عملية ReduceWindow على مصفوفة operand. يمكن استخدام SelectAndScatter لإجراء عملية الانتشار العكسي لقيم التدرّج في طبقة تجميع في شبكة عصبية.

SelectAndScatter(operand, select, window_dimensions, window_strides, padding, source, init_value, scatter)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة من النوع T يتم تحريك النوافذ عليها
select XlaComputation عملية حسابية ثنائية من النوع T, T -> PRED، يتم تطبيقها على جميع العناصر في كل نافذة، وتعرض true إذا تم اختيار المَعلمة الأولى، وتعرض false إذا تم اختيار المَعلمة الثانية
window_dimensions ArraySlice<int64> مصفوفة أعداد صحيحة لقيم سمات النافذة
window_strides ArraySlice<int64> مصفوفة أعداد صحيحة لقيم خطوة النافذة
padding Padding نوع المساحة المتروكة للنافذة (Padding::kSame أو Padding::kValid)
source XlaOp مصفوفة من النوع T تتضمّن القيم المطلوب توزيعها
init_value XlaOp قيمة عددية من النوع T للقيمة الأولية لمصفوفة الإخراج
scatter XlaComputation عملية حسابية ثنائية من النوع T, T -> T، لتطبيق كل عنصر مصدر مبعثر مع عنصر الوجهة

يعرض الشكل أدناه أمثلة على استخدام SelectAndScatter، مع احتساب الدالة select للقيمة القصوى بين مَعلماتها. يُرجى العِلم أنّه عند تداخل النوافذ، كما هو موضّح في الشكل (2) أدناه، قد يتم اختيار فهرس مصفوفة operand عدة مرات من خلال نوافذ مختلفة. في الشكل، يتم اختيار عنصر القيمة 9 من خلال كلتا النافذتين العلويتين (الزرقاء والحمراء)، وتنتج دالة الجمع الثنائي scatter عنصر الإخراج ذي القيمة 8 (2 + 6).

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

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - select_and_scatter.

إرسال

يمكنك الاطّلاع أيضًا على XlaBuilder::Send.

Send وSendWithTokens وSendToHost هي عمليات تعمل كعناصر أساسية للتواصل في HLO. تظهر هذه العمليات عادةً في عمليات تفريغ HLO كجزء من عمليات الإدخال/الإخراج المنخفضة المستوى أو عمليات النقل بين الأجهزة، ولكن ليس من المفترض أن ينشئها المستخدمون النهائيون يدويًا.

Send(operand, handle)

الوسيطات النوع الدلالات
operand XlaOp البيانات المطلوب إرسالها (مصفوفة من النوع T)
handle ChannelHandle معرّف فريد لكل زوج إرسال/استلام

يرسل بيانات المعامِل المحدّدة إلى تعليمات Recv في عملية حسابية أخرى تشارك معرّف القناة نفسه. لا تعرض أي بيانات.

على غرار عملية Recv، تمثّل واجهة برمجة التطبيقات الخاصة بالعميل لعملية Send عملية اتصال متزامن، ويتم تقسيمها داخليًا إلى تعليمتَين من HLO (Send وSendDone) لتفعيل عمليات نقل البيانات غير المتزامنة. يمكنك الاطّلاع أيضًا على HloInstruction::CreateSend وHloInstruction::CreateSendDone.

Send(HloInstruction operand, int64 channel_id)

تبدأ هذه التعليمات عملية نقل غير متزامنة للمعامل إلى الموارد التي تم تخصيصها بواسطة تعليمات Recv التي تحمل رقم تعريف القناة نفسه. تعرض هذه السمة سياقًا تستخدمه تعليمات SendDone التالية لانتظار اكتمال عملية نقل البيانات. السياق هو مجموعة من {المعامل (الشكل)، معرّف الطلب (U32)} ولا يمكن استخدامه إلا من خلال تعليمات SendDone.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - send.

SendDone

يمكنك الاطّلاع أيضًا على HloInstruction::CreateSendDone.

SendDone(HloInstruction context)

بالنظر إلى السياق الذي تم إنشاؤه بواسطة تعليمات Send، يتم الانتظار إلى أن يكتمل نقل البيانات. لا تعرض التعليمات أي بيانات.

جدولة تعليمات القناة

يكون ترتيب تنفيذ التعليمات الأربع لكل قناة (Recv وRecvDone وSend وSendDone) على النحو التالي.

  • Recv يحدث قبل Send
  • Send يحدث قبل RecvDone
  • Recv يحدث قبل RecvDone
  • Send يحدث قبل SendDone

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

SetDimensionSize

يمكنك الاطّلاع أيضًا على XlaBuilder::SetDimensionSize.

تضبط هذه السمة الحجم الديناميكي لبُعد معيّن في XlaOp. يجب أن يكون المعامِل على شكل مصفوفة.

SetDimensionSize(operand, val, dimension)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة إدخال ذات n أبعاد
val XlaOp int32 يمثّل الحجم الديناميكي لوقت التشغيل.
dimension int64 قيمة في الفاصل الزمني [0, n) تحدّد السمة.

يتم تمرير المعامِل كنتيجة، مع تتبُّع البُعد الديناميكي بواسطة المترجم.

سيتم تجاهل القيم المضافة من خلال عمليات تقليل عدد الأبعاد اللاحقة.

let v: f32[10] = f32[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
let five: s32 = 5;
let six: s32 = 6;

// Setting dynamic dimension size doesn't change the upper bound of the static
// shape.
let padded_v_five: f32[10] = set_dimension_size(v, five, /*dimension=*/0);
let padded_v_six: f32[10] = set_dimension_size(v, six, /*dimension=*/0);

// sum == 1 + 2 + 3 + 4 + 5
let sum:f32[] = reduce_sum(padded_v_five);
// product == 1 * 2 * 3 * 4 * 5
let product:f32[] = reduce_product(padded_v_five);

// Changing padding size will yield different result.
// sum == 1 + 2 + 3 + 4 + 5 + 6
let sum:f32[] = reduce_sum(padded_v_six);

ShiftLeft

يمكنك الاطّلاع أيضًا على XlaBuilder::ShiftLeft.

تُجري عملية إزاحة إلى اليسار على مستوى كل عنصر في lhs بمقدار rhs من وحدات البت.

ShiftLeft(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر إصدار بديل من ShiftLeft يتوافق مع البث بأبعاد مختلفة:

ShiftLeft(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - shift_left.

ShiftRightArithmetic

يمكنك الاطّلاع أيضًا على XlaBuilder::ShiftRightArithmetic.

تُجري عملية إزاحة حسابية لليمين على مستوى كل عنصر في lhs بمقدار rhs من وحدات البت.

ShiftRightArithmetic(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر متغير بديل مع إمكانية البث بأبعاد مختلفة للدالة ShiftRightArithmetic:

ShiftRightArithmetic(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - shift_right_arithmetic.

ShiftRightLogical

يمكنك الاطّلاع أيضًا على XlaBuilder::ShiftRightLogical.

تُجري عملية إزاحة منطقية لليمين على مستوى كل عنصر في lhs بمقدار rhs من وحدات البت.

ShiftRightLogical(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل من ShiftRightLogical يتيح البث بأبعاد مختلفة:

ShiftRightLogical(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - shift_right_logical.

العلامة

يمكنك الاطّلاع أيضًا على XlaBuilder::Sign.

Sign(operand) عملية الإشارة على مستوى العنصر x -> sgn(x) حيث

\[\text{sgn}(x) = \begin{cases} -1 & x < 0\\ -0 & x = -0\\ NaN & x = NaN\\ +0 & x = +0\\ 1 & x > 0 \end{cases}\]

باستخدام عامل المقارنة لنوع العنصر operand.

Sign(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

للحصول على معلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - sign.

الخطيئة

Sin(operand) دالة الجيب لكل عنصر x -> sin(x)

يمكنك الاطّلاع أيضًا على XlaBuilder::Sin.

Sin(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة sin أيضًا استخدام الوسيطة الاختيارية result_accuracy:

Sin(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - sine.

شريحة

يمكنك الاطّلاع أيضًا على XlaBuilder::Slice.

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

Slice(operand, start_indices, limit_indices, strides)

الوسيطات النوع الدلالات
operand XlaOp مصفوفة N ذات أبعاد من النوع T
start_indices ArraySlice<int64> قائمة تتضمّن N عددًا صحيحًا يحتوي على فهارس البداية للشريحة لكل بُعد. يجب أن تكون القيم أكبر من أو تساوي صفرًا.
limit_indices ArraySlice<int64> قائمة بأعداد صحيحة N تحتوي على فهارس النهاية (غير شاملة) لشريحة كل بُعد. يجب أن تكون كل قيمة أكبر من أو تساوي قيمة start_indices الخاصة بالسمة وأقل من أو تساوي حجم السمة.
strides ArraySlice<int64> قائمة بأعداد صحيحة N تحدّد خطوة الإدخال للشريحة. تختار الشريحة كل عنصر strides[d] في السمة d.

مثال أحادي الأبعاد:

let a = {0.0, 1.0, 2.0, 3.0, 4.0}
Slice(a, {2}, {4})
// Result: {2.0, 3.0}

مثال ثنائي الأبعاد:

let b =
 { {0.0,  1.0,  2.0},
   {3.0,  4.0,  5.0},
   {6.0,  7.0,  8.0},
   {9.0, 10.0, 11.0} }

Slice(b, {2, 1}, {4, 3})
// Result:
//   { { 7.0,  8.0},
//     {10.0, 11.0} }

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - slice.

ترتيب

يمكنك الاطّلاع أيضًا على XlaBuilder::Sort.

Sort(operands, comparator, dimension, is_stable)

الوسيطات النوع الدلالات
operands ArraySlice<XlaOp> المعاملات التي سيتم ترتيبها.
comparator XlaComputation عملية المقارنة المطلوب استخدامها.
dimension int64 السمة التي سيتم الفرز وفقًا لها.
is_stable bool ما إذا كان يجب استخدام الترتيب الثابت.

في حال توفير عامل واحد فقط:

  • إذا كان المعامِل عبارة عن موتر أحادي البُعد (صفيف)، تكون النتيجة صفيفًا مرتّبًا. إذا أردت ترتيب المصفوفة بترتيب تصاعدي، يجب أن يجري عامل المقارنة مقارنة أصغر من. بشكل رسمي، بعد ترتيب المصفوفة، يتم تطبيق ذلك على جميع مواضع الفهرس i, j التي تتضمّن i < j التي إما comparator(value[i], value[j]) = comparator(value[j], value[i]) = false أو comparator(value[i], value[j]) = true.

  • إذا كان للمعامل عدد أكبر من السمات، يتم ترتيب المعامل حسب السمة المقدَّمة. على سبيل المثال، بالنسبة إلى موتر ثنائي الأبعاد (مصفوفة)، سيؤدي استخدام قيمة 0 للأبعاد إلى ترتيب كل عمود بشكل مستقل، بينما سيؤدي استخدام قيمة 1 للأبعاد إلى ترتيب كل صف بشكل مستقل. في حال عدم توفير رقم البُعد، سيتم اختيار البُعد الأخير تلقائيًا. بالنسبة إلى السمة التي يتم ترتيبها، ينطبق ترتيب الفرز نفسه كما في الحالة ذات البُعد الواحد.

في حال توفير معاملات n > 1:

  • يجب أن تكون جميع معاملات n عبارة عن موترات لها الأبعاد نفسها. قد تختلف أنواع العناصر في الموترات.

  • يتم ترتيب جميع المعامِلات معًا، وليس بشكلٍ فردي. من الناحية المفاهيمية، يتم التعامل مع المعامِلات كصفوف. عند التحقّق مما إذا كان يجب تبديل عناصر كل معامل في مواضع الفهرس i وj، يتم استدعاء أداة المقارنة باستخدام المَعلمات العددية 2 * n، حيث تتوافق المَعلمة 2 * k مع القيمة في الموضع i من المعامل k-th، وتتوافق المَعلمة 2 * k + 1 مع القيمة في الموضع j من المعامل k-th. عادةً، يقارن عامل المقارنة المَعلمتَين 2 * k و2 * k + 1 ببعضهما البعض، وقد يستخدم أزواجًا أخرى من المَعلمات لتحديد الفائز في حال التعادل.

  • والنتيجة هي مجموعة من القيم تتألف من المعامِلات بالترتيب المصنّف (على طول السمة المقدَّمة، كما هو موضّح أعلاه). يتوافق المعامل i-th الخاص بالصف مع المعامل i-th الخاص بـ Sort.

على سبيل المثال، إذا كانت هناك ثلاث معاملات operand0 = [3, 1] وoperand1 = [42, 50] وoperand2 = [-3.0, 1.1]، وكان عامل المقارنة يقارن قيم operand0 فقط باستخدام علامة أصغر من، يكون الناتج من عملية الترتيب هو المجموعة ([1, 3], [50, 42], [1.1, -3.0]).

إذا تم ضبط قيمة is_stable على "صحيح"، سيتم ضمان أن يكون الترتيب ثابتًا، أي أنّه إذا كانت هناك عناصر يعتبرها عامل المقارنة متساوية، سيتم الحفاظ على الترتيب النسبي للقيم المتساوية. يتساوى العنصران e1 وe2 إذا وفقط إذا كان comparator(e1, e2) = comparator(e2, e1) = false. تكون القيمة التلقائية لـ is_stable هي false.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - sort.

Sqrt

يمكنك الاطّلاع أيضًا على XlaBuilder::Sqrt.

عملية الجذر التربيعي لكل عنصر x -> sqrt(x)

Sqrt(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة Sqrt أيضًا الوسيط result_accuracy الاختياري:

Sqrt(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - sqrt.

فرعي

يمكنك الاطّلاع أيضًا على XlaBuilder::Sub.

تُجري هذه الدالة عملية طرح على مستوى العناصر بين lhs وrhs.

Sub(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل من Sub يتوافق مع البث بأبعاد مختلفة:

Sub(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - subtract.

تاني

يمكنك الاطّلاع أيضًا على XlaBuilder::Tan.

ظلّ كل عنصر x -> tan(x)

Tan(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة الظلية أيضًا الوسيطة الاختيارية result_accuracy:

Tan(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - tan.

Tanh

يمكنك الاطّلاع أيضًا على XlaBuilder::Tanh.

دالة الظل الزائدي x -> tanh(x) لكل عنصر

Tanh(operand)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة

تتيح الدالة Tanh أيضًا استخدام الوسيطة الاختيارية result_accuracy:

Tanh(operand, result_accuracy)

الوسيطات النوع الدلالات
operand XlaOp المعامل الخاص بالدالة
result_accuracy اختياري ResultAccuracy أنواع الدقة التي يمكن للمستخدم طلبها للعمليات الأحادية التي تتضمّن عمليات تنفيذ متعدّدة

لمزيد من المعلومات عن result_accuracy، يمكنك الاطّلاع على مقالة دقة النتائج.

لمزيد من المعلومات عن StableHLO، يُرجى الاطّلاع على StableHLO - tanh.

TopK

يمكنك الاطّلاع أيضًا على XlaBuilder::TopK.

تعثر الدالة TopK على قيم ومؤشرات k من أكبر أو أصغر العناصر في آخر بُعد من الموتر المحدّد.

TopK(operand, k, largest)

الوسيطات النوع الدلالات
operand XlaOp الموتر الذي سيتم استخراج أفضل k عنصر منه. يجب أن يحتوي الموتر على عدد من الأبعاد أكبر من أو يساوي واحدًا. يجب أن يكون حجم آخر بُعد في الموتر أكبر من أو يساوي k.
k int64 عدد العناصر المطلوب استخراجها.
largest bool تحديد ما إذا كان سيتم استخراج أكبر أو أصغر k عناصر

بالنسبة إلى موتر إدخال أحادي البُعد (مصفوفة)، تعثر هذه العملية على k أكبر أو أصغر إدخالات في المصفوفة وتعرض مجموعة من مصفوفتَين (values, indices). وبالتالي، فإنّ values[j] هو الإدخال j-th الأكبر/الأصغر في operand، وفهرسه هو indices[j].

بالنسبة إلى موتر إدخال يتضمّن أكثر من بُعد واحد، يتم احتساب أهم k إدخالات على طول البُعد الأخير، مع الحفاظ على جميع الأبعاد الأخرى (الصفوف) في الإخراج. وبالتالي، بالنسبة إلى عامل بشكل [A, B, ..., P, Q] حيث Q >= k، تكون النتيجة عبارة عن مجموعة صفوف (values, indices) حيث:

values.shape = indices.shape = [A, B, ..., P, k]

إذا كان هناك عنصران متساويان في صف واحد، سيظهر العنصر ذو الفهرس الأقل أولاً.

تبديل

اطّلِع أيضًا على عملية tf.reshape.

Transpose(operand, permutation)

الوسيطات النوع الدلالات
operand XlaOp المعامل المطلوب تبديل صفوفه بأعمدته.
permutation ArraySlice<int64> كيفية تبديل ترتيب الأبعاد

تبدّل ترتيب أبعاد المعامِل باستخدام التبديل المحدد، وبالتالي ∀ i . 0 ≤ i < number of dimensions ⇒ input_dimensions[permutation[i]] = output_dimensions[i].

وهذا هو نفسه Reshape(operand, permutation, Permute(permutation, operand.shape.dimensions)).

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - transpose.

TriangularSolve

يمكنك الاطّلاع أيضًا على XlaBuilder::TriangularSolve.

تحلّ أنظمة المعادلات الخطية ذات معاملات المصفوفات المثلثية السفلية أو العلوية باستخدام التعويض الأمامي أو الخلفي. تعمل هذه الدالة على حلّ أحد نظامَي المصفوفات op(a) * x = b أو x * op(a) = b للمتغير x، مع الأخذ في الاعتبار a وb، حيث يكون op(a) إما op(a) = a أو op(a) = Transpose(a) أو op(a) = Conj(Transpose(a))، وذلك من خلال البث على طول الأبعاد الرئيسية.

TriangularSolve(a, b, left_side, lower, unit_diagonal, transpose_a)

الوسيطات النوع الدلالات
a XlaOp مصفوفة ذات أكثر من بُعدَين من نوع عدد مركّب أو نقطة عائمة ذات شكل [..., M, M].
b XlaOp مصفوفة ذات أكثر من بُعدَين من النوع نفسه بالشكل [..., M, K] إذا كانت قيمة left_side صحيحة، أو [..., K, M] في الحالات الأخرى.
left_side bool تشير إلى ما إذا كان سيتم حل نظام من النموذج op(a) * x = b (true) أو x * op(a) = b (false).
lower bool تحديد ما إذا كان سيتم استخدام المثلث العلوي أو السفلي من a
unit_diagonal bool إذا كانت القيمة true، سيتم افتراض أنّ العناصر القطرية في a هي 1 ولن يتم الوصول إليها.
transpose_a Transpose ما إذا كان يجب استخدام a كما هو أو تبديل صفوفه بأعمدته أو أخذ تبديل صفوفه بأعمدته المرافق.

تتم قراءة بيانات الإدخال من المثلث السفلي/العلوي من a فقط، وذلك استنادًا إلى قيمة lower. ويتم تجاهل القيم من المثلث الآخر. يتم عرض بيانات الإخراج في المثلث نفسه، أما القيم في المثلث الآخر، فيتم تحديدها حسب التنفيذ ويمكن أن تكون أي شيء.

إذا كان عدد أبعاد a وb أكبر من 2، يتم التعامل معها كمجموعات من المصفوفات، حيث تكون جميع الأبعاد باستثناء البُعدَين الثانويَين عبارة عن أبعاد مجمّعة. يجب أن يكون لـ a وb أبعاد دفعية متساوية.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - triangular_solve.

Tuple

يمكنك الاطّلاع أيضًا على XlaBuilder::Tuple.

مجموعة تحتوي على عدد متغير من معرّفات البيانات، ولكل منها شكل خاص.

Tuple(elements)

الوسيطات النوع الدلالات
elements متّجه XlaOp مصفوفة N من النوع T

وهذا مشابه لـ std::tuple في C++‎. من الناحية النظرية:

let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);

يمكن تفكيك الصفوف (الوصول إليها) من خلال عملية GetTupleElement.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - tuple.

في حين

يمكنك الاطّلاع أيضًا على XlaBuilder::While.

While(condition, body, init)

الوسيطات النوع الدلالات
condition XlaComputation XlaComputation من النوع T -> PRED الذي يحدّد شرط إنهاء الحلقة.
body XlaComputation ‫XlaComputation من النوع T -> T الذي يحدد نص الحلقة.
init T القيمة الأولية لمَعلمة condition وbody

يتم تنفيذ body بالتسلسل إلى أن يتعذّر تنفيذ condition. وهي تشبه حلقة while النموذجية في العديد من اللغات الأخرى، باستثناء الاختلافات والقيود المدرَجة أدناه.

  • تعرض عقدة While قيمة من النوع T، وهي النتيجة من آخر تنفيذ لـ body.
  • يتم تحديد شكل النوع T بشكل ثابت ويجب أن يكون هو نفسه في جميع التكرارات.

يتم إعداد مَعلمات T الخاصة بالحسابات باستخدام القيمة init في التكرار الأول، ويتم تعديلها تلقائيًا إلى النتيجة الجديدة من body في كل تكرار لاحق.

تتمثّل إحدى حالات الاستخدام الرئيسية لعقدة While في تنفيذ عملية التدريب بشكل متكرّر في الشبكات العصبية. يظهر أدناه رمز زائف مبسط مع رسم بياني يمثّل العملية الحسابية. يمكنك العثور على الرمز في while_test.cc. النوع T في هذا المثال هو Tuple يتألف من int32 لعدد التكرارات وvector[10] للمراكم. بالنسبة إلى 1000 تكرار، تستمر الحلقة في إضافة متجه ثابت إلى المجمّع.

// Pseudocode for the computation.
init = {0, zero_vector[10]} // Tuple of int32 and float[10].
result = init;
while (result(0) < 1000) {
  iteration = result(0) + 1;
  new_vector = result(1) + constant_vector[10];
  result = {iteration, new_vector};
}

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على ‫StableHLO - while.

Xor

يمكنك الاطّلاع أيضًا على XlaBuilder::Xor.

تُجري عملية XOR على مستوى كل عنصر من lhs وrhs.

Xor(lhs, rhs)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيمن: مصفوفة من النوع T
rhs XlaOp المعامل الأيمن: مصفوفة من النوع T

يجب أن تكون أشكال الوسيطات متشابهة أو متوافقة. راجِع مستندات البث لمعرفة معنى توافق الأشكال. تكون نتيجة العملية بشكل ناتج عن البث بين مصفوفتَي الإدخال. في هذا النوع، لا يتم تنفيذ العمليات بين مصفوفات ذات ترتيبات مختلفة، إلا إذا كان أحد المعامِلَين عددًا قياسيًا.

يتوفّر نوع بديل من Xor يتوافق مع البث المتعدّد الأبعاد:

Xor(lhs,rhs, broadcast_dimensions)

الوسيطات النوع الدلالات
lhs XlaOp المعامل الأيسر: مصفوفة من النوع T
rhs XlaOp المعامل الأيسر: مصفوفة من النوع T
broadcast_dimension ArraySlice تحديد البُعد في الشكل المستهدف الذي يتوافق مع كل بُعد من أبعاد شكل المعامِل

يجب استخدام هذا النوع من العملية لإجراء عمليات حسابية بين مصفوفات ذات ترتيبات مختلفة (مثل إضافة مصفوفة إلى متّجه).

المعامل broadcast_dimensions الإضافي هو شريحة من الأعداد الصحيحة تحدّد الأبعاد التي سيتم استخدامها لبث المعاملات. يمكنك الاطّلاع على وصف تفصيلي للدلالات في صفحة البث.

لمزيد من المعلومات حول StableHLO، يُرجى الاطّلاع على StableHLO - xor.