Checklist de l'interprète StableHLO

Dans ce document, nous récapitulons les consignes d'implémentation et d'examen d'un pour l'interpréteur. Nous avons intentionnellement inclus quelques actions auxiliaires des éléments liés à l'outil de vérification et à l'inférence de type, avec l'idée de progresser avec l'implémentation de l'interpréteur.

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

  1. Fournir une stratégie de test écrite de manière explicite (dans une description de relations publiques) similaire à ceci pour utiliser comme référence lors de l'examen de la vérification et de l'inférence de type ; les méthodes et les tests correspondants. L'examinateur vérifiera la description est complète.
  2. Consulter hlo_evaluator pour identifier les détails complexes de l'implémentation et les fonctionnalités manquantes.
  3. Si vous constatez des bugs, envoyez des demandes d'assistance pour les composants logiciels correspondants. ou des fonctionnalités manquantes.

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

  1. Dans StablehloOps.td:

    1. Assurez-vous que le summary dans l'ODS de l'opération respecte le format standard. (billet associé)
    2. Ajoutez des commentaires référençant les étiquettes de contrainte (par exemple, Cn ou In) à partir de au format xyz_cn ou xyz_in, pour l'opération XyzOp, afin d'identifier correspondance entre les contraintes dans ODS et la spécification. La L'exemple suivant montre comment ajouter les étiquettes de contrainte en tant que commentaires avec mlir Traits et TypeConstraints. Notez que xyz_c4 fait référence à 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 du type "Faites valider les propriétés suivantes: ..."
    2. Ajoutez des commentaires référençant les étiquettes de contrainte (par exemple, Cn ou In) à partir de au format xyz_cn ou xyz_in, pour l'opération XyzOp, afin d'identifier à quelles parties des vérificateurs et aux fonctions de forme correspondent dans la spécification.
      1. Il est possible d'avoir un commentaire avec plusieurs libellés de contrainte ou d'avoir plusieurs commentaires avec le même libellé de contrainte. Tout dépend de comment les contraintes sont implémentées. S'il existe des contraintes consécutives, les condenser en tant que xyz_cn...xyz_cm, xyz_in...xyz_jn.
      2. En cas de non-concordance entre les contraintes et ceux de la spécification, assurez-vous qu'il existe un problème ouvert reflétant cet écart.
  3. Dans les tests d'interpréteur:

    1. Ajoutez un fichier nommé <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 la nouvelle opération.
    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 le problème la mise en œuvre et le test.
    4. En cas d'incohérence 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 y a au moins un test (positif ou négatif) pour chaque une contrainte dans les méthodes de vérificateur et d'inférence de type ; de contraintes couvertes par l’ODS ne seront pas testées. Ces tests seront le plus souvent négatifs, en testant que les contraintes ne sont pas respectées ou positives, en testant 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é d'une macro éclairée par CHECK-LABEL.
    4. Choisissez le nom de la fonction des tests en utilisant le format xyz_cn_im_... pour une fonction testant les contraintes Cn, Im, etc. pour l'opération XyzOp. Si le format proposé ne convient pas appliquez, conservez le nom existant.
    5. Une fois l'étape ci-dessus terminée, triez tous les tests liés à l'opération. sont testés par ordre alphabétique en fonction du nom de la fonction.
    6. Continuez à ajouter des tests jusqu'à ce que la mention ccov présente une couverture supérieure ou égale à 90% pour 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 suivant les mêmes consignes de dénomination que celles mentionnées ci-dessus.
    2. Déplacez tous les tests d'inférence de forme depuis ops_stablehlo.mlir. dans ce fichier.
  7. Dans spec.md:

    1. Ajouter un lien vers stablehlo/tests/interpret/<op_mnemonic>.mlir aux "Exemples" section (Autres exemples, par exemple).
    2. Assurez-vous que la spécification ne contient 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 de spécification est identique à celui indiqué dans l'organisme de règlement de litiges extrajudiciaire.
  8. Dans status.md:

    1. Mettre à jour l'option "Interprète" la colonne à yes.