لهجة VHLO

ما هي لهجة VHLO؟

تُستخدم لهجة VHLO (الإصدار StableHLO) للتسلسل والثبات. ويوفر لقطة من لهجة StableHLO في وقت معين من خلال إصدار عناصر البرنامج الفردية.

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

أي تغييرات يتم إجراؤها على عملية أو نوع أو سمة تتطلب إضافة إصدار جديد إلى اللهجة. على سبيل المثال، إذا تمت إضافة my_op افتراضي إلى StableHLO في 0.9.0، ولكن تم تغييره في 0.11.0، سيكون لدينا ما يلي في VHLO:

// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
  let arguments = (ins
    VHLO_AnyType:$operand
  );
  let results = (outs VHLO_AnyType:$result);
}

// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
  let arguments = (ins
    VHLO_AnyType:$operand,
    VHLO_AnyAttr:$attr  // New attribute added to StableHLO in 0.11.0
  );
  let results = (outs VHLO_AnyType:$result);
}

لا تتضمّن لهجة StableHLO سوى أحدث إصدار من العمليات. في المثال الجاري، ستحتوي لهجة StableHLO في v0.11.0 فقط على StableHLO_MyOp التي تحتوي على operand وattr، بينما VHLO تلتقط كل مرحلة من مراحل تطور العملية.

لماذا تعتبر VHLO مفيدة؟

يسمح لنا وجود لهجة مُعدَّلة باستهداف الإصدارات السابقة من عملية StableHLO. وهذا يلخص التوافق الأمامي والخلفي في عمليات التحويل بين العمليات بلهجة VHLO.

التوافق مع الأمام: تتوفر عملية التوافق الأمامي عن طريق التحويل إلى VHLO والرجوع إلى إصدار سابق من العمليات إلى إصدار مستهدف. إذا كان من الممكن إرجاع كل عملية/نوع/att في برنامج VHLO إلى الإصدار المستهدف، فمن المضمون أن تكون قابلة لإلغاء الفحص وتحويلها إلى StableHLO على مستهلك يعمل بإصدار أكبر من الإصدار المستهدف أو مساويًا له، بما أن VHLO لديه لقطة من التجربة في ذلك الوقت.

صورة التوافق مع ميزة إعادة التوجيه

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

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

صورة التوافق مع الأنظمة القديمة

والأهم من ذلك، أن VHLO هو عملية تجريدية وراء التسلسل. وهذا يعني أنّ إطارات عمل تعلُّم الآلة (المنتجون) تحتاج فقط إلى استهداف عمليات StableHLO، ولن تحتاج الخلفيات الخلفية لبرامج التجميع (المستهلكون) إلا إلى التوافق مع أحدث إصدار، وهو مجموعة عمليات StableHLO. تتم معالجة الإحالات الناجحة من VHLO وإليها باستخدام الآلات المحفوظة في مستودع StableHLO.

إصدارات تنسيق MLIR Bytecode

للحفاظ على مستوى التوافق، تحتوي إصدارات StableHLO على إصدار مرتبط بتنسيق MLIR Bytecode. بالإضافة إلى ذلك، سيستخدم أحدث إصدار من StableHLO أحدث إصدار من تنسيق MLIR Bytecode. عندما تتم إضافة إصدار تنسيق MLIR Bytecode، سيزيد الإصدار التالي من StableHLO من الإصدار الثانوي وسيحدِّث Version.cpp لاستخدام أحدث إصدار من تنسيق MLIR Bytecode.

للحصول على تفاصيل حول تنسيق MLIR Bytecode وأسباب استخدامه في StableHLO، راجِع bytecode.md.

المساهمة في تغييرات غير متوافقة

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

دفع رقم الإصدار في Version.h

قبل تحديث عمليات VHLO أو السمات أو الأنواع أو الإحالات الناجحة، يجب زيادة رقم الإصدار الثانوي في Version.h. وأيّ من ميزات VHLO جديدة تمت إضافتها ستستخدم هذا الإصدار الذي يتضمّن اهتزازًا، على سبيل المثال، بعد اصطدام الأداة 0.10.0 --> 0.11.0، وهي عملية جديدة في VhloOps.td ستستخدم:

VHLO_Op<"abs_v2", "0.11.0", "current">

إضافة الإحالات الناجحة والتنفيذ المطلوب لتنفيذ VHLO

سيختلف الرمز البرمجي الدقيق المطلوب لدمج ميزة جديدة، ولكن في معظم الأحيان، يجب تغيير ما يلي:

ومن الأمثلة الحديثة على عملية الإرسال ذات الصلة بالتوافق إضافة نوعين من FP8، بالإضافة إلى تنفيذها في VHLO في #1379.

إضافة / تعديل اختبارات الوحدات

يكون المساهم في التغيير غير المتوافق مسؤولاً عن اختبارات الوحدات الإيجابية والسلبية للميزة، بالإضافة إلى اختبارات وحدة التوافق.

يتضمن اختبار وحدة التوافق تحديث stablehlo_legalize_to_vhlo.mlir لضمان إجراء عمليات الإرسال ذهابًا وإيابًا من StableHLO باستخدام أحدث إصدار من VHLO، بالإضافة إلى أي اختبارات إضافية مطلوبة للتوافق مع الأمام أو الخلف.

ومن الأمثلة على ذلك:

إضافة اختبار التسلسل المحدّد بإصدار

بعد إضافة نقطة اختبار إلى stablehlo_legalize_to_vhlo.mlir، يمكنك إنشاء نسخة من الملف الذي يحمل اسم stablehlo_legalize_to_vhlo.0_X_0.mlir كما يلي، بالإضافة إلى نسخة رمز بايت من الملف المذكور مع الإضافة .0_X_0.mlir.bc. أضِف سطور FileCheck الصحيحة لاختبار التوافق الأمامي والخلفي.

$ export TARGET_VERSION=0.X.0
$ export TARGET_FILENAME=${TARGET_VERSION//./_}
$ cp stablehlo/tests/stablehlo_legalize_to_vhlo.mlir stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir
$ build/bin/stablehlo-translate --serialize --target=$TARGET_VERSION --strip-debuginfo stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir > stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir.bc

# Replace RUN commands in stablehlo/tests/stablehlo_legalize_to_vhlo.0_X_0.mlir with the following for 0.X.0:
// RUN: stablehlo-opt --mlir-print-op-generic %s.bc | FileCheck %s
// RUN: stablehlo-translate --deserialize %s.bc | stablehlo-translate --serialize --target=0.X.0 | stablehlo-opt --mlir-print-op-generic | FileCheck %s
// RUN: diff <(stablehlo-translate --deserialize %s.bc | stablehlo-opt) <(stablehlo-opt --strip-debuginfo %s)
// RUN: diff %s.bc <(stablehlo-translate --serialize --target=0.X.0 --strip-debuginfo %s)

مثال على اختبار مُحدّد بإصدار في #1430