VHLO 方言

如要瞭解如何變更 VHLO,請參閱 vhlo_checklist.md

VHLO 方言是什麼?

VHLO (Versioned StableHLO) 方言用於序列化和穩定性。透過為個別程式元素建立版本,提供特定時間點的 StableHLO 方言快照。

VHLO 是僅新增方言,具有版本化作業、類型和屬性,這表示一旦將功能新增至方言,就無法以任何方式修改,以免影響語意。

對運算、類型或屬性進行任何變更時,都必須在方言中新增版本。例如,如果在 0.9.0 中將假設 my_op 新增至 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 方言只有具有 operandattrStableHLO_MyOp,VHLO 會擷取運算演進的每個階段。

為什麼 VHLO 很實用?

具有版本化方言可讓我們指定舊版 StableHLO 運算集。這可在 VHLO 方言的運算之間轉換時,封裝前向和後向相容性。

前向相容性:前向相容性可透過轉換至 VHLO 並將作業降級至目標版本來提供。如果 VHLO 程式中的每個運算/類型/攻擊都能降級至目標版本,則保證在執行版本高於或等於目標版本的用戶上,能夠反序列化並轉換為 StableHLO,因為 VHLO 具有當時的運算集快照。

前瞻相容性圖片

如果使用舊版運算器中沒有的作業或功能,這項降級轉換就會失敗。也就是說,向前相容性是在生產端發現,而非在執行階段。

回溯相容性:回溯相容性可透過升級至 Vhlo 作業的最新版本 (如有需要),然後將作業轉換回 StableHLO 來提供。相容性視窗中的所有 VHLO 程式都能升級至 StableHLO,也就是說,不同版本的消費者可以將先前版本的相同 VHLO 酬載序列化。

回溯相容性圖片

更重要的是,VHLO 會在序列化後抽象化。也就是說,ML 架構 (產生者) 只需鎖定 StableHLO 運算,編譯器後端 (使用者) 只需支援最新版本,也就是 StableHLO 運算集。從 VHLO 轉換至或從 VHLO 轉換至其他格式,可透過 StableHLO 存放區中維護的機制處理。

MLIR 位元碼格式版本

為了維持向前相容性,StableHLO 版本會提供相關的 MLIR 位元碼格式版本。此外,最新版的 StableHLO 會使用最新版的 MLIR 位元碼格式。當 MLIR 位元碼格式版本增加時,StableHLO 的下一個版本會增加次要版本,並更新 Version.cpp 以使用最新的 MLIR 位元碼格式版本。

如要進一步瞭解 MLIR 位元碼格式,以及在 StableHLO 中使用該格式的理由,請參閱 bytecode.md