Consulta la pagina vhlo_checklist.md
per la procedura da seguire quando
apporti modifiche a VHLO.
Che cos'è il dialetto VHLO?
Il dialetto VHLO (Versioned StableHLO) viene utilizzato per la serializzazione e la stabilità. Fornisce uno snapshot del dialetto StableHLO in un determinato momento in base alla versione dei singoli elementi del programma.
VHLO è un dialetto solo per l'aggiunta con operatori, tipi e attributi con versione, il che significa che una volta aggiunta una funzionalità al dialetto, non può essere modificata in alcun modo che influisca sulla semantica.
Eventuali modifiche a un'operazione, a un tipo o a un attributo richiedono l'aggiunta di una nuova versione al dialetto. Ad esempio, se un'ipotetica my_op
è stata aggiunta a StableHLO in
0.9.0, ma è stata modificata in 0.11.0, in VHLO avremmo quanto segue:
// 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);
}
Il dialetto StableHLO ha solo la versione più recente delle operazioni. Nell'esempio in esecuzione, il dialetto StableHLO nella versione 0.11.0 avrebbe solo StableHLO_MyOp
con operand
e attr
, mentre VHLO acquisisce ogni fase dell'evoluzione dell'operazione.
Perché VHLO è utile?
Avere un dialetto con versione ci consente di scegliere come target le versioni precedenti dell'insieme di operazioni StableHLO. Questo consente di incapsulare la compatibilità tra le versioni precedenti e successive nelle conversioni tra operazioni nel dialetto VHLO.
Compatibilità con l'inoltro: la compatibilità con l'inoltro viene fornita convertendo in VHLO ed eseguendo il downgrade delle operazioni a una versione di destinazione. Se è possibile eseguire il downgrade di ogni op/type/attr in un programma VHLO alla versione di destinazione, è garantito che sia deserializzabile e convertibile in StableHLO su un consumatore che esegue una versione superiore o uguale alla versione di destinazione, poiché VHLO ha uno snapshot dell'opset in quel momento.
La conversione del downgrade non riuscirà se vengono utilizzate operazioni o funzionalità che non esistono nella versione precedente dell'operazione. Ciò significa che la compatibilità in avanti viene rilevata nel producer, anziché in fase di runtime.
Compatibilità con le versioni precedenti: la compatibilità con le versioni precedenti viene fornita eseguendo l'upgrade delle operazioni VHLO alla versione più recente (se necessario), quindi convertendo nuovamente un'operazione in StableHLO. Tutti i programmi VHLO all'interno della finestra di compatibilità sono aggiornabili a StableHLO, il che significa che versioni diverse dei consumatori possono deserializzare lo stesso caricamento VHLO da una versione precedente.
Ancora più importante, VHLO è astratto dietro la serializzazione. Ciò significa che i framework di ML (producer) devono scegliere come target solo le operazioni StableHLO, mentre i backend del compilatore (consumer) devono supportare solo la versione più recente, ovvero l'insieme operativo StableHLO. Le conversioni da e verso VHLO vengono gestite con il macchinario manutenuto nel repository StableHLO.
Versioni del formato bytecode MLIR
Per mantenere la compatibilità con le versioni successive, le versioni StableHLO hanno una versione associata del formato bytecode MLIR. Inoltre, la versione più recente di StableHLO utilizzerà la versione più recente del formato bytecode MLIR. Quando la versione del formato bytecode MLIR viene incrementata, la prossima release di StableHLO incrementerà la versione minore e aggiornerà Version.cpp per utilizzare la versione più recente del formato bytecode MLIR.
Per informazioni dettagliate sul formato bytecode MLIR e sul motivo per cui viene utilizzato in StableHLO, consulta bytecode.md.