-sdy-close-shardings
Zamykanie podziału tensora i usuwanie powielonych osi.
-sdy-constant-merger
Scalanie identycznych stałych z pasującymi podziałami.
Wykonuje lekkie szyfrowanie szyfrowaniem symetrycznym na stałych wartościach z identycznymi podziałami.
Przepustowość importu dzieli i duplikuje stałe, tak aby podział nie był propagowany między różnymi zastosowaniami stałych podobliczeń. Jeśli po propagacji stałe mają te same podziały, ten etap scala je, aby skrócić czas kompilacji.
-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 nieobkurczalnych w matmul) na kilka tensorów 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 wyraźny sposób, 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:
Urządzenie wejściowe:
mesh = <"x"=4, "y"=2>
%lhs : tensor<8x32xf32> {sdy.sharding=<@mesh, \[{"x"}, {"y"}\]>}
%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 przykładzie powyżej elementy lhs
i rhs
są dzielone na części na osi „x” według wymiarów nieobkurczalnych, co jest niezgodne. Przed operacją dot wstawia jawne reshard na rhs
, aby operacja dot miała zgodne podziały.
-sdy-remove-sharding-groups
Usuwanie ShardingGroupOps po propagacji.
-sdy-reshard-to-collectives
Konwertuje ReshardOp na różne operacje zbiorcze Shardy.
Dopasowuje operacje reshard i przepisuje je na różne operacje zbiorcze Shardy. Po tej operacji w module nie pozostają żadne operacje reshardingu. Ten krok zakłada, że jawne zasoby zostały już wstawione (sdy-insert-explicit-reshards
).
Przykład:
Urządzenie wejściowe:
mesh = <"x"=2, "y"=2, "z"=2>
%0 : tensor<16x2xf32> {sdy.sharding<@mesh, \[{"x", "y", "z"}, {}\]>
%1 = sdy.reshard %arg0 <@mesh, \[{"x"}, {}\]> : tensor<16x2xf32>
Dane wyjściowe:
mesh = <"x"=2, "y"=2, "z"=2>
%0 : tensor<16x2xf32> {sdy.sharding<@mesh, \[{"x", "y", "z"}, {}\]>
%1 = sdy.all_gather \[{"y", "z"}, {}\] %arg0 out_sharding=<@mesh, \[{"x"}, {}\]> : tensor<16x2xf32>
W tym przykładzie tensor %0 : tensor<16x2xf32>
jest dzielony na części \[{"x", "y", "z"}, {}\]
. Następnie jest reshard
op resharding it as
\[{"x"}, {}\]
. Na pierwszych osiach, ponieważ sufiks {"y", "z"}
został usunięty po przekształceniu, możemy wnioskować, że mamy do czynienia z wszystkimi danymi {"y", "z"}
. Drugi wymiar nie ulega zmianie.
-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
do jego danych wejściowych (elementu docelowego na poziomie wierzchołka) i zastępuje operatora jego wartością wejściową.
Opcje
-sink-debug-sharding-origins : Whether to sink the debug sharding origins info. See `debug-sharding-origins` option in propagation for more info.
-sink-debug-propagation-edge-sharding : Whether to sink the debug propagation edge sharding info. See `debug-propagation-edge-sharding` option in propagation for more info.
-sdy-temp-explicit-reshards-for-optimizations
Wstawia jawne rozdzielcze dla konkretnych optymalizacji.
Ten bilet jest rozwiązaniem tymczasowym, dopóki nie włączymy domyślnie biletu sdy-insert-explicit-reshards
.
Umożliwia nam to wstawianie jawnych reshardów w przypadku konkretnych operacji na potrzeby optymalizacji.
-sdy-update-non-divisible-input-output-shardings
Zapewnia równomierne podzielenie na fragmenty danych wejściowych i wyjściowych funkcji FuncOp, eliminując potrzebę wypełniania pustymi wartościami w przypadku niedzielnych fragmentów.
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 wejścia/wyjścia będą miały niedzielone podziały, dlatego ta operacja aktualizuje je do największego prefiksu podziału wymiaru w początkowym podziale, który jest równomiernie podzielony.