VHLO를 변경할 때 따라야 하는 단계는 vhlo_checklist.md
를 참고하세요.
VHLO 방언이란 무엇인가요?
VHLO(버전이 지정된 안정화 HLO) 방언은 직렬화 및 안정성에 사용됩니다. 개별 프로그램 요소의 버전을 지정하여 특정 시점의 StableHLO 방언 스냅샷을 제공합니다.
VHLO는 버전이 지정된 작업, 유형, 속성이 포함된 추가 전용 언어입니다. 즉, 기능이 언어에 추가되면 시맨틱스에 영향을 미치는 어떤 방식으로도 수정할 수 없습니다.
작업, 유형 또는 속성을 변경하면 새 버전을 언어에 추가해야 합니다. 예를 들어 가상의 my_op
가 0.9.0에서 StableHLO에 추가되었지만 0.11.0에서 변경된 경우 VHLO에는 다음이 포함됩니다.
// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
let arguments = (ins
VHLO_AnyType:$operand
);
let results = (outs VHLO_AnyType:$result);
}
// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
let arguments = (ins
VHLO_AnyType:$operand,
VHLO_AnyAttr:$attr // New attribute added to StableHLO in 0.11.0
);
let results = (outs VHLO_AnyType:$result);
}
StableHLO 방언에는 최신 버전의 작업만 있습니다. 실행 중인 예에서 v0.11.0의 StableHLO 언어에는 operand
및 attr
가 있는 StableHLO_MyOp
만 있지만 VHLO는 작업 발전의 각 단계를 캡처합니다.
VHLO가 유용한 이유는 무엇인가요?
버전이 지정된 언어가 있으면 이전 버전의 SttableHLO 작업을 타겟팅할 수 있습니다. 이는 VHLO 방언의 연산 간의 변환에서 상위 호환성과 하위 호환성을 캡슐화합니다.
향후 호환성: 향후 호환성은 VHLO로 변환하고 작업을 대상 버전으로 다운그레이드하여 제공됩니다. VHL0 프로그램의 모든 op/type/attr을 대상 버전으로 다운그레이드할 수 있는 경우, VHL0에는 그 시점의 opset 스냅샷이 있으므로 대상 버전보다 크거나 같은 버전을 실행하는 소비자에서 역직렬화 가능하고 StableHLO로 변환할 수 있습니다.
이전 버전의 opset에 없는 작업 또는 기능이 사용되면 이 다운그레이드 변환이 실패합니다. 즉, 전방 호환성은 런타임이 아닌 생산자에서 발견됩니다.
이전 버전과의 호환성: 이전 버전과의 호환성은 VHLO 작업을 최신 버전으로 업그레이드한 다음 (필요한 경우) 작업을 SttableHLO로 다시 변환하는 방식으로 제공됩니다. 호환성 기간 내의 모든 VHLO 프로그램은 StableHLO로 업그레이드할 수 있습니다. 즉, 서로 다른 버전의 소비자가 이전 버전에서 동일한 VHLO 페이로드를 역직렬화할 수 있습니다.
무엇보다도 VHLO는 직렬화를 통해 추상화됩니다. 즉, ML 프레임워크(생산자)는 StableHLO 연산만 타겟팅하면 되고 컴파일러 백엔드(소비자)는 최신 버전인 StableHLO 연산 집합만 지원하면 됩니다. VHLO와의 변환은 StableHLO 저장소에 유지관리되는 머신으로 처리됩니다.
MLIR 바이트 코드 형식 버전
향후 호환성을 유지하기 위해 StableHLO 버전에는 연결된 MLIR 바이트코드 형식 버전이 있습니다. 또한 최신 버전의 StableHLO는 최신 버전의 MLIR 바이트코드 형식을 사용합니다. MLIR 바이트 코드 형식 버전이 증가하면 다음 StableHLO 출시에서는 부 버전을 증분하고 Version.cpp를 업데이트하여 최신 MLIR 바이트 코드 형식 버전을 사용합니다.
MLIR 바이트코드 형식 및 StableHLO에서 이를 사용하는 이유에 관한 자세한 내용은 bytecode.md를 참고하세요.