Checkliste für StableHLO-Interpreter

In diesem Dokument werden die Richtlinien für die Implementierung und Überprüfung einer Option für den Interpreter zusammengefasst. Wir haben bewusst einige Hilfsaktionselemente zum Verifier und zur Typinferenz hinzugefügt, um neben der Implementierung des Interpreters auch in diesen Bereichen Fortschritte zu erzielen.

Bei der Implementierung der Operation

  1. Stelle eine explizit geschriebene Teststrategie (in einer PR-Beschreibung) bereit, die dieser ähnelt, um sie als Referenz zu verwenden und gleichzeitig die Verifizierungs- und Typinferenzmethoden sowie die entsprechenden Tests zu überprüfen. Der Prüfer prüft, ob die Beschreibung vollständig ist.
  2. Mit hlo_evaluator können Sie schwierige Implementierungsdetails und potenzielle Funktionslücken ermitteln.
  3. Wenn Sie Fehler oder fehlende Funktionen finden, erstellen Sie Tickets für die entsprechenden Softwarekomponenten.

Nach der Implementierung der Operation

  1. In StablehloOps.td:

    1. Achten Sie darauf, dass die summary in der ODS-Datei des Unternehmens dem Standardformat entspricht. (entsprechendes Ticket)
    2. Fügen Sie für op XyzOp Kommentare hinzu, die auf Einschränkungslabels (z. B. Cn oder In) aus der Spezifikation im Format xyz_cn oder xyz_in verweisen, um die Übereinstimmung zwischen Einschränkungen in der ODS und der Spezifikation anzugeben. 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 Einschränkungen, die in der Klasse StableHLO_FooOp definiert sind (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. In TypeInference.cpp und StablehloOps.cpp:

    1. Löschen Sie Kommentare wie „Prüfen Sie die folgenden Eigenschaften: …“.
    2. Fügen Sie für op XyzOp Kommentare hinzu, die auf Einschränkungslabels (z. B. Cn oder In) aus der Spezifikation im Format xyz_cn oder xyz_in verweisen, um anzugeben, welche Teile von Prüfern und Formfunktionen welchen Einschränkungen in der Spezifikation entsprechen.
      1. Es ist in Ordnung, einen Kommentar mit mehreren Einschränkungslabels oder mehrere Kommentare mit demselben Einschränkungslabel zu haben. Das hängt davon ab, wie die Einschränkungen implementiert werden. Wenn aufeinanderfolgende Einschränkungen vorhanden sind, fassen Sie sie als xyz_cn...xyz_cm, xyz_in...xyz_jn zusammen.
      2. Falls die Einschränkungen in der Implementierung nicht mit denen in der Spezifikation übereinstimmen, muss ein offenes Problem vorhanden sein, das diese Abweichung widerspiegelt.
  3. Bei Interpretertests:

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

    1. Führen Sie alle deaktivierten Tests aus, die vom neu hinzugefügten Vorgang abgedeckt sind.
    2. Wenn die Tests erfolgreich waren, aktivieren Sie sie, indem Sie RUN-DISABLED in RUN konvertieren.
    3. Wenn ein Test aus einem anderen Grund als Abweichungen bei der Genauigkeit fehlschlägt, beheben Sie die Implementierung bzw. den Test.
    4. Wenn die Genauigkeit nicht übereinstimmt, taggen Sie den Test mit RUN-DISABLED(#1278) (falls noch nicht geschehen).
  5. In ops_stablehlo.mlir:

    1. Achten Sie darauf, dass für jede Einschränkung im Verifier und in den Typinferenzmethoden mindestens ein (positiver oder negativer) Test vorhanden ist. Einschränkungen, die in der außergerichtlichen Streitbeilegungsstelle behandelt werden, werden nicht getestet. Diese Tests sind in der Regel negativ, d. h., es wird geprüft, ob die Einschränkungen nicht erfüllt sind, oder positiv, d. h., es wird geprüft, ob die abgeleitete Form korrekt ist.
    2. Achten Sie darauf, dass alle Tests, die sich auf den zu testenden Vorgang beziehen, zusammengeführt werden.
    3. Achten Sie darauf, dass alle Tests, die sich auf den zu testenden Vorgang beziehen, mit einem CHECK-LABEL-Lit-Makro beginnen.
    4. Wählen Sie den Funktionsnamen der Tests im Format xyz_cn_im_... für Funktionstesteinschränkungen Cn, Im usw. für op XyzOp aus. Wenn das vorgeschlagene Format nicht zutrifft, behalte den vorhandenen Namen bei.
    5. Sortieren Sie nach Abschluss des obigen Schritts alle Tests, die sich auf das zu testende Operation beziehen, alphabetisch basierend auf dem Funktionsnamen.
    6. Fügen Sie weitere Tests hinzu, bis die ccov für die Operation eine Abdeckung von mindestens 90 % anzeigt.
  6. Führen Sie in infer_stablehlo.mlir folgende Schritte aus:

    1. Achten Sie darauf, dass alle Einschränkungen im Zusammenhang mit Tests zur Forminferenz in dieser Datei vorhanden sind. Beachten Sie dabei die oben genannten Benennungsrichtlinien.
    2. Verschieben Sie alle Tests zur Forminferenz aus der Datei ops_stablehlo.mlir in diese Datei.
  7. In spec.md:

    1. Fügen Sie im Abschnitt „Beispiele“ einen Link zu stablehlo/tests/interpret/<op_mnemonic>.mlir hinzu (z. B. Weitere Beispiele).
    2. Die Spezifikation darf nur ein Beispiel enthalten.
    3. Das Beispiel für die Spezifikation muss den Testrichtlinien entsprechen.
    4. Achten Sie darauf, dass der Beispieltest für die Spezifikation aussagekräftig ist.
    5. Achten Sie darauf, dass das Beispiel in der Spezifikation mit dem in der ODS übereinstimmt.
  8. Führen Sie in status.md Folgendes aus:

    1. Aktualisieren Sie die Spalte „Interpreter“ auf yes.