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

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

Версии

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

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

Гарантии

Согласно RFC по совместимости StableHLO v1.0 , окно совместимости включает в себя следующее:

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

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

* Программы 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/Version.h"

// CompatibilityRequirement is used to get a viable target version to use for
// `serializePortableArtifact` given a compatibility requirement specified as
// a duration.
//
// New enum values can be added per use case.
//
// Values represent a minimum requirement, i.e. WEEK_4 will return a >=4w
// old version, the specific implementation detail can be updated at any time
// by the community as long as it satisfies the requirement.
//
// Given that integration into XLA is not immediate, coarse intervals work
// better than providing a specific date.
enum class CompatibilityRequirement {
  NONE = 0,     // No compat requirement, use latest version.
  WEEK_4 = 1,   // 1 month requirement
  WEEK_12 = 2,  // 3 month requirement
  MAX = 3,      // Maximum compat, use minimum supported version
};

// Get a viable target version to use for `serializePortableArtifact` for a
// given compatibility requirement. See `CompatibilityRequirement` for
// details.
Version::fromCompatibilityRequirement(CompatibilityRequirement requirement);

// 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++:

class StablehloCompatibilityRequirement(enum.Enum):
  NONE,     # No compat, same as get_current_version
  WEEK_4,   # 1mo compat
  WEEK_12,  # 3mo compat
  MAX       # Max compat, same as get_minimum_version

def get_version_from_compatibility_requirement(requirement : StablehloCompatibilityRequirement) -> str: ...
def get_current_version() -> str: ...
def get_minimum_version() -> str: ...
def get_smaller_version(v1 : str, v2 : str) -> str: ...
def get_api_version() -> int: ...
def serialize_portable_artifact(module: ir.Module, target_version: str) -> bytes: ...
def serialize_portable_artifact_str(module: str, target_version: str) -> bytes: ...
def deserialize_portable_artifact(context: ir.Context, artifact: bytes) -> ir.Module: ...
def deserialize_portable_artifact_str(artifact: bytes) -> str: ...
def eval_module(module : ir.Module, args : List[ir.Attribute])

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

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