StableHLO 호환성

StableHLO는 HLO/MHLO에서 영감을 받은 이전 버전과 호환되는 ML 컴퓨팅 옵션입니다. 이 문서에서는 호환성 RFC에 설정된 프로세스에 기반하여, StableHLO가 제공하는 호환성 보장의 종류와 범위를 설명합니다.

버전

StableHLO의 현재 버전은 Version.h에서 확인할 수 있습니다.

부 버전은 StableHLO opset 또는 StableHLO 직렬화 형식이 변경될 때마다 범프되며, 패치 버전은 StableHLO 다운스트림(즉, openxla/xla 저장소)을 통합할 때마다 범프됩니다.

보증

StableHLO v1.0 호환성 RFC에 따라 호환성 창에는 다음이 포함됩니다.

5년 이전 버전과의 호환성: 이전 버전의 libStablehlo로 직렬화된 이동식 아티팩트는 새 버전의 libStablehlo로 역직렬화할 때 동일한 의미 체계* 를 가집니다.

2년 이후 호환성: 새 버전의 libStablehlo로 직렬화된 휴대용 아티팩트는 이전 버전 libStablehlo의 이전 버전에 의해 역직렬화될 때 동일한 의미 체계* 를 갖습니다. 단, 프로그램이 이전 버전 이후 도입된 새로운 기능을 사용하는 경우는 예외입니다.

* StableHLO 프로그램은 호환성 API를 통해 이동식 아티팩트 간에 변환되며 이러한 프로그램의 시맨틱은 SableHLO 사양에 의해 정의됩니다. 이러한 호환성 정의에서 다루지 않는 항목의 예는 '범위 외' 섹션을 참고하세요.

API

이식 가능한 아티팩트는 stablehlo-translate 도구를 사용하거나 C++ 또는 Python API에서 직접 만들 수 있습니다. 직렬화에는 #.#.# 형식으로 작성된 아티팩트를 작성하려면 대상 버전의 SttableHLO가 필요합니다 (현재 버전은 Version.h 참고). 패치 버전은 호환성에 영향을 미치지 않으므로 패치 버전이 0이 아닌 모든 타겟은 직렬화 중에 기본적으로 0으로 설정됩니다. 역직렬화는 최신 버전의 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

C++

프로그래매틱 워크플로의 경우 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.hstablehlo/dialect/Serialization.h를 참고하세요.

이러한 API의 사용 예는 StablehloTranslateMain.cpp를 참고하세요.

Python

StableHLO는 C++ 호환성 API에 대한 Python 바인딩도 제공합니다.

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는 StablehloModule.cpp를 참조하세요.

Python 직렬화 API 사용의 왕복 예는 stablehlo.py > test_serialization_apis를 참조하세요.

테스트

stablehlo/tests/vhlo에는 지원되는 모든 StableHLO 버전에 관해 직렬화된 StableHLO 작업의 포괄적인 개요가 포함된 호환성 도구 모음이 있습니다. 모든 pull 요청에 대해 이전 버전과 상위 호환성을 모두 테스트합니다. 즉, 도구 모음이 HEAD (이전 버전과의 호환성)를 타겟팅하여 역직렬화될 수 있는지, 지원되는 모든 StableHLO 버전을 타겟팅하는 개요가 직렬화될 수 있는지 (상위 호환성) 결과가 원래 StableHLO 프로그램과 문법적으로 동일한지 테스트합니다.

향후 작업

MLIR 업스트림에 호환성 모음 만들기: Google은 StableHLO 보장 설정 및 유지에서 얻은 지식을 바탕으로 MLIR 업스트림에 호환성 모음을 제공하여 MLIR 바이트 코드 인프라의 실수로 인한 호환성 손상을 조기에 감지할 계획입니다. (#1632)

참조 구현 사용: 현재 호환성 테스트는 이전 버전의 libStablehlo로 직렬화된 호환성 모음을 역직렬화하고 역직렬화를 통해 문법적으로 동일한 프로그램이 생성되는지 확인하는 것으로 이루어집니다. 이러한 테스트에서도 참조 구현을 사용하여 구문적 ID의 지나치게 부담스러운 요구사항을 완화하고 참조 구현을 포괄적으로 테스트할 계획입니다. (#1245)

범위 외

이동 불가 아티팩트: 호환성 보장은 매우 특정한 방식으로 생성된 이동식 아티팩트에만 제공됩니다. 다른 종류의 아티팩트(예: StableHLO 언어의 예쁘게 인쇄된 표현 또는 StableHLO 언어의 바이트 코드 표현)는 호환성을 보장하지 않습니다.

지정되지 않은 기능: 이전에 StableHLO 프로그램에서 지원되었지만 아직 StableHLO 사양에 포함되지 않은 기능은 호환되지 않을 수 있습니다. 예를 들어 Google에서는 등록되지 않은 속성에는 호환성을 보장하지 않습니다.

버그 호환성: libStablehlo의 구현이 StableHLO 사양과 충돌하는 경우(예: VHLO 언어의 정의가 잘못되었거나 StableHLO 언어의 인증자가 사양과 일치하지 않는 경우) 호환되지 않는 변경사항이 발생할 수도 있습니다.

수치 정확성: StableHLO에는 소비자 전반에 걸쳐 그리고 버전 간에 동일한 소비자 내에서도 구현이 정의된 여러 작업이 있습니다. 따라서 StableHLO는 숫자 정확성을 보장하지 않지만 이는 향후 변경될 수 있습니다. (#1156)

libStablehlo 내 C, C++, Python API의 소스 호환성은 Google의 원대한 목표입니다. 현재는 소스 호환성 보장을 해 드리지 않지만 중요한 사용 사례인지 알려 주시면 지원에 대해 논의할 수 있습니다. (#1247)