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
- 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.
- Consulta hlo_evaluator para identificar los detalles de implementación complicados y las posibles brechas de funcionalidad.
- Envía tickets para los componentes de software correspondientes si encuentras errores o funciones faltantes.
Después de implementar la op
En StablehloOps.td:
- Asegúrate de que el
summary
de la ODS de la operación siga el formato estándar. (entrada relacionada) Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej.,
Cn
oIn
) desde la especificación en el formatoxyz_cn
oxyz_in
, para elXyzOp
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 mlirTraits
yTypeConstraints
. Ten en cuenta quexyz_c4
hace referencia a las restricciones definidas en la claseStableHLO_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*/ .... ); );
- Asegúrate de que el
En TypeInference.cpp y StablehloOps.cpp, haz lo siguiente:
- Borra comentarios que digan cosas como “Verifica las siguientes propiedades: ...”.
- Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej.,
Cn
oIn
) desde la especificación en el formatoxyz_cn
oxyz_in
, para elXyzOp
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.- 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
. - 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.
- 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
En las pruebas de intérpretes, ocurre lo siguiente:
- Agrega un archivo llamado
interpret_<op_mnemonic>.mlir
. - Escribe pruebas según los lineamientos para pruebas.
- Agrega un archivo llamado
En el directorio de datos de prueba:
- Ejecuta las pruebas inhabilitadas que estén cubiertas por la operación recién agregada.
- Si las pruebas son exitosas, habilítalas convirtiendo
RUN-DISABLED
enRUN
. - Si una prueba falla por algún motivo que no sea la coincidencia de precisión, corrige la implementación o prueba.
- Para discrepancias de precisión, etiqueta la prueba con
RUN-DISABLED(#1278)
(si aún no lo ha hecho).
-
- 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.
- Asegúrate de que todas las pruebas relacionadas con la operación en prueba estén juntas.
- Asegúrate de que todas las pruebas relacionadas con la operación en prueba estén precedidas con una macro iluminada
CHECK-LABEL
. - Elige el nombre de la función de las pruebas con el formato
xyz_cn_im_...
para las restricciones de prueba de funcionesCn
,Im
, etc., para la opXyzOp
. Cuando el formato propuesto no se aplique, conserva el nombre existente. - 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.
- Sigue agregando pruebas hasta que ccov muestre una cobertura de >= 90% para la operación.
-
- 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.
- Mueve las pruebas de inferencia de forma del archivo ops_stablehlo.mlir a este archivo.
En spec.md:
- Agrega un vínculo a
interpret_<op_mnemonic>.mlir
en la sección “Ejemplos” (p.ej., Más ejemplos). - Asegúrate de que la especificación tenga solo 1 ejemplo.
- Asegúrate de que el ejemplo de especificación siga los lineamientos para pruebas.
- Asegúrate de que la prueba de ejemplo de especificación se pueda interpretar.
- Asegúrate de que el ejemplo de especificación sea el mismo que el de la ODS.
- Agrega un vínculo a
En status.md:
- Actualiza la columna "Intérprete" a
yes
.
- Actualiza la columna "Intérprete" a