سازگاری StableHLO

StableHLO یک اپست محاسباتی ML سازگار با عقب است که از HLO/MHLO الهام گرفته شده است. این سند نوع و میزان ضمانت‌های سازگاری را که StableHLO بر اساس فرآیند ایجاد شده در RFC سازگاری ارائه می‌دهد، توضیح می‌دهد.

نسخه ها

نسخه فعلی StableHLO را می توان در Version.h یافت.

هر بار که تغییراتی در Opset StableHLO یا فرمت سریال‌سازی StableHLO ایجاد می‌شود، نسخه جزئی بامپ می‌شود، و هر بار که StableHLO را در پایین‌دست، یعنی در مخزن openxla/xla ادغام می‌کنیم، نسخه پچ بامپ می‌شود.

تضمین می کند

طبق RFC سازگاری StableHLO v1.0 ، پنجره سازگاری شامل موارد زیر است:

5 سال سازگاری به عقب: مصنوعات قابل حمل که توسط نسخه قدیمی libStablehlo سریال‌سازی شده‌اند، در صورتی که این نسخه‌ها از commit‌های openxla/stablehlo ساخته شده‌اند که کمتر از 5 سال از یکدیگر فاصله دارند، معنایی یکسانی دارند* هنگامی که توسط نسخه جدید libStablehlo از سریال خارج می‌شوند.

2 سال سازگاری رو به جلو: مصنوعات قابل حمل که توسط نسخه جدیدی از libStablehlo سریال شده است، در صورتی که این نسخه ها از commit های openxla/stablehlo ساخته شده باشند که کمتر از 2 سال از یکدیگر فاصله دارند، معنایی یکسانی دارند* زمانی که توسط نسخه قدیمی libStablehlo حذف شود. با استفاده از ویژگی های جدید معرفی شده از نسخه قدیمی.

* برنامه های StableHLO از طریق APIهای سازگاری به/از مصنوعات قابل حمل تبدیل می شوند و معنای این برنامه ها با مشخصات StableHLO تعریف می شود. برای مشاهده نمونه هایی از مواردی که در این تعریف سازگاری پوشش داده نمی شود، به بخش "خارج از محدوده" مراجعه کنید.

API ها

مصنوعات قابل حمل را می توان با استفاده از ابزار stablehlo-translate یا مستقیماً در C++ یا Python API ایجاد کرد. سریال‌سازی به یک نسخه هدف از StableHLO برای نوشتن یک مصنوع نوشته شده در قالب #.#.# نیاز دارد (برای نسخه فعلی به Version.h مراجعه کنید). از آنجایی که نسخه‌های پچ بر سازگاری تأثیر نمی‌گذارند، هر هدفی که نسخه وصله‌ای غیرصفری داشته باشد، در طول سریال‌سازی به‌طور پیش‌فرض صفر می‌شود. Deserialization از نسخه فعلی 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 APIهای سازگاری زیر را ارائه می‌کند:

// 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/Version.h"

// CompatibilityRequirement is used to get a viable target version to use for
// `serializePortableArtifact` given a compatibility requirement specified as
// a duration.
//
// New enum values can be added per use case.
//
// Values represent a minimum requirement, i.e. WEEK_4 will return a >=4w
// old version, the specific implementation detail can be updated at any time
// by the community as long as it satisfies the requirement.
//
// Given that integration into XLA is not immediate, coarse intervals work
// better than providing a specific date.
enum class CompatibilityRequirement {
  NONE = 0,     // No compat requirement, use latest version.
  WEEK_4 = 1,   // 1 month requirement
  WEEK_12 = 2,  // 3 month requirement
  MAX = 3,      // Maximum compat, use minimum supported version
};

// Get a viable target version to use for `serializePortableArtifact` for a
// given compatibility requirement. See `CompatibilityRequirement` for
// details.
Version::fromCompatibilityRequirement(CompatibilityRequirement requirement);

// 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);

برای مشاهده APIهای کامل به stablehlo/api/PortableApi.h و stablehlo/dialect/Serialization.h مراجعه کنید.

برای مثال استفاده از این APIها به StablehloTranslateMain.cpp مراجعه کنید.

پایتون

StableHLO همچنین اتصالات پایتون را برای APIهای سازگاری C++ فراهم می کند:

class StablehloCompatibilityRequirement(enum.Enum):
  NONE,     # No compat, same as get_current_version
  WEEK_4,   # 1mo compat
  WEEK_12,  # 3mo compat
  MAX       # Max compat, same as get_minimum_version

def get_version_from_compatibility_requirement(requirement : StablehloCompatibilityRequirement) -> str: ...
def get_current_version() -> str: ...
def get_minimum_version() -> str: ...
def get_smaller_version(v1 : str, v2 : str) -> str: ...
def get_api_version() -> int: ...
def serialize_portable_artifact(module: ir.Module, target_version: str) -> bytes: ...
def serialize_portable_artifact_str(module: str, target_version: str) -> bytes: ...
def deserialize_portable_artifact(context: ir.Context, artifact: bytes) -> ir.Module: ...
def deserialize_portable_artifact_str(artifact: bytes) -> str: ...
def eval_module(module : ir.Module, args : List[ir.Attribute])

برای مشاهده کامل APIهای Python به StablehloModule.cpp مراجعه کنید.

به stablehlo.py > test_serialization_apis برای مثال های رفت و برگشتی از استفاده از API های سریال سازی پایتون مراجعه کنید.

تست ها

ما یک مجموعه سازگاری در stablehlo/tests/vhlo داریم که شامل خلاصه‌ای جامع از عملیات StableHLO است که برای همه نسخه‌های StableHLO پشتیبانی می‌شود. برای هر درخواست کششی، ما در حال آزمایش سازگاری به عقب و جلو هستیم - به عنوان مثال می توان مجموعه را با هدف قرار دادن HEAD (سازگاری به عقب) غیر سریالی کرد (سازگاری به عقب)، که خلاصه را می توان به صورت سریالی با هدف قرار دادن تمام نسخه های StableHLO پشتیبانی شده (سازگاری به جلو) و اینکه نتایج به صورت نحوی هستند. مشابه برنامه های اصلی StableHLO.

کار آینده

یک مجموعه سازگاری در MLIR upstream ایجاد کنید: با استفاده از آموخته های ایجاد و حفظ ضمانت های StableHLO، ما در حال برنامه ریزی برای ارائه یک مجموعه سازگاری به MLIR upstream هستیم تا تشخیص زودهنگام شکستگی های سازگاری تصادفی در زیرساخت بایت کد MLIR ( #1632 ) را ارائه دهیم.

از پیاده‌سازی مرجع استفاده کنید: در حال حاضر، آزمایش سازگاری شامل سریال‌زدایی مجموعه سازگاری سریال‌سازی شده توسط نسخه‌های قدیمی‌تر libStablehlo و اطمینان از اینکه سریال‌زدایی برنامه‌های یکسانی را تولید می‌کند، است. ما در حال برنامه‌ریزی برای استفاده از پیاده‌سازی مرجع در این آزمون‌ها هستیم که نیاز بیش از حد طاقت‌فرسا هویت نحوی را کاهش می‌دهد و اجرای مرجع را به طور جامع آزمایش می‌کند ( #1245 ).

خارج از محدوده

مصنوعات غیرقابل حمل: ضمانت‌های سازگاری فقط برای مصنوعات قابل حملی ارائه می‌شود که به روشی بسیار خاص ایجاد شده‌اند. انواع دیگر مصنوعات، به عنوان مثال نمایش زیبای چاپ شده از گویش StableHLO یا حتی نمایش بایت کد گویش StableHLO، تضمین سازگاری ندارند.

ویژگی‌های نامشخص: ممکن است تغییرات ناسازگاری در ویژگی‌هایی ایجاد کنیم که از گذشته در برنامه‌های StableHLO پشتیبانی می‌شوند، اما هنوز بخشی از مشخصات StableHLO نیستند، به عنوان مثال، ما ضمانت‌های سازگاری برای ویژگی‌های ثبت نشده ارائه نمی‌کنیم.

سازگاری باگ: اگر پیاده سازی در libStablehlo با مشخصات StableHLO مغایرت داشته باشد، ممکن است تغییرات ناسازگاری ایجاد کنیم، به عنوان مثال اگر تعریفی در گویش VHLO اشتباه باشد، یا اگر یک تأیید کننده در گویش StableHLO با مشخصات مطابقت نداشته باشد.

دقت عددی: StableHLO دارای چندین عملیات است که دارای دقت پیاده سازی تعریف شده در بین مصرف کنندگان و حتی در یک مصرف کننده در سراسر نسخه ها هستند. در نتیجه، هدف StableHLO ایجاد ضمانت در مورد دقت عددی نیست، اگرچه ممکن است در آینده تغییر کند ( #1156 ).

سازگاری منبع برای C، C++ و APIهای پایتون در libStablehlo یک هدف آرمانی است. در حال حاضر، ما ضمانت‌های سازگاری با منبع را ارائه نمی‌دهیم، اما لطفاً اگر این مورد استفاده مهمی برای شما است، به ما اطلاع دهید، و ما می‌توانیم درباره پشتیبانی از آن بحث کنیم ( #1247 ).