Lista de tareas para el intérprete de StableHLO

En este documento, resumimos los lineamientos que debes seguir a fin de implementar y revisar una operación para el intérprete. Incluimos intencionalmente algunos elementos de acción auxiliar 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 prueba escrita de manera explícita (en una descripción de PR) similar a esta para usarla como referencia mientras revisas los métodos de verificación y de inferencia de tipo, y las pruebas correspondientes. El revisor comprobará que la descripción sea exhaustiva.
  2. Consulta hlo_evaluator para identificar los detalles de implementación complicados y las posibles brechas de 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 de la ODS de la operación siga el formato estándar. (entrada relacionada)
    2. Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej., Cn o In) desde la especificación en el formato xyz_cn o xyz_in, para el XyzOp de la operación, a fin de identificar la correspondencia entre las restricciones de ODS y la especificación. En el siguiente ejemplo, se muestra cómo agregar las etiquetas de restricción como comentarios junto con mlir Traits y TypeConstraints. 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étera).

       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 comentarios que digan cosas como “Verifica las siguientes propiedades: ...”.
    2. Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej., Cn o In) desde la especificación en el formato xyz_cn o xyz_in, para el XyzOp de las operaciones, a fin de identificar qué partes de los verificadores y las funciones de forma corresponden a las 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, condensarlas 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érpretes, ocurre lo siguiente:

    1. Agrega un archivo llamado interpret_<op_mnemonic>.mlir.
    2. Escribe pruebas según los lineamientos para pruebas.
  4. En el directorio de datos de prueba:

    1. Ejecuta las pruebas inhabilitadas que estén cubiertas por la operación recién agregada.
    2. Si las pruebas son exitosas, habilítalas convirtiendo RUN-DISABLED en RUN.
    3. Si una prueba falla por algún motivo que no sea la coincidencia de precisión, corrige la implementación o prueba.
    4. Para discrepancias de precisión, etiqueta la prueba con RUN-DISABLED(#1278) (si aún no lo ha hecho).
  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 del verificador y de tipo. No se probarán las restricciones cubiertas en ODS. La mayoría de estas pruebas serán negativas, comprobar que las restricciones no se cumplen o positivas, probar que la forma inferida sea correcta.
    2. Asegúrate de que todas las pruebas relacionadas con la operación en prueba estén juntas.
    3. Asegúrate de que todas las pruebas relacionadas con la operación en prueba estén precedidas con una macro iluminada CHECK-LABEL.
    4. Elige el nombre de la función de las pruebas con el formato xyz_cn_im_... para las restricciones de prueba de funciones Cn, Im, etc., para la op XyzOp. Cuando el formato propuesto no se aplique, conserva el nombre existente.
    5. Una vez que hayas completado el paso anterior, ordena alfabéticamente todas las pruebas relacionadas con la operación que se está probando según el nombre de la función.
    6. Sigue agregando pruebas hasta que ccov muestre una cobertura de >= 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 interpret_<op_mnemonic>.mlir en la sección “Ejemplos” (p.ej., Más ejemplos).
    2. Asegúrate de que la especificación tenga solo 1 ejemplo.
    3. Asegúrate de que el ejemplo de especificación siga los lineamientos para pruebas.
    4. Asegúrate de que la prueba de ejemplo de especificación se pueda interpretar.
    5. Asegúrate de que el ejemplo de especificación sea el mismo que el de la ODS.
  8. En status.md:

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