O dialeto VHLO

Consulte vhlo_checklist.md para ver as etapas a serem seguidas ao fazer no VHLO.

O que é o dialeto VHLO?

O dialeto VHLO (Versioned StableHLO) é usado para serialização e estabilidade. Ele fornece um instantâneo do dialeto StableHLO em um determinado momento, controle de versões de elementos individuais do programa.

VHLO é um dialeto somente de adição com operações, tipos e atributos com controle de versão, o que significa que uma vez que um atributo é adicionado ao dialeto, ele não pode ser modificado de qualquer forma que afete a semântica.

Todas as alterações em uma operação, tipo ou atributo exigem a adição de uma nova versão ao o dialeto. Por exemplo, se um my_op hipotético foi adicionado a StableHLO em 0.9.0, mas foi alterado na versão 0.11.0, teríamos o seguinte em VHLO:

// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
  let arguments = (ins
    VHLO_AnyType:$operand
  );
  let results = (outs VHLO_AnyType:$result);
}

// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
  let arguments = (ins
    VHLO_AnyType:$operand,
    VHLO_AnyAttr:$attr  // New attribute added to StableHLO in 0.11.0
  );
  let results = (outs VHLO_AnyType:$result);
}

O dialeto StableHLO tem apenas a versão mais recente do ops. Na corrida exemplo, o dialeto StableHLO na v0.11.0 teria apenas o StableHLO_MyOp. com operand e attr, enquanto o VHLO captura cada fase da operação evolução.

Por que o VHLO é útil?

Ter um dialeto com controle de versão nos permite segmentar versões anteriores do Opset de StableHLO. Isso engloba compatibilidade com versões anteriores e anteriores conversões entre operações no dialeto VHLO.

Compatibilidade com versões futuras:a compatibilidade com versões futuras é fornecida pela conversão para VHLO e fazendo downgrade das operações para uma versão de destino. Se cada op/type/attr em um O programa VHLO pode ser rebaixado para a versão de destino, é garantido desserializável e conversível para StableHLO em um consumidor que executa uma versão maior ou igual à versão de destino, já que o VHLO tem um resumo da oposto naquele momento.

Imagem de compatibilidade com versões futuras

Essa conversão de downgrade falhará se operações ou recursos que não existirem na anterior da opset são usadas. Isso significa que a compatibilidade com versões é descoberto no produtor, e não no ambiente de execução.

Compatibilidade com versões anteriores:a compatibilidade com versões anteriores é fornecida pelo upgrade As operações de VHLO para a versão mais recente (se necessário) e, em seguida, a conversão de uma operação StableHLO. É possível fazer upgrade de todos os programas VHLO na janela de compatibilidade para StableHLO, o que significa que diferentes versões dos consumidores podem desserializar o mesmo Payload VHLO de uma versão anterior.

Imagem de compatibilidade com versões anteriores

Mais importante, o VHLO é abstraído por trás da serialização. Isso significa que o ML (produtores) só precisam ter como alvo operações StableHLO, back-ends (consumidores) só precisam oferecer suporte à versão mais recente, que é a Op StableHLO definida. As conversões de e para VHLO são processadas com máquinas são mantidos no repositório StableHLO.

Versões de formato MLIR Bytecode

Para manter a compatibilidade com versões futuras, as versões do StableHLO têm uma versão associada do formato MLIR Bytecode Format. Além disso, a versão mais recente do O StableHLO vai usar a versão mais recente do formato MLIR Bytecode. Quando o A versão do MLIR Bytecode Format foi incrementada, e a próxima versão do StableHLO incremente a versão secundária e atualize Version.cpp para usar a versão mais recente do formato MLIR Bytecode.

Para detalhes sobre o formato MLIR Bytecode e a lógica para usá-lo no StableHLO, veja bytecode.md.