StableHLO Uyumluluğu

StableHLO, HLO/MHLO'dan esinlenilmiş, geriye dönük uyumlu bir ML işlem operasyonudur. Bu belgede, RFC uyumluluğu'nda oluşturulan sürece bağlı olarak StableHLO'nun sağladığı uyumluluk garantilerinin türü ve kapsamı açıklanmaktadır.

Sürümler

StableHLO'nun mevcut sürümüne Version.h adresinden ulaşabilirsiniz.

Küçük sürüm, StableHLO işlem kümesinde veya StableHLO serileştirme biçiminde her değişiklik yapıldığında bu sürüme yükseltilir. Yama sürümü, StableHLO aşağı akış özelliğini Openxla/xla deposuna her entegre ettiğimizde yayınlanır.

Garantiler

StableHLO v1.0 Uyumluluk RFC uyarınca uyumluluk penceresi aşağıdakileri içerir:

5 yıl geriye dönük uyumluluk: libStablehlo'nun eski bir sürümü tarafından serileştirilen taşınabilir yapılar, yeni bir libStablehlo sürümü tarafından seri durumdan çıkarıldığında, bu sürümlerin aralarında 5 yıldan kısa bir süre bulunan openxla/stablehlo taahhütlerinden derlenmişse aynı anlamlara* sahiptir.

2 yıl ileriye dönük uyumluluk: libStablehlo'nun yeni bir sürümü tarafından serileştirilen taşınabilir yapılar, libStablehlo'nun eski bir sürümüyle seri durumdan çıkarıldığında, bu sürümlerin aralarında 2 yıldan kısa bir süre bulunan openxla/stablehlo taahhütlerinden derlenmiş olması durumunda aynı anlamlara* sahiptir (program eski sürümden bu yana sunulan yeni özellikleri kullanmıyorsa).

* StableHLO programları, uyumluluk API'leri aracılığıyla taşınabilir yapılara dönüştürülür ve bu yapılardan dönüştürülür. Bu programların anlamları, StableHLO spesifikasyonu ile tanımlanır. Bu uyumluluk tanımının kapsamına girmeyen konularla ilgili örnekleri görmek için "Kapsam dışı" bölümüne bakın.

API'ler

Taşınabilir yapılar stablehlo-translate aracı kullanılarak veya doğrudan C++ ya da Python API'lerde oluşturulabilir. Serileştirme, #.#.# biçiminde yazılmış bir yapı yazmak için StableHLO'nun hedef sürümüne ihtiyaç duyar (Geçerli sürüm için Version.h sayfasına bakın). Yama sürümleri uyumluluğu etkilemediğinden, yama sürümü sıfır olmayan herhangi bir hedef serileştirme sırasında varsayılan olarak sıfır olur. 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);

Tam API'ler için stablehlo/api/PortableApi.h ve stablehlo/dialect/Serialization.h sayfalarına bakın.

Bu API'lerin kullanımıyla ilgili örnekler 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üş örnekler için stablehlo.py > test_serialization_apis sayfasını inceleyin.

Testler

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

Gelecekteki çalışmalar

MLIR üretim ortamında uyumluluk paketi oluşturma: StableHLO garantilerinin oluşturulması ve sürdürülmesinden edindiğimiz bilgileri kullanarak, MLIR bayt kodu altyapısındaki kazara uyumluluk kesintilerinin erken tespit edilmesini sağlamak amacıyla MLIR yukarı akış bölümüne bir uyumluluk paketi eklemeyi planlıyoruz (#1632).

Referans uygulamayı kullanma: Şu anda uyumluluk testi, libStablehlo'nun eski sürümleri tarafından serileştirilmiş uyumluluk paketinin seri durumdan çıkarılması ve serileştirmenin söz dizimsel olarak özdeş programlar ürettiğinden emin olunmasından oluşur. Bu testlerde ayrıca bir referans uygulama kullanmayı, sözdizimsel kimliğe ilişkin aşırı zahmetli gereksinimi hafifleterek ve referans uygulamasını kapsamlı bir şekilde test etmeyi planlıyoruz (#1245).

Kapsam dışı olanlar

Taşınamayan yapılar: Uyumluluk garantileri, yalnızca çok spesifik bir şekilde oluşturulan taşınabilir yapılar için sağlanır. StableHLO diyalektinin güzel bir şekilde basılmış gösterimi ve hatta StableHLO diyalektinin bayt kodu gösterimi gibi diğer yapı türleri uyumluluk garantisi vermez.

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, kaydedilmemiş özellikler için uyumluluk garantisi verilmez.

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

Sayısal doğruluk: StableHLO, tüketiciler genelinde ve hatta sürümler genelinde aynı tüketicide uygulama tanımlı doğruluğa sahip birden fazla işleme sahiptir. Sonuç olarak StableHLO, sayısal doğrulukla ilgili garanti vermeyi hedeflemez ancak bu durum gelecekte değişebilir (#1156).

libStablehlo'da C, C++ ve Python API'leri için kaynak uyumluluğu, hedeflediğimiz bir hedeftir. Şu anda kaynak uyumluluğu garantisi sunmuyoruz ancak bunun sizin için önemli bir kullanım alanı olup olmadığını lütfen bize bildirin. Bu özelliğin desteklenmesiyle ilgili olarak görüşebilir miyiz (#1247).