-sdy-add-data-flow-edges
Wstawia DataFlowEdgeOp
dla każdego krawędzi przepływu danych.
Wstawia DataFlowEdgeOp
dla każdej wartości, która jest właścicielem krawędzi przepływu danych, czyli wszystkich wartości zwracanych przez getDataFlowEdgeOwners
w przypadku każdego op w module.
Wstawiona wartość DataFlowEdgeOp
przyjmie istniejące podziały docelowego obiektu właściciela, jeśli takie istnieją.
TODO(b/330339693): zaktualizuj ten dokument, gdy getDataFlowEdgeOwners
zostanie usunięty.
-sdy-apply-sharding-constraints
Stosuje ograniczenia, które określają podział danych wejściowych.
Kopiuje fragmentację ShardingConstraintOp
do danych wejściowych, jeśli spełnia wszystkie te warunki:
- Dane wejściowe nie mają fragmentacji.
- Dane wejściowe nie są generowane przez
DataFlowEdgeOp
, który zawiera podział wszystkich celów krawędzi. - Dzielenie na fragmenty
ShardingConstraintOp
zostało zakończone. - Dane wejściowe nie zawierają żadnych innych użytkowników typu
ShardingConstraintOp
aniManualComputationOp
z innym podziałem.
Oznacza to, że ShardingConstraintOp
określa podział danych wejściowych.
Pamiętaj, że podczas propagacji podział ShardingConstraintOp
zostanie przekazany do danych wejściowych lub użytkowników niezależnie od tego etapu, ale ponieważ zamknięta właściwość wymiaru nie jest przekazywana, ważne jest, aby skopiować podział, aby w pełni zachować ograniczenie w wymienionych wyżej przypadkach.
Jeśli ponadto tensor jest używany przez łańcuch elementów ShardingConstraintOp
, który spełnia wszystkie te warunki:
- Tensor nie jest generowany przez obiekt
ShardingConstraintOp
i nie ma żadnych innych użytkowników typuShardingConstraintOp
aniManualComputationOp
. - Żadne z elementów
ShardingConstraintOp
w łańcuchu nie ma więcej niż 1 zastosowania poza ostatnim. - Ostatnie
ShardingConstraintOp
w łańcuchu nie zawiera żadnych użytkowników typuShardingConstraintOp
aniManualComputationOp
(w przeciwnym razie nie jest to ostatni w łańcuchu).
ta karta zastępuje wszystkie inne sposoby użycia danych wejściowych łańcucha, które zostały zdefiniowane po ostatnim elemencie ShardingConstraintOp
w łańcuchu (i w tym samym bloku), wynikiem tego łańcucha, ponieważ to ono powinno decydować o fragmentacji tych zastosowań.
-sdy-constant-splitter
Dzieli stałe obliczenia podrzędne, aby każde z nich było stosowane raz.
Dzieli stałe obliczenia podrzędne tak, że obejmuje jednego użytkownika.
Dzięki temu podział nie jest propagowany między różnymi zastosowaniami stałych podobliczeń, ponieważ jest to uważane za fałszywą zależność (użycia stałej nie powinny być dzielone w taki sam sposób tylko dlatego, że używają tej samej stałej). W efekcie każda instancja może mieć inny podział, który może być rozpowszechniany niezależnie od swojej kopii stałego podprocesu.
Stałe obliczenia podrzędne:
- stała lub iota op (bez operandów);
- operacja rozsiewająca, wycinająca lub elementowa, której wszystkie operandy są zdefiniowane przez stałe podobliczenia (rekursywnie) wraz z całymi podobliczeniami, które definiują te operandy.
Pamiętaj, że w ramach stałego podobliczenia wartość może być używana wielokrotnie w ramach tego podobliczenia.
-sdy-lift-inlined-meshes
Wzrosty wbudowane MeshAttr
we fragmentach jako symbol MeshOp
.
Zastępuje wszystkie wbudowane obiekty MeshAttr
w elemencie TensorShardingAttr
nazwą symbolu siatki odwołującą się do istniejącego lub nowego elementu MeshOp
w module. Dzięki temu żadne dwa elementy MeshOp
nie mają identycznego parametru MeshAttr
(te zmienne również są pomijane).MeshOp
Nazwa każdej nowej MeshOp
będzie:
maximal_mesh_{device-id}
, aby uzyskać maksymalną siatkę (czyli pustą listę osi i jedyny identyfikator urządzenia).- Pierwsza dostępna nazwa w językach [
mesh
,mesh_0
,mesh_1
, ...]. W przeciwnym razie. ###-sdy-manual-axes-cleanup
Poprawiono użycie osi ręcznych w ManualComputationOp
1) W przypadku fragmentu na potrzeby fragmentu wewnętrznego, który nie ma określonej osi ręcznej, dodaj tę oś ręczną do jej osi zreplikowanych. Dzięki temu osie ręczne są zawsze w pełni określone.
2) Sortuje osie ręczne według kolejności deklaracji osi siatki.
-sdy-sharding-group-import
Kanonizacja i sprawdzanie grup dzielenia.
Stosuje konwertowanie kanoniczne i weryfikację do grup fragmentacji podczas importowania. Są to:
1) Połączenie grup fragmentacji – łączy grupy fragmentacji za pomocą właściwości przechodniej członkostwa w grupie. Za każdym razem, gdy tensor T znajduje się w grupie podziału G1 i grupie podziału G2, możemy wnioskować, że wszystkie elementy w grupach G1 i G2 powinny być podzielone w taki sam sposób. Możemy więc połączyć grupy G1 i G2 w jedną grupę. Zestaw identyfikatorów kanonicznej grupy po połączeniu będzie miał postać 0,1,...N-1 dla minimalnego zbioru grup.
2) Weryfikacja grup fragmentacji Sprawdza, czy grupy fragmentacji są poprawnie utworzone i czy są zgodne z założeniami w implementacji. Obecnie oznacza to, że jeśli grupa dzielenia na części zawiera Value
zdefiniowany w bloku ManualComputationOp
, wszystkie inne wartości w tej grupie muszą znajdować się w tym samym bloku.