VHLO 言語

VHLO を変更する手順については、vhlo_checklist.md をご覧ください。

VHLO 方言とは

VHLO(Versioned StableHLO)言語は、シリアル化と安定性に使用されます。個々のプログラム要素にバージョニングを行うことで、特定の時点での 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 方言には operandattr を持つ StableHLO_MyOp のみが含まれますが、VHLO はオペレーションの進化の各フェーズをキャプチャします。

VHLO が有用な理由

バージョン付き方言を使用すると、以前のバージョンの StableHLO opset をターゲットにできます。これにより、VHLO 言語でのオペレーション間の変換で上位互換性と下位互換性がカプセル化されます。

上位互換性: 上位互換性は、VHLO に変換し、オペレーションをターゲット バージョンにダウングレードすることで実現されます。VHLO プログラム内のすべての op / type / attr をターゲット バージョンにダウングレードできる場合、VHLO にはその時点での opset のスナップショットがあるため、ターゲット バージョン以上のバージョンを実行しているコンシューマで、デシリアル化可能で StableHLO に変換できることが保証されます。

上位互換性の画像

以前のバージョンの OpSet に存在しないオペレーションまたは機能が使用されている場合、このダウングレード変換は失敗します。つまり、フォワード コンパチビリティは、ランタイムではなくプロデューサーで検出されます。

下位互換性: 下位互換性は、VHLO オペレーションを最新バージョンにアップグレードし(必要な場合)、オペレーションを StableHLO に戻すことで提供されます。互換性期間中のすべての VHLO プログラムは StableHLO にアップグレードできます。つまり、異なるバージョンのコンシューマが同じ VHLO ペイロードを以前のバージョンから逆シリアル化できます。

下位互換性の画像

さらに重要なのは、VHLO がシリアル化の背後に抽象化されていることです。つまり、ML フレームワーク(プロデューサー)は StableHLO 演算のみをターゲットにし、コンパイラ バックエンド(コンシューマ)は最新バージョン(StableHLO 演算セット)のみをサポートする必要があります。VHLO との間の変換は、StableHLO リポジトリで管理されているマシンによって処理されます。

MLIR バイトコード形式のバージョン

将来の互換性を維持するため、StableHLO バージョンには MLIR バイトコード形式のバージョンが関連付けられています。また、StableHLO の最新バージョンは、MLIR バイトコード形式の最新バージョンを使用します。MLIR バイトコード形式のバージョンがインクリメントされると、StableHLO の次のリリースでマイナー バージョンがインクリメントされ、Version.cpp が更新されて最新の MLIR バイトコード形式のバージョンが使用されます。

MLIR バイトコード形式の詳細と StableHLO で使用する理由については、bytecode.md をご覧ください。