VHLO 方言

請參閱 vhlo_checklist.md,瞭解製作步驟 變更 VHLO 語法

VHLO 方言是什麼?

VHLO (版本化 StableHLO) 方言用於序列化和穩定性。 這項工具會提供 StableHLO 方言快照 建立個別程式元素的版本管理

VHLO 是僅供新增的方言,其中包含版本化運算、類型和屬性。 也就是說,一旦將功能新增至方言之後,即無法修改 以任何方式影響語意

不管是對營運、類型或屬性進行任何變更,都必須新增新版本 來擷取方言舉例來說,如果將假設 my_op 新增至 StableHLO, 0.9.0,但在 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 方言只有 StableHLO_MyOp 內含 operandattr,而 VHLO 會擷取運算的各個階段 。

為什麼 VHLO 很實用?

擁有版本化方言可讓我們指定先前版本的 StableHLO 運算元。這會封裝在 支援 VHLO 方言的運算間轉換。

前瞻相容性:可透過轉換來提供前向相容性 並將作業降級為目標版本。如果 Pod 中的每個運算/類型/攻擊 VHLO 程式可降級至目標版本,保證 搭載特定版本的消費端上的可反序列化、可轉換為 StableHLO 大於或等於目標版本,因為 VHLO 具有 反感

前瞻相容性圖片

如果 就會使用舊版運算組。這代表具前瞻性的相容性 是在生產端 (而不是執行階段) 找到的

回溯相容性:升級後會提供回溯相容性 將 VHLO 運算轉換成最新版本 (如有需要),然後將運算轉回至 StableHLO。相容性視窗中的所有 VHLO 程式皆可升級 轉換為 StableHLO,不同版本的消費者可將 來自前一個版本的 VHLO 酬載。

回溯相容性圖片

更重要的是,VHLO 是序列化程序的抽象化。也就是說,機器學習 架構 (生產者) 只需要以 StableHLO 運算和編譯器為目標 後端 (使用者) 只需要支援最新版本,也就是 StableHLO 運算集。與 VHLO 之間的往來轉換會由機器處理 在 StableHLO 存放區中維護

MLIR 位元碼格式版本

為了維持前瞻相容性,StableHLO 版本具有 相關的 MLIR 位元碼格式版本。此外,最新版本的 StableHLO 會使用最新版的 MLIR 位元組格式。當 MLIR 位元碼格式版本遞增,下一個版本的 StableHLO 將會 依累加原則設定子版本,然後更新 Version.cpp 使用最新的 MLIR 位元碼格式版本。

有關 MLIR 位元碼格式的詳細資訊,以及在 StableHLO 中使用此格式的原因: 請參閱 bytecode.md