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