StableHLO 相容性

StableHLO 是以 HLO/MHLO 為靈感,是回溯相容的機器學習運算運算組。本文件將依據相容性 RFC 中建立的程序說明 StableHLO 提供的相容性保證種類和範圍。

版本

Version.h 中有目前版本的 StableHLO。

在 0.x.x 系列中,每次有人變更 StableHLO 運算集或 StableHLO 序列化格式時,都會觸及次要版本,且每次將 StableHLO 下游整合 (也就是 Openxla/xla 存放區) 進行整合時,都會出現修補程式版本。

保證

6 個月的回溯相容性:如果這些版本是由 Openxla/stablehlo 修訂版本所建構,且由舊版 libStablehlo 序列化,則透過新版 libStablehlo 序列化的可攜成果,皆具有相同的語意*。

前 1 個月的正向相容性:如果這些版本是由 Openxla/stablehlo 修訂版本所建構,且由較早的 Openxla/stablehlo 修訂版本建構,且使用時間不到 1 個月,則由新版 libStablehlo 序列化的可攜成果具有相同的語意*。

* StableHLO 程式會透過相容性 API 與可攜式構件轉換,而這些程式的語意是由 StableHLO 規格定義。如需瞭解此相容性定義涵蓋範圍內的範例,請參閱「超出範圍」一節

API

您可以使用 stablehlo-translate 工具,或是透過 C++ 或 Python API 直接建立可攜式構件。序列化需要 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 提供下列相容性 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/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.hstablehlo/dialect/Serialization.h

如需這些 API 的使用範例,請參閱 StablehloTranslateMain.cpp

Python

StableHLO 也提供 C++ 相容性 API 的 Python 繫結:

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: ...

如需完整的 Python API,請參閱 StablehloModule.cpp

如需使用 Python Serialization API 的往返範例,請參閱 stablehlo.py > test_serialization_apis

測試命名空間

我們在 stablehlo/tests 中提供相容性套件,可針對所有支援的 StableHLO 版本進行全方位 StableHLO 運算序列化。針對每項提取要求,我們都會測試回溯和正向相容性,即套件可去序列化指定 HEAD (回溯相容性)、議價可針對所有支援的 StableHLO 版本 (前相容性),以及結果的語法與原始 StableHLO 程式的語法完全相同。

未來的工作

在 MLIR 上游建立相容性套件:我們計劃運用建立和維護 StableHLO 保證的經驗,為 MLIR 上游提供相容性套件,藉此及早偵測 MLIR 位元碼基礎架構中意外的相容性故障 (#1632)。

使用參考實作:目前相容性測試包含由舊版 libStablehlo 序列化的相容性套件去序列化,並確保去序列化作業產生的語法相同。我們也打算在這些測試中使用參考實作,放寬語法身分的過度要求,並全面測試參考實作 (#1245)。

範圍外

不可移植的構件:系統只會針對以特定方式建立的可攜式構件提供相容性保證。其他類型的構件 (例如 StableHLO 方言的圖形化表示法,甚至是 StableHLO 方言的位元碼表示法等構件) 沒有相容性保證。

如未指定的功能:我們可能會對 StableHLO 程式過去支援、但尚未納入 StableHLO 規格的功能,進行不相容的變更,例如,我們不能為未註冊的屬性提供相容性保證。

錯誤相容性:如果 libStablehlo 中的實作內容與 StableHLO 規格相牴觸,例如 VHLO 方言中的定義有誤,或是 StableHLO 方言中的驗證器與規格不符,我們可能會做出不相容的變更。

數值準確率:StableHLO 有多個運算,會對不同消費者 (甚至是同一消費者) 的不同版本,實作定義的準確率。因此,StableHLO 的目的並非保證數值準確性,但日後可能會改變。(#1156)。

libStablehlo 中 C、C++ 和 Python API 的原始碼相容性是理想的目標。我們目前並未提供來源相容性保證,但如果這對您來說是否重要,請告訴我們,我們會討論相關支援方式 (#1247)。