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
- 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.
- Consulta hlo_evaluator para identificar detalles de implementación engañosos y posibles brechas en la 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
en el ODS de la operación siga el formato estándar. (ticket relacionado) Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej.,
Cn
oIn
) de la especificación en el formatoxyz_cn
oxyz_in
, para la opXyzOp
, 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 conTraits
yTypeConstraints
de mlir. Ten en cuenta quexyz_c4
hace referencia a las restricciones definidas en la claseStableHLO_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*/ .... ); );
- Asegúrate de que el
En TypeInference.cpp y StablehloOps.cpp, haz lo siguiente:
- Borra los comentarios que digan algo como “Verifica las siguientes propiedades: …".
- Agrega comentarios que hagan referencia a etiquetas de restricciones (p.ej.,
Cn
oIn
) de la especificación en el formatoxyz_cn
oxyz_in
, para la opXyzOp
, a fin de identificar qué partes de los verificadores y las funciones de forma corresponden a qué 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, condénsalas 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, condénsalas como
En las pruebas de intérprete:
- Agrega un archivo llamado
<op_mnemonic>.mlir
. - Escribe pruebas según los lineamientos de pruebas.
- Agrega un archivo llamado
En el directorio testdata, haz lo siguiente:
- Ejecuta las pruebas inhabilitadas que estén cubiertas por la operación agregada recientemente.
- Si las pruebas son exitosas, habilítalas convirtiendo
RUN-DISABLED
enRUN
. - Si una prueba falla por algún motivo que no sean discrepancias de precisión, corrige la implementación o la prueba.
- En el caso de las discrepancias de precisión, etiqueta la prueba con
RUN-DISABLED(#1278)
(si aún no lo hiciste).
-
- 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.
- Asegúrate de que todas las pruebas relacionadas con la operación que estás probando se ubiquen juntas.
- Asegúrate de que todas las pruebas relacionadas con la operación en prueba se antepongan con una macro
CHECK-LABEL
encendida. - Elige el nombre de la función de las pruebas con el formato
xyz_cn_im_...
para una función que pruebe las restriccionesCn
,Im
, etc. para la operaciónXyzOp
. En los casos en que no se aplique el formato propuesto, conserva el nombre existente. - 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.
- Sigue agregando pruebas hasta que ccov muestre una cobertura superior al 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
stablehlo/tests/interpret/<op_mnemonic>.mlir
a la sección “Ejemplos” (p. ej., Más ejemplos). - Asegúrate de que la especificación solo tenga 1 ejemplo.
- Asegúrate de que el ejemplo de especificación siga los lineamientos de pruebas.
- Asegúrate de que la prueba de ejemplo de la especificación se pueda interpretar.
- Asegúrate de que el ejemplo de especificación sea el mismo que el de ODS.
- Agrega un vínculo a
En status.md:
- Actualiza la columna "Intérprete" a
yes
.
- Actualiza la columna "Intérprete" a