التوافق مع StableHLO

StableHLO هي بيئة حوسبة برمجية متوافقة مع الأنظمة القديمة ومستوحاة من HLO/MHLO. يشرح هذا المستند نوع ضمانات التوافق التي يوفّرها StableHLO، ونطاقها، استنادًا إلى العملية الواردة في RFC RFC الخاص بالتوافق.

الإصدارات

يمكن العثور على الإصدار الحالي من StableHLO في Version.h.

يظهر الإصدار الثانوي في كل مرة يتم فيها إجراء تغييرات على عملية StableHLO أو تنسيق تسلسل StableHLO، ويرتبط إصدار التصحيح في كل مرة ندمج فيها StableHLO، أي في مستودع openxla/xla.

ضمانات

وفقًا لمعيار StableHLO v1.0 Compatibility RFC، تتضمّن نافذة التوافق ما يلي:

5 سنوات من التوافق مع الأنظمة القديمة: تحتوي الأدوات المحمولة التي تحمل سلسلة من الإصدارات القديمة من libStablehlo على نفس الدلالات* عندما يتم إلغاء تسلسلها باستخدام إصدار جديد من libStablehlo إذا تم إنشاء هذه الإصدارات من إصدارات openxla/stablehlo ولم يمرّ عليها أكثر من 5 سنوات.

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

* يتم تحويل برامج StableHLO إلى/من عناصر قابلة للنقل من خلال واجهات برمجة تطبيقات التوافق، ويتم تحديد دلالات هذه البرامج من خلال مواصفات StableHLO. يمكنك الرجوع إلى قسم "خارج النطاق" للاطّلاع على أمثلة لما لا يشمله تعريف التوافق هذا.

واجهات برمجة التطبيقات

يمكن إنشاء العناصر المحمولة باستخدام أداة stablehlo-translate أو مباشرةً في واجهات برمجة تطبيقات C++ أو Python. يحتاج التسلسل إلى إصدار مستهدف من StableHLO لكتابة عنصر مكتوب بتنسيق #.#.# (راجع Version.h للإصدار الحالي). نظرًا لأن إصدارات التصحيح لا تؤثر في التوافق، فإن أي هدف به إصدار تصحيح غير صفري يتم ضبط إعداداته تلقائيًا على الصفر أثناء التسلسل. تستخدم عملية التحويلية الإصدار الحالي من StableHLO لقراءة عنصر.

stablehlo-translate

هذه هي أسهل طريقة لإنشاء وقراءة أداة محمولة.

# Write a StableHLO program to a portable artifact
$ stablehlo-translate --serialize file.mlir --target=0.9.0 > portable_artifact.mlir.bc

# Read StableHLO portable artifact
$ stablehlo-translate --deserialize portable_artifact.mlir.bc

C++

بالنسبة إلى عمليات سير العمل الآلية، يوفّر StableHLO واجهات برمجة تطبيقات التوافق التالية:

// From: #include "stablehlo/api/PortableApi.h"

// Get the current StableHLO version.
//
// This value can be used as the `targetVersion` argument to
// `serializePortableArtifact`.
std::string getCurrentVersion();

// Get the minimum supported StableHLO version.
//
// This value can be used as the `targetVersion` argument to
// `serializePortableArtifact`.
std::string getMinimumVersion();

// From: #include "stablehlo/dialect/Serialization.h"

// Write a StableHLO program to a portable artifact
// Writes a stable payload for `module` to `os`. If compatibility with a
// previous version of StableHLO is required, provide the required version
// string `#.#.#` for `targetVersion`.
//
// Can fail if `module` cannot be expressed in the `targetVersion` version of
// StableHLO, e.g. if it's using new or removed features, or if it involves
// unsupported dialects.
LogicalResult serializePortableArtifact(ModuleOp module,
                                        StringRef targetVersion,
                                        raw_ostream& os);

// Read StableHLO portable artifact
//
// Can fail if `sourceStr` cannot be expressed in the current version of
// StableHLO, e.g. if it's using incompatible features. Returns nullptr if
// `sourceStr` is invalid or fails to deserialize.
OwningOpRef<ModuleOp> deserializePortableArtifact(StringRef sourceStr,
                                                  MLIRContext* context);

اطّلِع على stablehlo/api/PortableApi.h وstablehlo/dialect/Serialization.h للاطّلاع على جميع واجهات برمجة التطبيقات.

يمكنك الاطّلاع على StablehloTranslateMain.cpp على سبيل المثال، لاستخدام واجهات برمجة التطبيقات هذه.

Python

توفر منصة StableHLO أيضًا روابط بايثون لواجهات برمجة تطبيقات التوافق مع C++:

def get_current_version() -> str: ...
def get_minimum_version() -> str: ...
def serialize_portable_artifact(module: ir.Module, target_version: str) -> bytes: ...
def serialize_portable_artifact(module: str, target_version: str) -> bytes: ...
def deserialize_portable_artifact(context: ir.Context, artifact: bytes) -> ir.Module: ...
def deserialize_portable_artifact(artifact: bytes) -> str: ...

راجِع StablehloModule.cpp للاطّلاع على واجهات برمجة التطبيقات الكاملة في Python.

راجِع stablehlo.py > test_serialization_apis للحصول على أمثلة من جولات الذهاب والإياب حول استخدام واجهات برمجة تطبيقات Python Serialization.

الاختبارات

لدينا مجموعة توافق في stablehlo/tests/vhlo تتضمن ملحقًا شاملاً من عمليات StableHLO متسلسلة لجميع إصدارات StableHLO المتوافقة. بالنسبة إلى كل طلب سحب، نختبر كلاً من التوافق مع الإصدارات السابقة والأمام - بمعنى أن المجموعة يمكن أن يتم إلغاء تسلسل الاستهداف من

العمل المستقبلي

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

استخدام تنفيذ المرجع: في الوقت الحالي، يتكون اختبار التوافق من إلغاء تسلسل مجموعة التوافق المتسلسل بواسطة إصدارات قديمة من libStablehlo، والتأكد من أن إزالة العنوان التسلسلي ينتج برامج متطابقة من حيث التركيب. نحن نخطط أيضًا لاستخدام تطبيق مرجعي في هذه الاختبارات، ما يخفف من صعوبات استخدام الهوية التكتيكية ويختبر تنفيذ المرجع بشكل شامل (#1245).

خارج النطاق

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

ميزات غير محدّدة: قد نُجري تغييرات غير متوافقة على الميزات التي كانت متوفّرة سابقًا في برامج StableHLO ولكنها ليست جزءًا من مواصفات StableHLO بعد، على سبيل المثال لا نقدّم ضمانات توافق للسمات غير المسجّلة.

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

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

توافُق المصادر لواجهات برمجة تطبيقات C وC++ وPython ضمن libStablehlo هو هدف طموح. في الوقت الحالي، لا نقدّم ضمانات توافق المصدر، ولكن يُرجى إعلامنا إذا كانت هذه الحالة هي حالة استخدام مهمة بالنسبة إليك، وسيمكننا مناقشة دعمها (#1247).