StableHLO 호환성

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

버전

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

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

보증

6개월의 하위 호환성: 이전 버전의 libStablehlo로 직렬화된 이동식 아티팩트는 간격이 6개월 미만인 openxla/stablehlo 커밋에서 빌드한 경우 새 버전의 libStablehlo로 역직렬화할 때 동일한 의미 체계* 를 가집니다.

1개월 이후 호환성: 프로그램이 이전 버전 이후에 도입된 새로운 기능을 사용하지 않는 한 libStablehlo의 이전 버전으로 직렬화된 휴대용 아티팩트는 1개월 미만의 openxla/stablehlo 커밋에서 빌드된 경우 이전 버전의 libStablehlo로 역직렬화할 때 동일한 의미 체계* 를 가집니다.

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

API

이동 가능한 아티팩트는 stablehlo-translate 도구를 사용하거나 C++ 또는 Python API에서 직접 만들 수 있습니다. 직렬화 시 #.#.# 형식으로 작성된 아티팩트를 작성하려면 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

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

향후 작업

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

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

범위 외

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

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

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

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

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