Checkliste für StableHLO-Dolmetscher

In diesem Dokument werden die Richtlinien für die Implementierung und Überprüfung eines Vorgangs für den Interpreter zusammengefasst. Wir haben absichtlich einige zusätzliche Maßnahmen in Bezug auf die Verifizierung und Typinferenz aufgenommen, um neben der Implementierung des Dolmetschers auch in diesen Bereichen Fortschritte zu erzielen.

Während der Implementierung

  1. Stellen Sie eine ausdrücklich schriftliche Teststrategie (in einer PR-Beschreibung) bereit, die dieser ähnelt, die Sie bei der Überprüfung der Verifizierungs- und Typinferenzmethoden sowie der entsprechenden Tests als Referenz verwenden können. Die prüfende Person prüft, ob die Beschreibung vollständig ist.
  2. Mit hlo_evaluator können Sie schwierige Implementierungsdetails und potenzielle Funktionslücken ermitteln.
  3. Reichen Sie Tickets für die entsprechenden Softwarekomponenten ein, wenn Sie Fehler finden oder Funktionen fehlen.

Nach der Implementierung des Vorgangs

  1. Führen Sie in StablehloOps.td folgende Schritte aus:

    1. Achten Sie darauf, dass summary in der ODS des Vorgangs dem Standardformat entspricht. (ähnliches Ticket)
    2. Fügen Sie Kommentare zu Einschränkungslabels (z.B. Cn oder In) aus der Spezifikation im Format xyz_cn oder xyz_in für Vorgang XyzOp hinzu, um die Korrelation zwischen Einschränkungen in ODS und der Spezifikation zu ermitteln. Das folgende Beispiel zeigt, wie Sie die Einschränkungslabels zusammen mit mlir Traits und TypeConstraints als Kommentare hinzufügen. Hinweis xyz_c4 bezieht sich auf die in der Klasse StableHLO_FooOp definierten Einschränkungen (z.B. StableHLO_ShapedInterfaceOp, StableHLO_UnaryElementwiseOp, StableHLO_Op usw.).

       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. Führen Sie in TypeInference.cpp und StablehloOps.cpp folgende Schritte aus:

    1. Löschen Sie Kommentare wie „Folgende Eigenschaften prüfen: ...“.
    2. Fügen Sie Kommentare zu Einschränkungslabels (z.B. Cn oder In) aus der Spezifikation im Format xyz_cn oder xyz_in für Op XyzOp hinzu, um zu ermitteln, welche Teile von Verifizierern und Formfunktionen welchen Einschränkungen in der Spezifikation entsprechen.
      1. Ein Kommentar mit mehreren Einschränkungslabels oder mehrere Kommentare mit demselben Einschränkungslabel sind zulässig. Alles hängt davon ab, wie die Einschränkungen implementiert werden. Wenn es aufeinanderfolgende Einschränkungen gibt, fassen Sie sie zu xyz_cn...xyz_cm, xyz_in...xyz_jn zusammen.
      2. Falls eine Abweichung zwischen den Einschränkungen in der Implementierung im Vergleich zu denen in der Spezifikation vorliegt, prüfen Sie, ob ein offenes Problem vorliegt, das diese Abweichung widerspiegelt.
  3. In Interpreter-Tests:

    1. Fügen Sie eine Datei mit dem Namen interpret_<op_mnemonic>.mlir hinzu.
    2. Schreibe Tests gemäß den Testrichtlinien.
  4. Im testdata-Verzeichnis:

    1. Führen Sie alle deaktivierten Tests aus, die vom neu hinzugefügten Vorgang abgedeckt sind.
    2. Wenn die Tests bestanden werden, wandeln Sie RUN-DISABLED in RUN um, um sie zu aktivieren.
    3. Wenn ein Test aus einem anderen Grund als Genauigkeitsabweichungen fehlschlägt, korrigieren Sie die Implementierung/den Test.
    4. Taggen Sie bei Genauigkeitsabweichungen den Test mit RUN-DISABLED(#1278), sofern dies noch nicht geschehen ist.
  5. Führen Sie in ops_stablehlo.mlir folgende Schritte aus:

    1. Achten Sie darauf, dass für jede Einschränkung in den Prüfer- und Typinferenzmethoden mindestens ein Test (positiv oder negativ) vorhanden ist. Einschränkungen, die in ODS behandelt werden, werden nicht getestet. Diese Tests sind größtenteils negativ, wobei getestet wird, ob die Einschränkungen nicht erfüllt oder positiv sind, und es wird getestet, ob die abgeleitete Form korrekt ist.
    2. Achten Sie darauf, dass alle Tests, die sich auf die zu testende Operation beziehen, zusammen platziert werden.
    3. Achten Sie darauf, dass allen Tests, die sich auf die zu testende Operation beziehen, ein CHECK-LABEL-Licht-Makro vorangestellt ist.
    4. Wählen Sie den Funktionsnamen der Tests im Format xyz_cn_im_... für die Funktionstesteinschränkungen Cn, Im usw. für Vorgang XyzOp aus. Falls das vorgeschlagene Format nicht zutrifft, behalten Sie den vorhandenen Namen bei.
    5. Sobald der obige Schritt abgeschlossen ist, sortieren Sie alle Tests im Zusammenhang mit dem Test in alphabetischer Reihenfolge nach dem Funktionsnamen.
    6. Fügen Sie weitere Tests hinzu, bis ccov eine Abdeckung von mindestens 90% für den Vorgang anzeigt.
  6. In infer_stablehlo.mlir:

    1. Achten Sie darauf, dass alle Einschränkungen im Zusammenhang mit Forminferenztests in dieser Datei vorhanden sind. Beachten Sie dabei die oben genannten Benennungsrichtlinien.
    2. Verschieben Sie alle Forminferenztests aus der Datei ops_stablehlo.mlir in diese Datei.
  7. Führen Sie in spec.md folgende Schritte aus:

    1. Fügen Sie im Abschnitt „Beispiele“ einen Link zu interpret_<op_mnemonic>.mlir hinzu (z.B. Weitere Beispiele).
    2. Die Spezifikation darf nur 1 Beispiel enthalten.
    3. Achte darauf, dass das Spezifikationsbeispiel den Testrichtlinien entspricht.
    4. Der Beispieltest der Spezifikation muss interpretierbar sein.
    5. Das Spezifikationsbeispiel muss mit dem in der ODS übereinstimmen.
  8. In status.md:

    1. Ändern Sie die Spalte „Interpreter“ zu yes.