Lista de tareas del intérprete de StableHLO

En este documento, resumimos los lineamientos para implementar y revisar una operación para el intérprete. Incluimos intencionalmente algunos elementos de acción auxiliares relacionados con el verificador y la inferencia de tipos, con la idea de avanzar en esos frentes junto con la implementación del intérprete.

Durante la implementación de la op

  1. Proporciona una estrategia de pruebas escrita de forma explícita (en una descripción de la PR) similar a esta para usarla como referencia mientras revisas los métodos de verificación y de inferencia de tipos, y las pruebas correspondientes. El revisor volverá a verificar que la descripción sea completa.
  2. Consulta hlo_evaluator para identificar detalles de implementación engañosos y posibles brechas en la funcionalidad.
  3. Envía tickets para los componentes de software correspondientes si encuentras errores o funciones faltantes.

Después de implementar la op

  1. En StablehloOps.td:

    1. Asegúrate de que el summary en el ODS de la operación siga el formato estándar. (ticket relacionado)
    2. Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej., Cn o In) de la especificación en el formato xyz_cn o xyz_in, para la op XyzOp, a fin de identificar la correspondencia entre las restricciones en ODS y la especificación. En el siguiente ejemplo, se muestra cómo agregar las etiquetas de restricción como comentarios junto con Traits y TypeConstraints de mlir. Ten en cuenta que xyz_c4 hace referencia a las restricciones definidas en la clase StableHLO_FooOp (p. ej., 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. En TypeInference.cpp y StablehloOps.cpp, haz lo siguiente:

    1. Borra los comentarios que digan algo como “Verifica las siguientes propiedades: …".
    2. Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej., Cn o In) de la especificación en el formato xyz_cn o xyz_in, para la op XyzOp, a fin de identificar qué partes de los verificadores y las funciones de forma corresponden a qué restricciones de la especificación.
      1. Está bien tener un comentario con varias etiquetas de restricción o varios comentarios con la misma etiqueta de restricción. Todo depende de cómo se implementen las restricciones. Si hay restricciones consecutivas, condénsalas como xyz_cn...xyz_cm, xyz_in...xyz_jn.
      2. En caso de que haya una discrepancia entre las restricciones de la implementación y las de la especificación, asegúrate de que haya un problema abierto que refleje esa discrepancia.
  3. En las pruebas de intérprete:

    1. Agrega un archivo llamado <op_mnemonic>.mlir.
    2. Escribe pruebas según los lineamientos de pruebas.
  4. En el directorio testdata, haz lo siguiente:

    1. Ejecuta las pruebas inhabilitadas que estén cubiertas por la operación agregada recientemente.
    2. Si las pruebas son exitosas, habilítalas convirtiendo RUN-DISABLED en RUN.
    3. Si una prueba falla por algún motivo que no sean discrepancias de precisión, corrige la implementación o la prueba.
    4. En el caso de las discrepancias de precisión, etiqueta la prueba con RUN-DISABLED(#1278) (si aún no lo hiciste).
  5. En ops_stablehlo.mlir:

    1. Asegúrate de que haya al menos una prueba (positiva o negativa) para cada restricción en los métodos de inferencia de tipo y verificador. No se probarán las restricciones incluidas en la ODS. En su mayoría, estas pruebas serán negativas, prueban que las restricciones no se cumplen o son positivas, y prueban que la forma inferida sea correcta.
    2. Asegúrate de que todas las pruebas relacionadas con la operación que estás probando se ubiquen juntas.
    3. Asegúrate de que todas las pruebas relacionadas con la operación en prueba se antepongan con una macro CHECK-LABEL encendida.
    4. Elige el nombre de la función de las pruebas con el formato xyz_cn_im_... para una función que pruebe las restricciones Cn, Im, etc. para la operación XyzOp. En los casos en que no se aplique el formato propuesto, conserva el nombre existente.
    5. Una vez que se complete el paso anterior, ordena todas las pruebas relacionadas con la operación en prueba de forma alfabética según el nombre de la función.
    6. Sigue agregando pruebas hasta que ccov muestre una cobertura superior al 90% para la operación.
  6. En infer_stablehlo.mlir:

    1. Asegúrate de que todas las restricciones relacionadas con las pruebas de inferencia de forma estén presentes en este archivo, siguiendo los mismos lineamientos de nomenclatura mencionados anteriormente.
    2. Mueve las pruebas de inferencia de forma del archivo ops_stablehlo.mlir a este archivo.
  7. En spec.md:

    1. Agrega un vínculo a stablehlo/tests/interpret/<op_mnemonic>.mlir a la sección “Ejemplos” (p. ej., Más ejemplos).
    2. Asegúrate de que la especificación solo tenga 1 ejemplo.
    3. Asegúrate de que el ejemplo de especificación siga los lineamientos de pruebas.
    4. Asegúrate de que la prueba de ejemplo de la especificación se pueda interpretar.
    5. Asegúrate de que el ejemplo de especificación sea el mismo que el de ODS.
  8. En status.md:

    1. Actualiza la columna "Intérprete" a yes.