Dialekt VHLO

Co to jest dialekt VHLO?

Dialekt VHLO (Versioned StableHLO) służy do serializacji i stabilności. Zapewnia migawkę dialektu StableHLO w danym momencie dzięki obsłudze wersji poszczególnych elementów programu.

VHLO to dialekt umożliwiający tylko dodawanie z operacjami, typami i atrybutami z wersją. Oznacza to, że po dodaniu cechy do dialektu nie można jej w żaden sposób zmieniać jej semantyki.

Wszelkie zmiany operacji, typu lub atrybutu wymagają dodania nowej wersji do dialektu. Jeśli na przykład hipotetyczna wartość my_op została dodana do wersji StableHLO w wersji 0.9.0, ale została zmieniona w wersji 0.11.0, w VHLO znajdą się te dane:

// 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 ma tylko najnowszą wersję operacji. W aktywnym przykładzie dialekt StableHLO w wersji 0.11.0 będzie miał tylko StableHLO_MyOp zawierający operand i attr, a VHLO rejestruje wszystkie fazy ewolucji operacji.

Do czego przydatny jest przegląd VHLO?

Użycie dialektu wersji pozwala kierować reklamy na poprzednie wersje opcji SttableHLO. Obejmuje to zgodność w przód i do tyłu w konwersjach między operacjami w dialekcie VHLO.

Zgodność z przekierowywaniem: zgodność z przekierowywaniem jest zapewniana przez przekonwertowanie na VHLO i zmianę operacji na wersję docelową. Jeśli każda operacja/typ/attr w programie VHLO może zostać zdegradowana do wersji docelowej, można poddać ją deserializacji i przekonwertować na wersję StableHLO u konsumenta korzystającego z wersji wyższej lub równej tej wersji docelowej, ponieważ VHLO ma w tym czasie zrzut planowanego działania.

Przekieruj obraz zgodności

Ta konwersja na niższą wersję nie powiedzie się w przypadku użycia operacji lub funkcji, które nie występują w poprzedniej wersji ustawienia. Oznacza to, że zgodność jest wykrywana u producenta, a nie w czasie działania aplikacji.

Zgodność wsteczna: zgodność wsteczna jest zapewniana przez uaktualnienie operacji VHLO do najnowszej wersji (w razie potrzeby), a następnie przekonwertowanie operacji z powrotem na wersję StableHLO. Wszystkie programy VHLO w okresie zgodności można uaktualnić do wersji stabilnej. Oznacza to, że różne wersje konsumentów mogą deserializować ten sam ładunek VHLO z poprzedniej wersji.

Obraz zgodności wstecznej

Co więcej, VHLO nie jest częścią serii. Oznacza to, że platformy systemów uczących się (producenty) muszą być kierowane tylko na operacje StableHLO, a backendy kompilatora (klienci) muszą obsługiwać tylko najnowszą wersję, czyli zbiór operacji StableHLO. Do obsługi konwersji do i z VHLO służą maszyny obsługiwane w repozytorium StableHLO.

Wersje formatu bajtowego kodu MLIR

Aby zachować zgodność z wyprzedzeniem, wersje StableHLO mają powiązaną wersję MLIR w formacie bajtowego kodu. Dodatkowo najnowsza wersja StableHLO będzie używać najnowszej wersji formatu bajtowego MLIR. Gdy liczba wersji w formacie bajtowego MLIR wzrośnie, w kolejnej wersji StableHLO zostanie dodana wersja podrzędna i zaktualizowana Version.cpp tak, aby używała najnowszej wersji formatu bajtowego MLIR.

Szczegółowe informacje na temat formatu bajtowego MLIR oraz uzasadnienia jego użycia w standardowej wersji StableHLO znajdziesz w pliku bytecode.md.

Wprowadzanie niezgodnych zmian

Wszystkie zmiany mające wpływ na zgodność muszą przejść przez proces RFC. Obejmuje to dodanie, wycofywanie lub zmianę nazwy funkcji. Po zatwierdzeniu RFC – oto kilka wytycznych dotyczących przekazywania:

Zwróć uwagę na numer wersji w pliku Version.h.

Przed zaktualizowaniem operacji, atrybutów, typów lub konwersji VHLO zwiększ numer wersji podrzędnej w Version.h. Wszystkie nowe funkcje VHLO będą używały tej wersji z błędami, np. po dotknięciu 0.10.0 --> 0.11.0, nowa operacja w VhloOps.td będzie używała:

VHLO_Op<"abs_v2", "0.11.0", "current">

Dodaj wymaganą implementację VHLO i konwersje

Dokładny kod potrzebny do integracji nowej funkcji może się różnić, ale w większości przypadków należy zmienić te elementy:

Ostatnim przykładem zgłoszenia związanego ze zgodnością jest dodanie 2 typów FP8, a także ich wdrożenie w VHLO w #1379.

Dodaj / zaktualizuj testy jednostkowe

Osoba, która wywołała niezgodną zmianę, odpowiada za zarówno pozytywne, jak i negatywne testy jednostkowe cechy, a także testy zgodności jednostkowe.

Testowanie jednostek zgodności obejmuje aktualizację pliku stablehlo_legalize_to_vhlo.mlir, aby zapewnić, że system StableHLO w obie strony korzysta z najnowszej wersji VHLO. Oprócz tego wymagane są też dodatkowe testy zgodności wstecznej lub wstecznej.

Oto kilka przykładów:

Dodaj wersjonowany test serializacji

Po dodaniu punktu testowego do stablehlo_legalize_to_vhlo.mlir utwórz kopię pliku o nazwie stablehlo_legalize_to_vhlo.0_X_0.mlir w podany niżej sposób wraz z kodem bajtowym tego pliku z rozszerzeniem .0_X_0.mlir.bc. Dodaj odpowiednie wiersze FileCheck, aby przetestować zgodność z praktyką i dotychczasową.

$ export TARGET_VERSION=0.X.0
$ export TARGET_FILENAME=${TARGET_VERSION//./_}
$ cp stablehlo/tests/stablehlo_legalize_to_vhlo.mlir stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir
$ build/bin/stablehlo-translate --serialize --target=$TARGET_VERSION --strip-debuginfo stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir > stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir.bc

# Replace RUN commands in stablehlo/tests/stablehlo_legalize_to_vhlo.0_X_0.mlir with the following for 0.X.0:
// RUN: stablehlo-opt --mlir-print-op-generic %s.bc | FileCheck %s
// RUN: stablehlo-translate --deserialize %s.bc | stablehlo-translate --serialize --target=0.X.0 | stablehlo-opt --mlir-print-op-generic | FileCheck %s
// RUN: diff <(stablehlo-translate --deserialize %s.bc | stablehlo-opt) <(stablehlo-opt --strip-debuginfo %s)
// RUN: diff %s.bc <(stablehlo-translate --serialize --target=0.X.0 --strip-debuginfo %s)

Przykład testu wersji w #1430.