-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żdej opcji w module.
Wstawiony element DataFlowEdgeOp
użyje istniejącego podziału na fragmenty w przypadku docelowego obiektu właściciela, jeśli taki istnieje.
-sdy-apply-sharding-constraints
Stosuje ograniczenia, które określają podział danych wejściowych.
Skopiuj podział ShardingConstraintOp
na dane wejściowe, jeśli spełnia wszystkie te warunki:
- Dane wejściowe nie mają istniejącego podziału.
- Dzielenie
ShardingConstraintOp
jest całkowicie zamknięte. - Dane wejściowe nie zawierają żadnych innych użytkowników typu
ShardingConstraintOp
aniManualComputationOp
z innym podziałem.
Te warunki wskazują, że ShardingConstraintOp
określa podział danych wejściowych.
Jeśli dane wejściowe są generowane przez DataFlowEdgeOp
, zamiast ustawiania podziału input
zastępujemy wszystkie wystąpienia input
wartością ShardingConstraintOp
, aby uniknąć ograniczenia podziału wszystkich docelowych wartości na krawędzi.
Pamiętaj, że podział ShardingConstraintOp
zostanie rozproszony na dane wejściowe lub użytkowników podczas propagacji niezależnie od tego przejścia, ale ponieważ zamknięta właściwość wymiaru nie jest rozpowszechniana, ważne jest, aby skopiować podział, aby w pełni przestrzegać ograniczenia 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 tworzony przez
ShardingConstraintOp
i nie ma żadnych innych użytkowników typuShardingConstraintOp
aniManualComputationOp
; - żaden z
ShardingConstraintOp
w łańcuchu nie jest używany więcej niż raz (z wyjątkiem ostatniego); - ostatni element
ShardingConstraintOp
w łańcuchu nie ma żadnych użytkowników typuShardingConstraintOp
aniManualComputationOp
(w przeciwnym razie nie jest ostatnim w łańcuchu);
wtedy ten pass zastępuje wszystkie inne zastosowania danych wejściowych łańcucha, które są zdefiniowane po ostatnim ShardingConstraintOp
w łańcuchu (i w tym samym bloku), zastępując je wynikiem łańcucha, który powinien określać podział tych zastosowań.
-sdy-constant-splitter
Dzieli stałe podobliczenia, tak aby każde z nich było używane tylko raz.
Dzieli stałe podobliczenia tak, aby miały 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ść (nie należy dzielić stałych w taki sam sposób tylko dlatego, że używają one tej samej stałej). W efekcie każda instancja może mieć inny podział, który może być rozpowszechniany oddzielnie w swojej kopii stałego podprocesu.
Stała podobliczenia podrzędnego może być:
- 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 uwzględnione w MeshAttr
w podziale na części jako symbol MeshOp
.
Zastępuje wszystkie wbudowane elementy MeshAttr
w elementach TensorShardingAttr
nazwą symbolu siatki, która odwołuje się do istniejącego lub nowego elementu MeshOp
w module, tak aby żadne 2 elementy MeshOp
nie miały identycznego elementu MeshAttr
(istniejące elementy MeshOp
są również usuwane).
Nazwa każdej nowej MeshOp
będzie:
maximal_mesh_{device-id}
, aby uzyskać maksymalną siatkę (czyli pustą listę osi i jedyny identyfikator urządzenia), lub- Pierwsza dostępna nazwa z listy [
mesh
,mesh_0
,mesh_1
, ...].
-sdy-manual-axes-cleanup
Poprawiono użycie osi ręcznych w ManualComputationOp
- W przypadku podziału wejść/wyjść, który nie ma zdefiniowanej osi ręcznej, dodaj tę oś do replicated_axes. Ma to zapewnić, aby osi ręcznych zawsze towarzyszyły pełne dane.
- Sortuje osie ręczne według kolejności deklaracji osi siatki.
-sdy-sharding-group-import
Kanonizacja i sprawdzanie grup dzielenia.
Stosuje kanonizację i sprawdzenie do grup dzielenia na części podczas importowania. Są to:
Ujednolicenie grup fragmentacji
Łączy grupy dzielenia za pomocą właściwości przechodniej dotyczącej członkostwa w grupie. Za każdym razem, gdy tensor T znajduje się w grupie dzielenia na części G1 igrupie dzielenia na części G2, możemy wnioskować, że wszystkie elementy w grupach G1 i G2 powinny być podzielone na części w taki sam sposób. Możemy więc połączyć grupy G1 i G2 w jedną grupę. Po złączeniu zestaw identyfikatorów kanonicznej grupy będzie zawierał wartości 0,1,…N-1 dla minimalnego zestawu grup.
Walidacja grupy fragmentacji
Sprawdza, czy grupy dzielenia są prawidłowo sformułowane i zgodne z założeniami w ramach implementacji. Obecnie oznacza to, że jeśli grupa dzielenia zawiera
Value
zdefiniowaną w blokuManualComputationOp
, wszystkie inne wartości w tej grupie muszą znajdować się w tym samym bloku.