Lista de verificação do intérprete do StableHLO

Neste documento, resumiremos as diretrizes para implementar e revisar uma operação do intérprete. Incluímos intencionalmente alguns itens de ação auxiliar relacionados ao verificador e à inferência de tipo, com a ideia de progredir nessas frentes junto com a implementação do intérprete.

Ao implementar a operação

  1. Forneça uma estratégia de teste explicitamente escrita (em uma descrição de RP) semelhante a esta para usar como referência ao revisar os métodos de verificação e inferência de tipo e os testes correspondentes. O revisor vai verificar se a descrição está completa.
  2. Consulte hlo_evaluator para identificar detalhes complicados da implementação e possíveis lacunas de funcionalidade.
  3. Registre tíquetes para os componentes de software correspondentes se você encontrar bugs ou funcionalidades ausentes.

Depois de implementar a operação

  1. Em StablehloOps.td:

    1. Verifique se o summary no ODS da operação segue o formato padrão. (ticket relacionado)
    2. Adicione comentários que referenciam rótulos de restrição (por exemplo, Cn ou In) da especificação no formato xyz_cn ou xyz_in, na operação XyzOp, para identificar a correspondência entre as restrições no ODS e a especificação. O exemplo a seguir mostra como adicionar os rótulos de restrição como comentários ao lado de Traits e TypeConstraints de mlir. xyz_c4 se refere a restrições definidas na classe StableHLO_FooOp (por exemplo, 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. Em TypeInference.cpp e StablehloOps.cpp:

    1. Exclua comentários como "Verifique as seguintes propriedades: ...".
    2. Adicione comentários que referenciam rótulos de restrição (por exemplo, Cn ou In) da especificação no formato xyz_cn ou xyz_in, para a op XyzOp, para identificar quais partes dos verificadores e funções de forma correspondem a quais restrições na especificação.
      1. Não há problema em ter um comentário com vários rótulos de restrição ou vários comentários com o mesmo rótulo de restrição. Tudo depende de como as restrições são implementadas. Se houver restrições consecutivas, condene-as como xyz_cn...xyz_cm, xyz_in...xyz_jn.
      2. Caso haja uma incompatibilidade entre as restrições na implementação em relação às da especificação, verifique se há um problema aberto que reflita essa discrepância.
  3. Em testes de interpretação:

    1. Adicione um arquivo com o nome interpret_<op_mnemonic>.mlir.
    2. Crie testes seguindo as diretrizes de teste.
  4. No diretório testdata:

    1. Execute todos os testes desativados que foram cobertos pela nova operação.
    2. Se os testes forem aprovados, ative-os convertendo RUN-DISABLED em RUN.
    3. Se um teste falhar por algum motivo que não seja incompatibilidade de precisão, corrija a implementação/teste.
    4. Para incompatibilidades de precisão, marque o teste com RUN-DISABLED(#1278) (se isso ainda não tiver sido feito).
  5. Em ops_stablehlo.mlir:

    1. Confira se há pelo menos um teste (positivo ou negativo) para cada restrição nos métodos de inferência de tipo e verificador. As restrições cobertas no ODS não serão testadas. Esses testes serão, na maioria das vezes, negativos, testando se as restrições não foram atendidas ou positivos, testando se a forma inferida está correta.
    2. Confira se todos os testes relacionados à operação em teste foram colocados juntos.
    3. Verifique se todos os testes relacionados à operação em teste são preparados com uma macro acesa CHECK-LABEL.
    4. Escolha o nome da função dos testes usando o formato xyz_cn_im_... para uma restrição de teste de função Cn, Im etc. para a operação XyzOp. Nos casos em que o formato proposto não for aplicável, mantenha o nome atual.
    5. Depois de concluir a etapa acima, classifique todos os testes relacionados à operação em teste em ordem alfabética com base no nome da função.
    6. Continue adicionando testes até que o ccov mostre >= 90% de cobertura para a operação.
  6. Em infer_stablehlo.mlir:

    1. Confira se todas as restrições relacionadas aos testes de inferência de formas estão presentes nesse arquivo, seguindo as mesmas diretrizes de nomenclatura indicadas acima.
    2. Mova todos os testes de inferência de forma do ops_stablehlo.mlir para esse arquivo.
  7. Em spec.md:

    1. Adicione um link para interpret_<op_mnemonic>.mlir à seção "Exemplos" (por exemplo, Mais exemplos).
    2. A especificação precisa ter apenas um exemplo.
    3. Confira se o exemplo de especificação segue as diretrizes de teste.
    4. Verifique se o teste do exemplo de especificação é interpretável.
    5. Confira se o exemplo de especificações é o mesmo do ODS.
  8. Em status.md:

    1. Atualize a coluna "Intérprete" para yes.