ما هي لهجة 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
سيختلف الرمز البرمجي الدقيق المطلوب لدمج ميزة جديدة، ولكن في معظم الأحيان، يجب تغيير ما يلي:
- بالنسبة إلى جميع التغييرات:
- عدِّل سجلّ الإصدار في VhloDialect.td.
- للعمليات الجديدة:
- أضِف العملية في VhloOps.td.
- إضافة StableHLO ← تحويل VHLO في StablehloLegalizeToVhlo.cpp
- إضافة VHLO ← تحويل StableHLO في VhloLegalizeToStablehlo.cpp
- بالنسبة إلى الإصدارات الجديدة من العمليات الحالية:
- أضِف العملية في VhloOps.td.
- تعديل StableHLO إلى تعيين VHLO في MapStablehloToVhlo.h
- إضافة إحالة ناجحة بين إصدارَي التشغيل الجديد والقديم في VhloToVersion.cpp
- بالنسبة إلى الأنواع أو السمات الجديدة:
- أضِف النوع في VhloTypes.td أو السمة في VhloAttrs.td.
- إضافة StableHLO ← تحويل VHLO في StablehloLegalizeToVhlo.cpp
- إضافة VHLO ← تحويل StableHLO في VhloLegalizeToStablehlo.cpp
ومن الأمثلة الحديثة على عملية الإرسال ذات الصلة بالتوافق إضافة نوعين من FP8، بالإضافة إلى تنفيذها في VHLO في #1379.
إضافة / تعديل اختبارات الوحدات
يكون المساهم في التغيير غير المتوافق مسؤولاً عن اختبارات الوحدات الإيجابية والسلبية للميزة، بالإضافة إلى اختبارات وحدة التوافق.
يتضمن اختبار وحدة التوافق تحديث stablehlo_legalize_to_vhlo.mlir لضمان إجراء عمليات الإرسال ذهابًا وإيابًا من StableHLO باستخدام أحدث إصدار من VHLO، بالإضافة إلى أي اختبارات إضافية مطلوبة للتوافق مع الأمام أو الخلف.
ومن الأمثلة على ذلك:
- التوافق مع الأنظمة القديمة والاختبارات الإيجابية: vhlo_to_version_upgrade.mlir
- التوافق مع الأمام والاختبارات الإيجابية: vhlo_to_version_downgrade.mlir
- التوافق مع إعادة التوجيه والاختبارات السلبية: vhlo_to_version_downgrade_invalid.0_9_0.mlir
إضافة اختبار التسلسل المحدّد بإصدار
بعد إضافة نقطة اختبار إلى 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