-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 ani ManualComputationOp 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 typu ShardingConstraintOp ani ManualComputationOp;
  • ż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 typu ShardingConstraintOp ani ManualComputationOp (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

  1. 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.
  2. 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:

  1. 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.

  2. 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 bloku ManualComputationOp, wszystkie inne wartości w tej grupie muszą znajdować się w tym samym bloku.