Диалект VHLO

См. vhlo_checklist.md , чтобы узнать, какие действия необходимо выполнить при внесении изменений в VHLO.

Что такое диалект VHLO?

Диалект VHLO (Versioned StableHLO) используется для сериализации и стабильности. Он обеспечивает снимок диалекта StableHLO на данный момент времени путем управления версиями отдельных элементов программы.

VHLO — это диалект, предназначенный только для надстроек, с версионными операциями, типами и атрибутами . Это означает, что после добавления функции в диалект ее нельзя изменить каким-либо образом, влияющим на семантику.

Любые изменения в операции, типе или атрибуте требуют добавления новой версии в диалект. Например, если бы гипотетический my_op был добавлен в StableHLO в версии 0.9.0, но был изменен в версии 0.11.0, в 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);
}

Диалект StableHLO имеет только последнюю версию ops. В текущем примере диалект StableHLO версии 0.11.0 будет иметь только StableHLO_MyOp с operand и attr , в то время как VHLO фиксирует каждую фазу развития операции.

Чем полезен VHLO?

Наличие версионного диалекта позволяет нам ориентироваться на предыдущие версии опсета StableHLO. Это инкапсулирует прямую и обратную совместимость при преобразованиях между операциями на диалекте VHLO.

Прямая совместимость: Прямая совместимость обеспечивается путем преобразования в VHLO и понижения операционной системы до целевой версии. Если каждую операцию/тип/атрицу в программе VHLO можно понизить до целевой версии, ее гарантированно можно будет десериализовать и преобразовать в StableHLO на потребителе, использующем версию, большую или равную целевой версии, поскольку VHLO имеет снимок опсет того времени.

Изображение прямой совместимости

Это преобразование на более раннюю версию завершится неудачно, если используются операции или функции, отсутствующие в предыдущей версии опсета. Это означает, что прямая совместимость обнаруживается у производителя, а не во время выполнения.

Обратная совместимость: обратная совместимость обеспечивается путем обновления операций VHLO до последней версии (при необходимости) с последующим преобразованием операции обратно в StableHLO. Все программы VHLO в окне совместимости можно обновить до StableHLO, что означает, что разные версии потребителей могут десериализовать одну и ту же полезную нагрузку VHLO из предыдущей версии.

Изображение обратной совместимости

Что еще более важно, VHLO абстрагируется от сериализации. Это означает, что платформам ML (производителям) необходимо ориентироваться только на операции StableHLO, а серверным компонентам компилятора (потребителям) необходимо поддерживать только последнюю версию, которая представляет собой набор операций StableHLO. Преобразования в VHLO и обратно выполняются с помощью оборудования, поддерживаемого в репозитории StableHLO.

Версии формата байт-кода MLIR

Для обеспечения прямой совместимости версии StableHLO имеют связанную версию формата байт-кода MLIR. Кроме того, последняя версия StableHLO будет использовать последнюю версию формата байт-кода MLIR. При увеличении версии формата байт-кода MLIR в следующем выпуске StableHLO будет увеличена дополнительная версия и обновлено Version.cpp для использования последней версии формата байт-кода MLIR.

Подробную информацию о формате байт-кода MLIR и обосновании его использования в StableHLO см. в bytecode.md .