Le dialecte VHLO

Consultez vhlo_checklist.md pour connaître la procédure à suivre lorsque vous modifiez un VHLO.

Qu'est-ce que le dialecte VHLO ?

Le dialecte VHLO (Versioned StableHLO) est utilisé pour la sérialisation et la stabilité. Il fournit un instantané du dialecte StableHLO à un moment donné en effectuant une gestion des versions des éléments de programme individuels.

VHLO est un dialecte d'ajout uniquement avec des opérations, types et attributs versionnés, ce qui signifie qu'une fois qu'une fonctionnalité est ajoutée au dialecte, elle ne peut pas être modifiée de manière à affecter la sémantique.

Toute modification apportée à une opération, à un type ou à un attribut nécessite l'ajout d'une nouvelle version au dialecte. Par exemple, si un my_op hypothétique a été ajouté à StableHLO dans la version 0.9.0, mais a été modifié dans la version 0.11.0, nous aurions ce qui suit dans 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);
}

Le dialecte StableHLO ne contient que la dernière version des opérations. Dans l'exemple en cours d'exécution, le dialecte StableHLO de la version 0.11.0 ne comporte que l'StableHLO_MyOp qui comporte operand et attr, tandis que VHLO capture chaque phase de l'évolution de l'opération.

En quoi le VHLO est-il utile ?

Le fait de disposer d'un dialecte avec version nous permet de cibler les versions précédentes de l'opset StableHLO. Cela encapsule la compatibilité avant et arrière dans les conversions entre les opérations dans le dialecte VHLO.

Compatibilité ascendante : la compatibilité ascendante est assurée par la conversion en VHLO et la rétrogradation des opérations vers une version cible. Si chaque op/type/attr d'un programme VHLO peut être rétrogradé vers la version cible, il est garanti qu'il peut être désérialisé et converti en StableHLO sur un consommateur exécutant une version supérieure ou égale à la version cible, car VHLO dispose d'un instantané de l'ensemble d'opérations à ce moment-là.

Image de compatibilité ascendante

Cette conversion de rétrogradation échouera si des opérations ou des fonctionnalités qui n'existent pas dans la version précédente de l'ensemble d'opérations sont utilisées. Cela signifie que la rétrocompatibilité est découverte sur le producteur, et non au moment de l'exécution.

Rétrocompatibilité : la rétrocompatibilité est assurée en mettant à niveau les opérations VHLO vers leur dernière version (si nécessaire), puis en convertissant une opération en StableHLO. Tous les programmes VHLO de la fenêtre de compatibilité peuvent être mis à niveau vers StableHLO, ce qui signifie que différentes versions des consommateurs peuvent désérialiser la même charge utile VHLO à partir d'une version précédente.

Image de rétrocompatibilité

Plus important encore, le VHLO est extrait derrière la sérialisation. Cela signifie que les frameworks de ML (producteurs) n'ont besoin de cibler que les opérations StableHLO, et que les backends de compilation (consommateurs) n'ont besoin que de la dernière version, à savoir l'ensemble d'opérations StableHLO. Les conversions vers et depuis VHLO sont gérées par des machines gérées dans le dépôt StableHLO.

Versions du format d'octet MLIR

Afin de maintenir la compatibilité ascendante, les versions StableHLO sont associées à une version au format MLIR Bytecode. De plus, la dernière version de StableHLO utilisera la dernière version du format de bytecode MLIR. Lorsque la version du format d'octet MLIR est incrémentée, la prochaine version de StableHLO incrémente la version mineure et met à jour le fichier Version.cpp pour qu'il utilise la dernière version du format d'octet MLIR.

Pour en savoir plus sur le format d'octet MLIR et sur sa raison d'être dans StableHLO, consultez bytecode.md.