التوافق مع StableHLO

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

الإصدارات

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

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

ضمانات

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

شهر واحد من التوافق مع الأمام: تستخدم العناصر المحمولة المتسلسلة بإصدار جديد من 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 أيضًا روابط Python لواجهات برمجة تطبيقات التوافق 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 API الكاملة.

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

الاختبارات

لدينا حزمة توافق في stablehlo/اختبارات تتضمن خلاصة شاملة لعمليات StableHLO متسلسلة لجميع إصدارات StableHLO المتوافقة. بالنسبة إلى كل طلب سحب، نختبر التوافق مع الأنظمة القديمة والتقدمية، أي أنّه يمكن إلغاء ربط المجموعة بقائمة استهداف الأنظمة (التوافق مع الأنظمة القديمة)، وإمكانية وضع الملحق على شكل تسلسل يستهدف جميع إصدارات 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).