StableHLO adalah opset komputasi ML yang kompatibel dengan versi lama yang terinspirasi oleh HLO/MHLO. Dokumen ini menjelaskan jenis dan tingkat jaminan kompatibilitas yang disediakan StableHLO, berdasarkan proses yang ditetapkan dalam RFC kompatibilitas.
Versions
Versi StableHLO saat ini dapat ditemukan di Version.h.
Versi minor ditambahkan setiap kali perubahan pada opset StableHLO atau format serialisasi StableHLO dibuat, dan versi patch akan ditampilkan setiap kali kita mengintegrasikan downstream StableHLO, yaitu ke dalam repositori openxla/xla.
Jaminan
Sesuai dengan RFC Kompatibilitas StableHLO v1.0, jendela kompatibilitas mencakup hal berikut:
Kompatibilitas dengan versi lama selama 5 tahun: Artefak portabel yang diserialisasi oleh libStablehlo versi lama memiliki semantik yang sama* saat dideserialisasi oleh versi baru libStablehlo jika versi tersebut dibuat dari commit openxla/stablehlo yang selisihnya kurang dari 5 tahun.
Kompatibilitas dengan versi baru selama 2 tahun: Artefak portabel yang diserialisasi oleh versi baru libStablehlo memiliki semantik yang sama* saat dideserialisasi oleh libStablehlo versi lama jika versi ini dibuat dari commit openxla/stablehlo yang rentangnya kurang dari 2 tahun, kecuali jika program menggunakan fitur baru yang diperkenalkan sejak versi lama.
* Program StableHLO dikonversi ke/dari artefak portabel melalui API kompatibilitas, dan semantik program ini ditentukan oleh spesifikasi StableHLO. Lihat bagian "Di luar cakupan" untuk melihat contoh hal yang tidak tercakup oleh definisi kompatibilitas ini.
API
Artefak portabel dapat dibuat menggunakan alat stablehlo-translate
,
atau langsung di API C++ atau Python. Serialisasi memerlukan versi target
StableHLO untuk menulis artefak yang ditulis dalam format #.#.#
(Lihat Version.h
untuk versi saat ini). Karena versi patch tidak memengaruhi kompatibilitas, semua
target dengan versi patch selain nol akan ditetapkan secara default ke nol selama serialisasi.
Deserialisasi menggunakan versi StableHLO saat ini untuk membaca artefak.
stablehlo-translate
Ini adalah cara termudah untuk membuat dan membaca artefak portabel.
# 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++
Untuk alur kerja terprogram, StableHLO menyediakan API kompatibilitas berikut:
// 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);
Lihat stablehlo/api/PortableApi.h
dan stablehlo/dialect/Serialization.h
untuk API lengkap.
Lihat StablehloTranslateMain.cpp
untuk mengetahui contoh penggunaan API ini.
Python
StableHLO juga menyediakan binding Python ke API kompatibilitas C++:
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: ...
Lihat StablehloModule.cpp
untuk mengetahui API Python selengkapnya.
Lihat stablehlo.py > test_serialization_apis
untuk mengetahui contoh dua arah penggunaan Python Serialization API.
Pengujian
Kami memiliki suite kompatibilitas di stablehlo/tests/vhlo yang melibatkan ringkasan komprehensif operasi StableHLO yang diserialkan untuk semua versi StableHLO yang didukung. Untuk setiap permintaan pull, kami menguji kompatibilitas mundur dan maju - yaitu bahwa suite tersebut dapat dideserialisasi penargetan HEAD (kompatibilitas mundur), bahwa ringkasan dapat diserialisasi dengan menargetkan semua versi StableHLO yang didukung (kompatibilitas maju), dan bahwa hasilnya secara sintaksis identik dengan program StableHLO asli.
Pekerjaan mendatang
Buat suite kompatibilitas di upstream MLIR: Dengan menggunakan pembelajaran dari membuat dan mempertahankan jaminan StableHLO, kami berencana untuk memberikan rangkaian kompatibilitas ke upstream MLIR untuk memberikan deteksi awal terhadap kerusakan kompatibilitas yang tidak disengaja dalam infrastruktur bytecode MLIR (#1632).
Gunakan implementasi referensi: Saat ini, pengujian kompatibilitas terdiri dari deserialisasi suite kompatibilitas yang diserialisasi oleh versi lama libStablehlo dan memastikan bahwa deserialisasi menghasilkan program secara sintaksis yang identik. Kami juga berencana untuk menggunakan implementasi referensi dalam pengujian ini, melonggarkan persyaratan identitas sintaksis yang terlalu berat, dan menguji implementasi referensi secara komprehensif (#1245).
Di luar cakupan
Artefak non-portabel: Jaminan kompatibilitas hanya disediakan untuk artefak portabel yang dibuat dengan cara yang sangat spesifik. Jenis artefak lain, misalnya representasi yang cukup dicetak dari dialek StableHLO atau bahkan representasi bytecode dari dialek StableHLO, tidak memiliki jaminan kompatibilitas.
Fitur yang tidak ditentukan: Kami mungkin melakukan perubahan yang tidak kompatibel pada fitur yang secara historis didukung dalam program StableHLO, tetapi belum menjadi bagian dari spesifikasi StableHLO, misalnya, kami tidak memberikan jaminan kompatibilitas untuk atribut yang tidak terdaftar.
Kompatibilitas bug: Kami dapat membuat perubahan yang tidak kompatibel jika penerapan dalam libStablehlo bertentangan dengan spesifikasi StableHLO, misalnya jika definisi dalam dialek VHLO salah, atau jika pemverifikasi dalam dialek StableHLO tidak cocok dengan spesifikasi.
Akurasi numerik: StableHLO memiliki beberapa operasi yang memiliki akurasi yang ditentukan implementasi di seluruh konsumen dan bahkan dalam konsumen yang sama di seluruh versi. Akibatnya, StableHLO tidak bertujuan untuk memberikan jaminan tentang akurasi numerik, meskipun hal ini dapat berubah pada masa mendatang (#1156).
Kompatibilitas sumber untuk API C, C++, dan Python dalam libStablehlo merupakan tujuan yang aspiratif. Saat ini, kami tidak menawarkan jaminan kompatibilitas sumber, tetapi harap beri tahu kami jika hal ini merupakan kasus penggunaan yang penting bagi Anda, dan kita dapat mendiskusikan dukungan untuk mendukungnya (#1247).