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