StableHLO インタープリタのチェックリスト

このドキュメントでは、インタープリタの演算を実装してレビューするためのガイドラインをまとめます。Google では、インタプリタの実装とともに、検証ツールと型推論に関連する補助的なアクション アイテムを意図的にいくつか含めました。

オペレーションの実装中

  1. こちらに似た明示的に記述されたテスト戦略を(PR の説明に)提供して、検証メソッドと型推論メソッド、および対応するテストのレビュー時に参照できるようにします。レビュアーは、説明が包括的であることを再確認します。
  2. hlo_evaluator を参照して、実装の難しい詳細と機能のギャップを特定します。
  3. バグや不足している機能が見つかった場合は、対応するソフトウェア コンポーネントのチケットを提出します。

オペレーションの実装後

  1. StablehloOps.td で、次のように変更します。

    1. オペレーションの ODS の summary が標準形式であることを確認します。(関連するチケット
    2. ODS の制約と仕様との対応を特定するために、仕様から制約ラベル(CnIn など)を参照するコメントを xyz_cn または xyz_in の形式で追加します(op XyzOp の場合)。次の例は、mlir TraitsTypeConstraints とともに制約ラベルをコメントとして追加する方法を示しています。xyz_c4 は、StableHLO_FooOp クラスで定義された制約(StableHLO_ShapedInterfaceOpStableHLO_UnaryElementwiseOpStableHLO_Op など)を指します。

       def StableHLO_XyzOp: StableHLO_FooOp<"xyz", [Trait1,
           Trait2 /*xyz_c1, xyz_c2*/, InferTensorType /*xyz_c3*/]> { /*xyz_c4*/
            ...
         let summary = "Xyz operation";
         let arguments = (ins
            1DTensorOf<[HLO_Float]>:$a, /*xyz_c5, xyz_i1*/
            HLO_Tensor:$b, /*xyz_i2*/
            ....
         );
      );
      
  2. TypeInference.cppStablehloOps.cpp で、次の変更を行いました。

    1. 「次のプロパティを確認してください: ...」などのコメントを削除します。
    2. 仕様から制約ラベル(CnIn など)を参照するコメントを、op XyzOp の場合は xyz_cn または xyz_in の形式で追加し、仕様のどの制約が検証ツールとシェイプ関数のどの部分に対応しているかを特定します。
      1. 複数の制約ラベルを含むコメントや、同じ制約ラベルを含む複数のコメントを含めることは可能です。すべては制約がどのように実装されているかによります連続する制約がある場合は、xyz_cn...xyz_cm, xyz_in...xyz_jn として圧縮します。
      2. 実装と仕様の制約に不一致がある場合は、その不一致を反映した未解決の問題があることを確認します。
  3. インタープリタ テストでは次のようになります。

    1. <op_mnemonic>.mlir という名前のファイルを追加します。
    2. テスト ガイドラインに沿ってテストを作成します。
  4. testdata ディレクトリで、次のコマンドを実行します。

    1. 新しく追加されたオペレーションでカバーされている無効なテストを実行します。
    2. テストに合格したら、RUN-DISABLEDRUN に変換して有効にします。
    3. 精度の不一致以外の理由でテストが失敗した場合は、実装またはテストを修正します。
    4. 精度の不一致の場合は、テストに RUN-DISABLED(#1278) のタグを付けます(まだタグ付けしていない場合)。
  5. ops_stablehlo.mlir で、

    1. 検証ツールと型推論メソッドの制約ごとに、少なくとも 1 つのテスト(正または負)があることを確認します。ODS でカバーされている制約はテストされません。これらのテストは、ほとんどがネガティブ テスト(制約が満たされていないことをテスト)またはポジティブ テスト(推定された形状が正しいことをテスト)です。
    2. テスト対象のオペレーションに関連するすべてのテストが一緒に配置されていることを確認します。
    3. テスト対象のオペレーションに関連するすべてのテストの先頭に、CHECK-LABEL 点灯マクロがあることを確認します。
    4. テストの関数名を選択します。関数テストの制約には xyz_cn_im_... の形式を使用します(演算 XyzOp の関数テストの制約は CnIm など)。提案された形式が当てはまらない場合は、既存の名前のままにします。
    5. 上記の手順が完了したら、テスト対象の演算に関連するすべてのテストを、関数名に基づいてアルファベット順に並べ替えます。
    6. ccov がオペレーションの 90% 以上のカバレッジを示しているまで、テストを追加します。
  6. infer_stablehlo.mlir で:

    1. 上記の命名ガイドラインに沿って、シェイプ推論テストに関連するすべての制約がこのファイルに存在することを確認します。
    2. シェイプ推論テストを ops_stablehlo.mlir ファイルからこのファイルに移動します。
  7. spec.md で次のように設定します。

    1. [例] セクションに stablehlo/tests/interpret/<op_mnemonic>.mlir へのリンクを追加します(例: その他の例)。
    2. 仕様に 1 つの例のみが含まれていることを確認します。
    3. 仕様例がテストのガイドラインに準拠していることを確認します。
    4. 仕様のサンプルテストが解釈可能であることを確認してください。
    5. 仕様の例が ODS のものと一致していることを確認します。
  8. status.md 内:

    1. [Interpreter] 列を yes に更新します。