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

Neste documento, resumimos as diretrizes para implementar e revisar uma op para o intérprete. Incluímos intencionalmente alguns itens de ação auxiliares relacionados ao verificador e à inferência de tipo, com a ideia de avançar 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 PR) 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 é abrangente.
  2. Consulte hlo_evaluator para identificar detalhes de implementação complicados e possíveis lacunas de funcionalidade.
  3. Abra tíquetes para os componentes de software correspondentes se 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. (ingresso relacionado)
    2. Adicione comentários que fazem referência a rótulos de restrição (por exemplo, Cn ou In) da especificação no formato xyz_cn ou xyz_in, para a operação XyzOp, para identificar a correspondência entre as restrições no ODS e a especificação. O exemplo abaixo mostra como adicionar os rótulos de restrição como comentários com Traits e TypeConstraints do 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 fazem referência a rótulos de restrição (por exemplo, Cn ou In) da especificação no formato xyz_cn ou xyz_in, para a operação XyzOp, para identificar quais partes dos verificadores e funções de forma correspondem a quais restrições na especificação.
      1. É possível 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, condensa-as como xyz_cn...xyz_cm, xyz_in...xyz_jn.
      2. Caso haja uma incompatibilidade entre as restrições na implementação em comparação com as na especificação, verifique se há um problema aberto refletindo essa discrepância.
  3. Em testes de intérprete:

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

    1. Execute todos os testes desativados que são cobertos pela operação recém-adicionada.
    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/o teste.
    4. Para incompatibilidades de precisão, marque o teste com RUN-DISABLED(#1278), se ainda não tiver feito isso.
  5. Em ops_stablehlo.mlir:

    1. Verifique se há pelo menos um teste (positivo ou negativo) para cada restrição nos métodos de verificação e inferência de tipo. As restrições cobertas no ODS não serão testadas. Esses testes serão principalmente negativos, testando se as restrições não são 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 precedidos por uma macro CHECK-LABEL ativada.
    4. Escolha o nome da função dos testes usando o formato xyz_cn_im_... para uma função que testa restrições Cn, Im, etc. para a operação XyzOp. Quando o formato proposto não se aplicar, mantenha o nome atual.
    5. Depois que a etapa acima for concluída, classifique todos os testes relacionados à opção no teste em ordem alfabética com base no nome da função.
    6. Continue adicionando testes até que o ccov mostre uma cobertura de >= 90% para a operação.
  6. Em infer_stablehlo.mlir:

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

    1. Adicione um link para stablehlo/tests/interpret/<op_mnemonic>.mlir à seção "Exemplos" (por exemplo, Mais exemplos).
    2. Verifique se a especificação tem apenas um exemplo.
    3. Confira se o exemplo de especificação segue as diretrizes de teste.
    4. Verifique se o teste de exemplo de especificação pode ser interpretado.
    5. Verifique se o exemplo de especificação é o mesmo do ODS.
  8. Em status.md:

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