Checklist pour l'interprète StableHLO

Dans ce document, nous résumons les consignes pour implémenter et examiner une opération pour l'interprète. Nous avons intentionnellement inclus quelques actions auxiliaires liées au vérificateur et à l'inférence de type, dans l'idée de progresser sur ces points en même temps que l'implémentation de l'interpréteur.

Lors de l'implémentation de l'opération

  1. Fournissez une stratégie de test explicitement écrite (dans une description de PR) semblable à celle-ci à utiliser comme référence lorsque vous examinez les méthodes de vérification et d'inférence de type, ainsi que les tests correspondants. L'examinateur vérifiera que la description est complète.
  2. Consultez hlo_evaluator pour identifier les détails délicats de l'implémentation et les failles potentielles.
  3. Si vous constatez des bugs ou des fonctionnalités manquantes, envoyez des demandes d'assistance pour les composants logiciels correspondants.

Après avoir implémenté l'opération

  1. Dans StablehloOps.td:

    1. Assurez-vous que summary dans l'ODS de l'opération respecte le format standard. (ticket associé)
    2. Ajoutez des commentaires faisant référence aux étiquettes de contrainte (par exemple, Cn ou In) de la spécification au format xyz_cn ou xyz_in, pour l'opération XyzOp, afin d'identifier la correspondance entre les contraintes dans ODS et la spécification. L'exemple suivant montre comment ajouter les libellés de contrainte en tant que commentaires avec mlir Traits et TypeConstraints. Notez que xyz_c4 fait référence aux contraintes définies dans la classe StableHLO_FooOp (par exemple, StableHLO_ShapedInterfaceOp, StableHLO_UnaryElementwiseOp, StableHLO_Op, etc.).

       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. Dans TypeInference.cpp et StablehloOps.cpp:

    1. Supprimez les commentaires indiquant par exemple "Vérifiez les propriétés suivantes :".
    2. Ajoutez des commentaires faisant référence aux libellés de contrainte (par exemple, Cn ou In) de la spécification au format xyz_cn ou xyz_in, pour l'opération XyzOp, afin d'identifier les parties des vérificateurs et les fonctions de forme correspondant aux contraintes de la spécification.
      1. Vous pouvez avoir un commentaire avec plusieurs libellés de contrainte ou plusieurs commentaires avec la même étiquette de contrainte. Tout dépend de la manière dont les contraintes sont mises en œuvre. S'il existe des contraintes consécutives, condensez-les sous la forme xyz_cn...xyz_cm, xyz_in...xyz_jn.
      2. En cas de non-concordance entre les contraintes de l'implémentation VS et celles de la spécification, assurez-vous qu'un problème est ouvert.
  3. Dans les tests d'interprète:

    1. Ajoutez un fichier nommé interpret_<op_mnemonic>.mlir.
    2. Rédigez des tests en suivant les consignes relatives aux tests.
  4. Dans le répertoire testdata:

    1. Exécutez tous les tests désactivés couverts par l'opération que vous venez d'ajouter.
    2. Si les tests réussissent, activez-les en convertissant RUN-DISABLED en RUN.
    3. Si un test échoue pour une raison autre qu'une incohérence de précision, corrigez l'implémentation/le test.
    4. Pour les incohérences de précision, ajoutez le tag RUN-DISABLED(#1278) au test (si ce n'est pas déjà fait).
  5. Dans ops_stablehlo.mlir:

    1. Assurez-vous qu'il existe au moins un test (positif ou négatif) pour chaque contrainte dans les méthodes de vérification et d'inférence de type. Les contraintes couvertes par ODS ne seront pas testées. Ces tests sont généralement négatifs, pour vérifier que les contraintes ne sont pas respectées ou positives, et pour vérifier que la forme déduite est correcte.
    2. Assurez-vous que tous les tests liés à l'opération testée sont placés ensemble.
    3. Assurez-vous que tous les tests liés à l'opération testée sont précédés d'une macro allumée CHECK-LABEL.
    4. Choisissez le nom de fonction des tests au format xyz_cn_im_... pour une fonction testant les contraintes Cn, Im, etc. pour l'opération XyzOp. Si le format proposé ne s'applique pas, conservez le nom existant.
    5. Une fois l'étape ci-dessus terminée, triez par ordre alphabétique tous les tests liés à l'opération testée en fonction du nom de la fonction.
    6. Continuez à ajouter des tests jusqu'à ce que ccov affiche une couverture supérieure ou égale à 90% de l'opération.
  6. Dans infer_stablehlo.mlir:

    1. Assurez-vous que toutes les contraintes liées aux tests d'inférence de forme sont présentes dans ce fichier, en respectant les mêmes consignes de dénomination que celles mentionnées ci-dessus.
    2. Déplacez tous les tests d'inférence de forme du fichier ops_stablehlo.mlir vers ce fichier.
  7. Dans spec.md:

    1. Ajoutez un lien vers interpret_<op_mnemonic>.mlir dans la section "Exemples" (Autres exemples, par exemple).
    2. Assurez-vous que la spécification ne comporte qu'un seul exemple.
    3. Assurez-vous que l'exemple de spécification respecte les consignes de test.
    4. Assurez-vous que le test de l'exemple de spécification est interprétable.
    5. Assurez-vous que l'exemple fourni dans les spécifications est identique à celui figurant dans l'ODS.
  8. Dans status.md:

    1. Définissez la colonne "Interprète" sur yes.