El dialecto VHLO

Consulta vhlo_checklist.md para conocer los pasos que debes seguir cuando realices cambios en VHLO.

¿Qué es el dialecto VHLO?

El dialecto VHLO (Versioned StableHLO) se usa para la serialización y la estabilidad. Proporciona un resumen del dialecto StableHLO en un momento determinado a través de la versión de elementos individuales del programa.

VHLO es un dialecto de solo adición con operaciones, tipos y atributos con versión, lo que significa que, una vez que se agrega una función al dialecto, no se puede modificar de ninguna manera que afecte la semántica.

Cualquier cambio en una operación, un tipo o un atributo requiere que se agregue una versión nueva al dialecto. Por ejemplo, si se agregara un my_op hipotético a StableHLO en la versión 0.9.0, pero se cambiara en la versión 0.11.0, tendríamos lo siguiente en 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);
}

El dialecto StableHLO solo tiene la versión más reciente de las operaciones. En el ejemplo en ejecución, el dialecto StableHLO en la versión 0.11.0 solo tendría el StableHLO_MyOp que tiene operand y attr, mientras que VHLO captura cada fase de la evolución de la operación.

¿Por qué es útil VHLO?

Tener un dialecto con control de versiones nos permite orientarnos a versiones anteriores del conjunto de operaciones de StableHLO. Esto encapsula la compatibilidad con modelos anteriores y posteriores en las conversiones entre operaciones en el dialecto VHLO.

Compatibilidad con versiones posteriores: La compatibilidad con versiones posteriores se proporciona mediante la conversión a VHLO y la baja de las operaciones a una versión de destino. Si cada operación, tipo o atributo de un programa VHLO se puede cambiar a la versión de destino, se garantiza que se pueda deserializar y convertir a StableHLO en un consumidor que ejecute una versión superior o igual a la versión de destino, ya que VHLO tiene un resumen del conjunto de operaciones en ese momento.

Imagen de retrocompatibilidad

Esta conversión de baja de versión fallará si se usan operaciones o funciones que no existen en la versión anterior del conjunto de operaciones. Esto significa que la compatibilidad con versiones posteriores se descubre en el productor, en lugar de en el tiempo de ejecución.

Retrocompatibilidad: La retrocompatibilidad se proporciona actualizando las operaciones de VHLO a su versión más reciente (si es necesario) y, luego, convirtiendo una operación a StableHLO. Todos los programas de VHLO dentro del período de compatibilidad se pueden actualizar a StableHLO, lo que significa que diferentes versiones de consumidores pueden desserializar la misma carga útil de VHLO de una versión anterior.

Imagen de retrocompatibilidad

Más importante aún, VHLO se abstrae detrás de la serialización. Esto significa que los frameworks de IA (productores) solo deben orientarse a las operaciones de StableHLO, y los backends del compilador (consumidores) solo deben admitir la versión más reciente, que es el conjunto de operaciones de StableHLO. Las conversiones hacia y desde VHLO se controlan con maquinaria que se mantiene en el repositorio de StableHLO.

Versiones del formato de código de bytes de MLIR

Para mantener la retrocompatibilidad, las versiones de StableHLO tienen una versión asociada del formato de código de bytes de MLIR. Además, la versión más reciente de StableHLO usará la versión más reciente del formato de código de bytes de MLIR. Cuando se incremente la versión del formato de código de bytes de MLIR, la próxima versión de StableHLO incrementará la versión menor y actualizará Version.cpp para usar la versión más reciente del formato de código de bytes de MLIR.

Para obtener detalles sobre el formato de código de bytes de MLIR y los motivos para usarlo en StableHLO, consulta bytecode.md.