Elenco di controllo per l'interprete StableHLO

In questo documento vengono riassunte le linee guida per l'implementazione e la revisione di un op per l'interprete. Abbiamo intenzionalmente incluso alcuni elementi di azioni ausiliarie relativi al verificatore e all'inferenza di tipo, con l'idea di fare progressi su questi fronti insieme all'implementazione dell'interprete.

Durante l'implementazione dell'operazione

  1. Fornisci una strategia di test esplicitamente scritta (in una descrizione PR) simile a questa da utilizzare come riferimento durante la revisione dei metodi di verifica e di inferenza del tipo, e dei test corrispondenti. Il revisore verificherà che la descrizione sia completa.
  2. Consulta hlo_evaluator per identificare dettagli di implementazione complicati e potenziali lacune funzionali.
  3. Invia i ticket per i componenti software corrispondenti se rilevi bug o funzionalità mancanti.

Dopo aver implementato l'operazione

  1. In StablehloOps.td:

    1. Assicurati che summary nell'ODS dell'operatore segua il formato standard. (ticket correlato)
    2. Aggiungi commenti che fanno riferimento alle etichette dei vincoli (ad es. Cn o In) della specifica nel formato xyz_cn o xyz_in, per l'operazione XyzOp, per identificare la corrispondenza tra i vincoli nell'ODS e la specifica. L'esempio seguente mostra come aggiungere le etichette dei vincoli come commenti insieme a mlir Traits e TypeConstraints. La nota xyz_c4 fa riferimento ai vincoli definiti nella classe StableHLO_FooOp (ad es. StableHLO_ShapedInterfaceOp, StableHLO_UnaryElementwiseOp, StableHLO_Op e così via).

       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 e StablehloOps.cpp:

    1. Elimina i commenti che contengono frasi come "Verifica le seguenti proprietà: …".
    2. Aggiungi commenti che fanno riferimento alle etichette dei vincoli (ad es. Cn o In) della spec nel formato xyz_cn o xyz_in, per l'operazione XyzOp, per identificare le parti dei verificatori e delle funzioni di forma corrispondenti ai vincoli nella specifica.
      1. È possibile avere un commento con più etichette di vincolo o più commenti con la stessa etichetta di vincolo. Tutto dipende da come sono implementati i vincoli. Se sono presenti vincoli consecutivi, riassumili come xyz_cn...xyz_cm, xyz_in...xyz_jn.
      2. In caso di mancata corrispondenza tra i vincoli nell'implementazione e quelli nella specifica, assicurati che esista un problema aperto che rifletta la discrepanza.
  3. Nei test dell'interprete:

    1. Aggiungi un file denominato <op_mnemonic>.mlir.
    2. Scrivi i test seguendo le linee guida per i test.
  4. Nella directory testdata:

    1. Esegui tutti i test disattivati coperti dall'operazione appena aggiunta.
    2. Se i test vengono superati, attivali convertendo RUN-DISABLED in RUN.
    3. Se un test non va a buon fine per un motivo diverso dalle mancate corrispondenze di precisione, correggi l'implementazione/il test.
    4. Per le mancate corrispondenze di precisione, tagga il test con RUN-DISABLED(#1278) (se non lo hai già fatto).
  5. In ops_stablehlo.mlir:

    1. Assicurati che sia presente almeno un test (positivo o negativo) per ogni vincolo nei metodi di verifica e di inferenza del tipo. I vincoli trattati nell'ODS non verranno testati. Questi test saranno per lo più negativi, per verificare che i vincoli non siano soddisfatti o positivi e per verificare che la forma dedotta sia corretta.
    2. Assicurati che tutti i test relativi all'operazione in esame siano raggruppati.
    3. Assicurati che tutti i test relativi all'operazione da testare siano preceduti da una macro accesa CHECK-LABEL.
    4. Scegli il nome della funzione dei test utilizzando il formato xyz_cn_im_... per una funzione di test dei vincoli Cn, Im e così via per l'operazione XyzOp. Se il formato proposto non è applicabile, mantieni il nome esistente.
    5. Una volta completato il passaggio precedente, ordina tutti i test relativi all'operazione in ordine alfabetico in base al nome della funzione.
    6. Continua ad aggiungere test finché ccov non mostra una copertura >= 90% per l'operazione.
  6. In infer_stablehlo.mlir:

    1. Assicurati che tutti i vincoli relativi ai test di inferenza della forma siano presenti in questo file, seguendo le stesse linee guida di denominazione indicate sopra.
    2. Sposta tutti i test di inferenza delle forme dal file ops_stablehlo.mlir in questo file.
  7. In spec.md:

    1. Aggiungi un link a stablehlo/tests/interpret/<op_mnemonic>.mlir nella sezione "Esempi" (ad es. Altri esempi).
    2. Assicurati che la specifica abbia un solo esempio.
    3. Assicurati che l'esempio di specifiche rispetti le linee guida per i test.
    4. Assicurati che il test di esempio di specifica sia interpretabile.
    5. Assicurati che l'esempio di specifiche sia lo stesso di quello presente nell'ODS.
  8. In status.md:

    1. Aggiorna la colonna "Interprete" in yes.