Dialekt VHLO

Instrukcje dotyczące wprowadzania zmian w VHLO znajdziesz w artykule vhlo_checklist.md.

Co to jest dialekt VHLO?

Dialekt VHLO (Versioned StableHLO) jest używany do serializacji i stabilności. Zawiera zrzut stabilnego dialektu HLO w określonym momencie poprzez wersjonowanie poszczególnych elementów programu.

VHLO to dialekt uzupełniający z obsługiwanymi operacjami, typami i atrybutami. Oznacza to, że po dodaniu funkcji do dialektu nie można jej modyfikować w żaden sposób, który wpływa na semantykę.

Wszelkie zmiany w opcji, typie lub atrybucie wymagają dodania nowej wersji do dialektu. Jeśli na przykład hipotetyczna wartość my_op została dodana do StableHLO w wersji 0.9.0, ale została zmieniona w wersji 0.11.0, w VHLO będzie wyglądać tak:

// 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);
}

Dialekt StableHLO zawiera tylko najnowszą wersję operacji. W tym przykładzie dialekt StableHLO w wersji 0.11.0 zawierałby tylko StableHLO_MyOp, który ma operandattr, podczas gdy VHLO obejmuje każdą fazę rozwoju op.

Do czego przydaje się VHLO?

Dzięki dialektowi z wersją możemy kierować reklamy na wcześniejsze wersje przesunięcia StableHLO. Umożliwia to konwersję między operacjami na dialektach VHLO w obu kierunkach.

Zgodność wsteczna: zgodność wsteczna jest zapewniona przez konwersję na VHLO i obniżenie wersji operacji do wersji docelowej. Jeśli każde operacje/typ/atrybut w programie VHLO może zostać zdegradowany do wersji docelowej, gwarantujemy, że będzie on podlegał deserializacji i będzie można go przekonwertować na wersję StableHLO u konsumenta z wersją wyższą lub równą wersji docelowej, ponieważ VHLO ma w tym momencie zrzut opcji ustawienia.

Obraz zgodności wstecznej

Ta konwersja na starszą wersję zakończy się niepowodzeniem, jeśli zostaną użyte operacje lub funkcje, których nie było w poprzedniej wersji Opsetu. Oznacza to, że zgodność do przodu jest wykrywana u producenta, a nie w czasie działania.

Zgodność wsteczna: zgodność wsteczna jest zapewniana przez uaktualnianie operacji VHLO do ich najnowszej wersji (w razie potrzeby), a następnie konwertowanie operacji z powrotem na StableHLO. Wszystkie programy VHLO w okresie zgodności można uaktualnić do StableHLO, co oznacza, że różne wersje konsumentów mogą deserializować te same dane VHLO z poprzedniej wersji.

Obraz zgodności wstecznej

Co ważniejsze, VHLO jest abstrakcją zaimplementowaną w ramach serializacji. Oznacza to, że frameworki ML (producenci) muszą być kierowane tylko na operacje StableHLO, a back-endy kompilatorów (użytkownicy) muszą obsługiwać tylko najnowszą wersję, czyli zestaw operacji StableHLO. Konwersje na VHLO i z niej są obsługiwane przez mechanizmy utrzymywane w repozytorium StableHLO.

Wersje formatu kodu bajtowego MLIR

Aby zachować zgodność wsteczną, wersje StableHLO mają powiązaną wersję formatu kodu bajtowego MLIR. Dodatkowo najnowsza wersja StableHLO będzie używać najnowszej wersji formatu bajtowego MLIR. Gdy zwiększysz wersję formatu bajtowego MLIR, kolejna wersja StableHLO zwiększy wersję podrzędną i zaktualizuje plik Version.cpp, aby używać najnowszej wersji formatu bajtowego MLIR.

Szczegółowe informacje o formatzie kodu bajtowego MLIR oraz uzasadnienie jego używania w StableHLO znajdziesz w pliku bytecode.md.