-sdy-close-shardings

Zamyka fragmentowanie tensorów i usuwa powielone osie.

-sdy-constant-or-scalar-merger

Łączy identyczne stałe i rozszerzenia skalarne z pasującym fragmentowaniem.

Wykonuje uproszczoną optymalizację CSE na stałych z identycznym fragmentowaniem.

Potok importu dzieli i duplikuje stałe oraz rozszerzenia skalarne w taki sposób, że fragmentowanie nie jest propagowane między różnymi zastosowaniami podrzędnego obliczenia stałej. Jeśli po propagacji stałe mają takie samo fragmentowanie, ta przepustka łączy je, aby skrócić czas kompilacji. Więcej informacji znajdziesz w artykule -sdy-constant-or-scalar-splitter.

-sdy-convert-global-to-local

Konwertuje program SDY z kształtów globalnych na kształty lokalne.

Konwertuje program SDY z kształtów globalnych na kształty lokalne, dzieląc wymiary logiczne na podstawie atrybutów fragmentowania.

Ta przepustka wykorzystuje konwerter typów do mapowania RankedTensorType z globalnych kształtów logicznych na fizyczne kształty lokalne urządzenia.

Opcje

-per-dim-all-gather                     : Keep per-dimension all-gather without combining them into a single all-gather.
-combine-multi-dimension-reduce-scatter : Combine multi-dimension reduce-scatter into a single reduce-scatter.
-enable-rgv3                            : Use StableHLO ReplicaGroupV3 (mesh-axes based) for collectives.
-replica-count                          : Number of replicas (data parallelism).
-partition-count                        : Number of partitions (model parallelism).

-sdy-drop-sharding-and-mesh

Usuwa z programu operację mesh i notację fragmentowania.

Opcje

-keep-module-sharding-metadata : Whether to keep module-level sharding metadata (sdy.parameters_shardings and sdy.output_shardings).

-sdy-drop-sharding-rules

Usuwa OpShardingRuleAttr ze wszystkich zarejestrowanych operacji.

-sdy-export-named-computations

Wywołania z NamedComputationOp.

Tworzy przepustkę, która konwertuje NamedComputationOp na CallOp z nową funkcją prywatną o nazwie name NamedComputationOp. Nowe FuncOp i CallOp mają takie samo fragmentowanie jak operandy/wyniki oryginalnych NamedComputationOp.

Jeśli w module znajduje się funkcja o takiej samej nazwie jak NamedComputationOp, tabela symboli MLIR zmieni ją na {name}_#.

-sdy-insert-explicit-reshards

Wstawia jawne zmiany fragmentowania, aby wszystkie operacje miały zgodne fragmentowanie.

Zgodne fragmentowanie oznacza, że operacja może akceptować operandy z fragmentami i generować wynik z fragmentami bez konieczności komunikacji z ponownym fragmentowaniem (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 fragmentowanie.

Gdy oś (lub podoś) jest używana do fragmentowania nieodpowiadających sobie wymiarów (np. wymiarów niekurczących się w matmul) w wielu tensorach lub gdy oś fragmentuje wymiar w jednym tensorze, ale nie odpowiadający mu wymiar w drugim tensorze, mówi się, że operacja ma konflikt fragmentowania. Dlatego po tej przepustce operacje nie będą już powodować konfliktów.

Ta przepustka wstawia operacje ponownego fragmentowania w sposób jawny, tak aby w przypadku każdej operacji odpowiadające sobie wymiary były fragmentowane w ten sam sposób we wszystkich operandach i wynikach, a każda oś (lub podoś) mogła być używana tylko do fragmentowania 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 lhs i rhs są fragmentowane na osi „x” w wymiarach niekurczących się, co jest niezgodne. Przepustka wstawia jawne ponowne fragmentowanie w rhs przed operacją dot, tak aby operacja dot miała zgodne fragmentowanie.

Opcje

-enable-full-version                     : Enable full version.
-mark-partial-result-with-unreduced-axes : Whether to mark partial reduction results with unreduced axes.

-sdy-insert-func-call-reshards

Wstawia ponowne fragmentowanie w przypadku konfliktów fragmentowania funkcji i wywołań.

Wstawia ponowne fragmentowanie w przypadku konfliktów fragmentowania funkcji i wywołań w wynikach.

-sdy-optimize-collectives

Optymalizuje operacje komunikacji zbiorowej.

Eliminuje zbędne operacje zbiorowe-permutacje poprzedzające łańcuchy all-to-all przez rozkładanie wymiarów dzielonych i łączenie ich w połączone all-to-all.

-sdy-pad-for-divisibility

Wypełnia tensory z niepodzielnym fragmentowaniem do kształtów podzielnych.

-sdy-per-instruction-partitioning

Selektywnie wyodrębnia instrukcje docelowe, uruchamia na nich potok partycjonowania, aby wygenerować kod lokalny urządzenia, i otacza je sdy.manualcomputation.

Na potrzeby debugowania i dzielenia na pół selektywnie dzieli poszczególne instrukcje za pomocą samodzielnego potoku partycjonowania Shardy (resolve-permutation-factors, reshard-to-collectives, pad-for-divisibility, convert-global-to-local) i otacza wynikowy kod lokalny urządzenia w sdy.manual_computation. Dzięki temu reszta programu globalnego pozostaje nienaruszona, więc partycje XLA SPMD dzielą tylko nieopakowane instrukcje globalne.

Opcje

-filter                   : Filter string for selective partitioning. Can be empty (all sharded ops), comma-separated op name substrings (e.g. 'dot, pad'), or key-values like 'selectLow=0, selectHigh=10, func=subroutine'.
-enable-halo-exchange     : Implement halo exchange logic for windowed operations inside the sub-pipeline.
-replica-count            : Number of replicas (data parallelism).
-partition-count          : Number of partitions (model parallelism).
-rng-bit-generator-unsafe : Whether to allow unsafe partitioning of stablehlo.rng_bit_generator.

-sdy-propagate-to-func-results

Propaguje fragmentowanie z terminatora funkcji do wyników funkcji.

Kopiuje fragmentowanie wartości terminatora funkcji do odpowiednich wyników func.func, zachowując istniejące fragmentowanie w funkcji głównej.

-sdy-remove-all-gather-reduce-scatter-for-cmv1

_Usuwa sdy.all_gather i sdy.reducescatter dla CMV1.

Usuwa all-gather we wzorcu all-gather + dot. Usuwa reduce-scatter we wzorcu dot + reduce-scatter. Ta przepustka służy do zapewnienia zgodności ze zbiorowym matmul V1 (CMV1). Jest to tymczasowe rozwiązanie problemu b/432019089.

-sdy-remove-propagation-debug-info

Usuwa dane debugowania propagacji (krawędzie propagacji i fragmentowanie źródłowe) podczas eksportu.

-sdy-remove-sharding-groups

Usuwa ShardingGroupOps po propagacji.

-sdy-remove-sub-axes-in-input-output-shardings

Usuwa podosie w fragmentowaniu wejścia/wyjścia.

Niektórzy użytkownicy Shardy oczekują, że dane wejściowe/wyjściowe funkcji będą miały fragmentowanie bez podosi. Ta przepustka usuwa podosie i ich osie końcowe z fragmentowania wymiarów otwartych wejścia/wyjścia. Ta przepustka jest zwykle wykonywana po sdy-update-non-divisible-input-output-shardings, aby mieć pewność, że usunięcie podosi nie spowoduje wprowadzenia niepodzielnego fragmentowania.

-sdy-reshard-to-collectives

Konwertuje ReshardOp na różne operacje zbiorowe Shardy.

Dopasowuje operacje ponownego fragmentowania i przepisuje je na różne operacje zbiorowe Shardy. Po tej przepustce w module nie pozostaną żadne operacje ponownego fragmentowania.

Opcjonalnie, jeśli keepRedundantReshards ma wartość true, pozostaną tylko zbędne operacje ponownego fragmentowania. Domyślnie zakłada się, że jawne ponowne fragmentowanie zostało już wstawione (sdy-insert-explicit-reshards), i nie zachowuje zbędnego ponownego fragmentowania. Powinna zachować zbędne ponowne fragmentowanie, jeśli jawne ponowne fragmentowanie nie zostało jeszcze wstawione.

Przykład:

Urządzenie wejściowe:

mesh = <"x"=2, &q>uot;y"=<2, ">;z"=2
%0 <: tensor16x2xf32 {sdy.sharding>@mesh, \[{"x",< "y", &quo>t;z"<}, {}\]<>/span>
%1 = sdy.reshard %arg0 @mesh, \[{"x"}, {}\] : tensor16x2xf32

Dane wyjściowe:

mesh = <"x"=2, &q>uot;y"=<2, ">;z"=2
%0 <: tensor16x2xf32 {sdy.sharding>@mesh, \[{"x", "y", "z"}, {}\]<
%1 = sdy.all_gather> \[{&quo<t;y">;, "z"}, {}\] %arg0 out_sharding=@mesh, \[{"x"}, {}\] : tensor16x2xf32

W przykładzie powyżej tensor %0 : tensor<16x2xf32> jest fragmentowany jako \[{"x", "y", "z"}, {}\]. Następnie występuje operacja reshard zmieniająca jego fragmentowanie na \[{"x"}, {}\]. W przypadku pierwszych osi, ponieważ po ponownym fragmentowaniu usuwany jest sufiks {"y", "z"} , wnioskujemy, że mamy all-gather {"y", "z"}. Drugi wymiar nie jest zmieniany.

Opcje

-keep-redundant-reshards : Whether it keeps redundant reshards or removes.

-sdy-resolve-permutation-factors

Rozwiązuje fragmentowanie w wymiarach mapowanych na czynniki kPermutation.

Fragmentowanie wymiarów za pomocą czynników kPermutation może wymagać komunikacji między urządzeniami (np. wymiany halo w przypadku okien lub zbiorowych permutacji w przypadku odwróceń).

Jeśli enableHaloExchange ma wartość true, przepustka użyje dostępnej zoptymalizowanej logiki komunikacji do rozwiązania czynników permutacji. W przeciwnym razie przepustka po prostu wstawi operacje sdy.reshard, aby powielić te wymiary. Domyślna wartość enableHaloExchange to true.

Opcje

-enable-halo-exchange     : Implement halo exchange logic for windowed operations.
-replica-count            : Number of replicas (data parallelism).
-partition-count          : Number of partitions (model parallelism).
-rng-bit-generator-unsafe : Whether to allow unsafe partitioning of stablehlo.rng_bit_generator.

-sdy-resolve-single-device-sharding

Obniża operacje na jednym urządzeniu do stablehlo.if chronionego przez identyfikator urządzenia docelowego.

Opcje

-replica-count   : Number of replicas per partition.
-partition-count : Number of partitions per replica.

-sdy-sharding-constraint-to-reshard

Konwertuje ShardingConstraintOp na ReshardOp.

-sdy-sink-data-flow-edges

Wszystkie DataFlowEdgeOp są przenoszone do ich wejścia.

Przenosi fragmentowanie każdej DataFlowEdgeOp do jej wejścia (docelowego elementu głównego krawędzi) i zastępuje operację jej wejściem.

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-sink-func-data-flow-edges

Wszystkie FuncDataFlowEdgeOp są przenoszone do ich wejścia.

Przenosi fragmentowanie każdej FuncDataFlowEdgeOp do jej wejścia i zastępuje operację jej wejściem.

-sdy-unflatten-call-graph

Spłaszcza graf wywołań.

Spłaszcza graf. Usuwa duplikaty funkcji z takim samym fragmentowaniem wejścia/wyjścia i takim samym źródłem, jak opisano w „original_func_name” dołączonym do funkcji.

Opcje

-dedup-functions-fully : If true, regardless of the input and output shardings of functions, it keeps one callee function for each caller function. The default is false, meaning it will deduplicate only if the input and output shardings are the same.

-sdy-update-non-divisible-input-output-shardings

Sprawia, że dane wejściowe/wyjściowe FuncOp są równomiernie fragmentowane, eliminując potrzebę dopełniania z powodu niepodzielnego fragmentowania.

Użytkownicy Shardy oczekują, że dane wejściowe/wyjściowe funkcji będą równomiernie podzielne/fragmentowane, aby uniknąć konieczności dopełniania tensorów. Propagacja może spowodować, że dane wejściowe/wyjściowe będą miały niepodzielne fragmentowanie, dlatego ta przepustka aktualizuje je do najdłuższego prefiksu fragmentowania wymiarów oryginalnego fragmentowania, które jest równomiernie fragmentowane.

-sdy-verify-unreduced-axes

Sprawdza spójność użycia osi nieograniczonych.

Sprawdza, czy w przypadku każdej operacji, jeśli jej operandy mają osie nieograniczone, operacja albo jawnie je ogranicza (np. za pomocą sdy.reshard), albo przekazuje je do swoich wyników (albo jest operacją ograniczającą, taką jak func.call).