StableHLO Uyumluluğu

StableHLO, HLO/MHLO'dan esinlenilmiş geriye dönük uyumlu bir ML işlem işlemidir. Bu dokümanda, StableHLO'nun uyumluluk RFC'sinde oluşturulan işleme dayalı olarak sağladığı uyumluluk garantilerinin türü ve kapsamı açıklanmaktadır.

Sürümler

StableHLO'nun mevcut sürümü Version.h adresinde bulunabilir.

0.x.x serisinde, alt sürüm StableHLO işlem kümesinde veya StableHLO serileştirme biçiminde her değişiklik yapıldığında çarpılır ve yama sürümü, StableHLO aşağı akış özelliğini her Openxla/xla deposuna entegre ettiğimizde çarpılır.

Garantiler

6 aylık geriye dönük uyumluluk: libStablehlo'nun eski bir sürümüyle serileştirilen taşınabilir yapılar, libStablehlo'nun yeni sürümü tarafından seri durumdan çıkarıldığında aynı anlamlara* sahiptir. Bunun için, bu sürümlerin aralarında 6 aydan kısa olan Openxla/stablehlo taahhütleri kullanılır.

1 aylık ileriye dönük uyumluluk: libStablehlo'nun yeni bir sürümüyle serilenen taşınabilir yapılar, program eski sürümden itibaren sunulan yeni özellikleri kullanmıyorsa libStablehlo'nun eski bir sürümüyle seri durumdan çıkarıldığında aynı anlamlara* sahiptir.

* StableHLO programları, uyumluluk API'leri aracılığıyla taşınabilir yapılara dönüştürülür ve bu programların anlamları StableHLO spesifikasyonu tarafından tanımlanır. Bu uyumluluk tanımında kapsamayan konuların örneklerini görmek için "Kapsam dışı" bölümüne bakın.

API'ler

Taşınabilir yapılar stablehlo-translate aracıyla veya doğrudan C++ ya da Python API'lerinde oluşturulabilir. #.#.# biçiminde yazılmış bir yapı yazmak için serileştirmede StableHLO'nun hedef sürümünün olması gerekir (Geçerli sürüm için Version.h sayfasına bakın). Serileştirme işlemi, bir yapıyı okumak için StableHLO'nun mevcut sürümünü kullanır.

stablehlo-translate

Bu, taşınabilir bir yapı oluşturmanın ve okumanın en kolay yoludur.

# 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, programatik iş akışları için aşağıdaki uyumluluk API'lerini sağlar:

// 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'lerin tamamı için stablehlo/api/PortableApi.h ve stablehlo/dialect/Serialization.h sayfalarına bakın.

Bu API'lerin kullanımı için StablehloTranslateMain.cpp bölümüne bakın.

Python

StableHLO, C++ uyumluluk API'lerine Python bağlamaları da sağlar:

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'lerinin tamamı için StablehloModule.cpp sayfasını inceleyin.

Python Serialization API'lerinin kullanımıyla ilgili gidiş dönüş örnekleri stablehlo.py > test_serialization_apis sayfasında bulabilirsiniz.

Testler

Stablehlo/tests içinde, desteklenen tüm StableHLO sürümleri için serileştirilmiş stableHLO işlemleri kapsamlı bir özetini içeren bir uyumluluk paketimiz mevcuttur. Her çekme isteği için hem geriye hem de ileriye dönük uyumluluğu test ediyoruz. Diğer bir deyişle, paketin HEAD'i hedefleyerek seri durumdan çıkarılabildiğini (geriye dönük uyumluluk), derlemenin desteklenen tüm StableHLO sürümlerini hedefleyerek seri hale getirilebileceğini (ileri uyumluluğu) ve sonuçların, orijinal StableHLO programlarıyla sentetik olarak aynı olduğunu test ediyoruz.

Gelecekteki çalışmalar

MLIR üretim ortamında uyumluluk paketi oluşturma: StableHLO garantilerini oluşturma ve sürdürme konusunda edindiğimiz bilgileri kullanarak, MLIR bayt kodu altyapısındaki kazara uyumluluk kesintilerine karşı erken algılama sağlamak amacıyla MLIR üretim sürümüne bir uyumluluk paketi eklemeyi planlıyoruz (#1632).

Referans uygulama yöntemini kullanın: Şu anda uyumluluk testi, libStablehlo'nun eski sürümleri tarafından serileştirilmiş uyumluluk paketinin serileştirilmesinden ve serileştirmenin söz dizimsel olarak özdeş programlar ürettiğinden emin olunmasından ibarettir. Bu testlerde ayrıca bir referans uygulaması kullanarak söz dizimsel kimlikle ilgili çok yorucu olan gereksinimi hafifletmeyi ve referans uygulamasını kapsamlı bir şekilde test etmeyi planlıyoruz (#1245).

Kapsam dışı

Taşınamayan yapılar: Uyumluluk garantileri yalnızca belirli bir yöntemle oluşturulan taşınabilir yapılar için sağlanır. StableHLO diyalektinin güzel şekilde yazdırılmış gösterimi ve hatta StableHLO diyalektinin bayt kodu gösterimi gibi diğer yapı türlerinin uyumluluk garantisi yoktur.

Belirtilmemiş özellikler: Geçmişte StableHLO programlarında desteklenen ancak henüz StableHLO spesifikasyonunun parçası olmayan özelliklerde uyumsuz değişiklikler yapabiliriz. Örneğin, kayıtlı olmayan özellikler için uyumluluk garantisi vermeyiz.

Hata uyumluluğu: libStablehlo'daki uygulama StableHLO spesifikasyonuyla çelişiyorsa (ör. VHLO diyalektindeki bir tanım yanlışsa veya StableHLO diyalektindeki bir doğrulayıcı spesifikasyonla eşleşmiyorsa) uyumsuz değişiklikler yapabiliriz.

Sayısal doğruluk: StableHLO, tüketiciler genelinde ve hatta sürümler genelinde aynı tüketici içinde uygulama tanımlı doğruluğa sahip birden fazla işleme sahiptir. Sonuç olarak StableHLO, gelecekte değişebilecek olsa da sayısal doğruluk konusunda garanti vermeyi amaçlamaz (#1156).

libStablehlo'da C, C++ ve Python API'leri için kaynak uyumluluğu, ulaşmak istediğimiz bir hedeftir. Şu anda kaynak uyumluluğu garantileri vermiyoruz ancak lütfen bunun sizin için önemli bir kullanım alanı olup olmadığını bize bildirin, daha sonra destek alma konusunda bir görüşme yapabiliriz(#1247).