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