Стабильная совместимость с HLO

StableHLO — это обратно совместимый вычислительный набор машинного обучения, созданный на основе HLO/MHLO. В этом документе объясняется вид и степень гарантий совместимости, предоставляемых StableHLO, на основе процесса, установленного в RFC по совместимости .

Версии

Текущую версию StableHLO можно найти в Version.h .

В серии 0.xx минорная версия обновляется каждый раз, когда вносятся изменения в опсет StableHLO или формат сериализации StableHLO , а версия исправления обновляется каждый раз, когда мы интегрируем StableHLO в нисходящий поток, то есть в репозиторий openxla/xla.

Гарантии

6 месяцев обратной совместимости: переносимые артефакты, сериализованные старой версией libStablehlo, имеют ту же семантику* при десериализации новой версией libStablehlo, если эти версии созданы на основе коммитов openxla/stablehlo, интервал между которыми составляет менее 6 месяцев.

1 месяц прямой совместимости: переносимые артефакты, сериализованные новой версией libStablehlo, имеют ту же семантику* при десериализации старой версией libStablehlo, если эти версии созданы на основе коммитов openxla/stablehlo, интервал между которыми составляет менее 1 месяца, если только программа не используя новые функции, представленные по сравнению со старой версией.

* Программы StableHLO преобразуются в переносимые артефакты или из них через API совместимости , а семантика этих программ определяется спецификацией StableHLO . Обратитесь к разделу «Вне области применения» , чтобы увидеть примеры того, что не входит в это определение совместимости.

API

Переносимые артефакты можно создавать с помощью инструмента stablehlo-translate или непосредственно в API C++ или Python. Для сериализации необходима целевая версия 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

С++

Для программных рабочих процессов 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.h и stablehlo/dialect/Serialization.h .

См. StablehloTranslateMain.cpp для примера использования этих API.

Питон

StableHLO также предоставляет привязки Python к API совместимости 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: ...

См. StablehloModule.cpp для получения полных API Python.

См. stablehlo.py > test_serialization_apis , где приведены примеры использования API-интерфейсов сериализации Python.

Тесты

У нас есть пакет совместимости в stackhlo/tests/vhlo , который включает в себя полный сборник операций StableHLO , сериализованный для всех поддерживаемых версий StableHLO. Для каждого запроса на включение мы проверяем как обратную, так и прямую совместимость, то есть возможность десериализации пакета для HEAD (обратная совместимость), возможность сериализации сборника для всех поддерживаемых версий StableHLO (прямая совместимость) и синтаксические результаты. идентичен оригинальным программам StableHLO.

Будущая работа

Создайте пакет совместимости в восходящем потоке MLIR. Используя опыт создания и поддержки гарантий StableHLO, мы планируем добавить пакет совместимости в восходящий поток MLIR, чтобы обеспечить раннее обнаружение случайных нарушений совместимости в инфраструктуре байт-кода MLIR ( #1632 ).

Используйте эталонную реализацию: на данный момент тестирование совместимости состоит из десериализации пакета совместимости, сериализованного более старыми версиями libStablehlo, и проверки того, что десериализация создает синтаксически идентичные программы. Мы планируем также использовать эталонную реализацию в этих тестах, ослабив чрезмерно обременительные требования к синтаксической идентичности и всесторонне протестировав эталонную реализацию ( #1245 ).

Вне области действия

Непереносимые артефакты. Гарантии совместимости предоставляются только для переносимых артефактов, созданных особым образом . Другие виды артефактов, например красивое печатное представление диалекта StableHLO или даже представление диалекта StableHLO в байт-коде, не имеют гарантий совместимости.

Неопределенные функции: мы можем вносить несовместимые изменения в функции, которые исторически поддерживаются в программах StableHLO, но еще не являются частью спецификации StableHLO, например, мы не предоставляем гарантий совместимости для незарегистрированных атрибутов.

Совместимость с ошибками: мы можем внести несовместимые изменения, если реализация в libStablehlo противоречит спецификации StableHLO, например, если определение в диалекте VHLO неверно или если верификатор в диалекте StableHLO не соответствует спецификации.

Числовая точность: StableHLO имеет несколько операций, точность которых определяется реализацией для разных потребителей и даже внутри одного и того же потребителя в разных версиях. В результате StableHLO не стремится давать гарантии числовой точности, хотя в будущем это может измениться ( #1156 ).

Совместимость исходного кода API C, C++ и Python в рамках libStablehlo — желаемая цель. На данный момент мы не предоставляем гарантий совместимости исходного кода, но, пожалуйста, сообщите нам, если это важный вариант использования для вас, и мы сможем обсудить его поддержку ( #1247 ).