-sdy-close-shardings
Zamykanie podziału tensora i usuwanie powielonych osi.
-sdy-drop-sharding-rules
Usuwanie OpShardingRuleAttr
ze wszystkich zarejestrowanych operacji.
-sdy-insert-explicit-reshards
Wstawia jawne podziały, aby wszystkie operacje miały zgodne podziały.
Zgodność z podzieleniem oznacza, że operacja może przyjmować podzielone operandy i wytwarzać podzielone wyniki bez konieczności komunikacji z podzielonymi elementami (pamiętaj, że operacja może nadal wymagać komunikacji, takiej jak all-reduce lub halo-swaps).
Po propagacji niektóre operacje mogą nadal mieć niezgodne podziały.
Pamiętaj, że gdy oś (lub pod-oś) jest używana do dzielenia nieodpowiadających sobie wymiarów (np. wymiarów nieobejmujących w matmul) w kilku tensorach lub gdy oś dzieli wymiar w jednym tensorze, ale nie w odpowiadającym wymiarze w drugim tensorze, mówimy, że operacja ma konflikt podziału. Dlatego po tym przejściu operacje nie będą już powodować konfliktów.
W tym przejściu operacje reshard są wstrzykiwane w sposób jawny, aby w przypadku każdej operacji odpowiednie wymiary były dzielone w taki sam sposób we wszystkich operandach i wynikach, a każda oś (lub podoś) mogła być używana tylko do dzielenia jednego typu wymiaru.
Przykład wyjaśniający:
Urządzenie wejściowe:
mesh = <"x"=4, "y"=2>
%lhs : tensor<8x32xf32> {sdy.sharding=<@mesh, \[{"y"},{"x"}\]>}
%rhs : tensor<32x16xf32> {sdy.sharding=<@mesh, \[{"y"}, {"x"}\]>}
stablehlo.dot %lhs, %rhs {sdy.sharding_per_value=<[<@mesh, \[{"x"}, {}\]>]>}
: (tensor<8x32xf32>, tensor<32x16xf32>) -> tensor<8x16xf32>
Dane wyjściowe:
sdy.mesh = <"x"=4, "y"=2>
%lhs : tensor<8x32xf32> {sdy.sharding=<@mesh, \[{"x"}, {"y"}\]>}
%rhs : tensor<32x16xf32> {sdy.sharding=<@mesh, \[{"y"}, {"x"}\]>}
%0 = sdy.reshard %rhs <@mesh, \[{"y"}, {}\]> : tensor<32x16xf32>
stablehlo.dot %lhs, %0 {sdy.sharding_per_value=<[<@mesh, \[{"x"}, {}\]>]>}
: (tensor<8x32xf32>, tensor<32x16xf32>) -> tensor<8x16xf32>
W powyższym przykładzie występuje konflikt, ponieważ tensory lhs
i rhs
są dzielone na segmenty wzdłuż osi „x” według wymiarów nieobkurczalnych. Tutaj tensor rhs
jest dzielony przed operacją dot, aby wyraźnie podzielić go tylko według pierwszego wymiaru i osi „x”. W ten sposób operacja kropkowa staje się zgodna.
-sdy-remove-sharding-groups
Usuwanie ShardingGroupOps po propagacji.
-sdy-sharding-constraint-to-reshard
Konwertuje ShardingConstraintOp na ReshardOp.
-sdy-sink-data-flow-edges
Zbiera wszystkie DataFlowEdgeOp
z wejścia.
Przenosi podział każdego elementu DataFlowEdgeOp
na dane wejściowe (pierwotny obiekt docelowy krawędzi) i zastępuje operator swoimi danymi wejściowymi.
TODO(tomnatan): rozważ przeniesienie podziału na wszystkie cele, które mogą mieć dołączony podział.
-sdy-update-non-divisible-input-output-shardings
Umożliwia równomierne dzielenie na części danych wejściowych i wyjściowych funkcji FuncOp, eliminując potrzebę wypełniania pustymi wartościami w przypadku niedzielnych części.
Użytkownicy Shardy oczekują, że wejścia/wyjścia funkcji będą mogły być dzielone na równe części lub dzielone na części, aby uniknąć konieczności wypełniania tensorów. Propagowanie może spowodować, że dane wejściowe/wyjściowe będą miały niedzielone fragmenty, dlatego ta operacja aktualizuje je do największego prefiksu podziału wymiaru w początkowym podziale, który jest równomiernie podzielony.