-sdy-close-shardings
關閉張量區塊劃分,並捨棄複製的軸。
-sdy-drop-sharding-rules
從所有已註冊的作業中移除 OpShardingRuleAttr
。
-sdy-insert-explicit-reshards
插入明確的 reshard,讓所有作業都具有相容的分割。
相容的分割作業基本上是指作業可以接受分割運算元,並產生分割結果,而不需要任何重新分割通訊 (請注意,作業可能仍需要通訊,例如 all-reduce 或 halo-swap)。
傳播後,部分作業可能仍有不相容的分割作業。
請注意,如果軸 (或子軸) 用於在多個張量中分割不相符的維度 (例如 matmul 中的非收縮維度),或是軸分割一個張量中的維度,但不分割另一個張量中的相符維度,則表示該運算有分割衝突。因此,在這個階段結束後,作業就不會發生衝突。
這個階段會明確插入重新分割作業,讓每個作業的對應維度以相同方式在所有運算元和結果中分割,且每個軸 (或子軸) 只能用於分割單一維度類型。
以下是說明用範例:
輸入:
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>
輸出:
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>
在上述範例中,lhs
和 rhs
張量在其非收縮維度上都以「x」軸分割,因此發生衝突。在此處,rhs
張量會在點運算之前重新分割,明確地只在其第一個維度和「x」軸上分割。這樣一來,點運算就會變得相容。
-sdy-remove-sharding-groups
在傳播後移除 ShardingGroupOps。
-sdy-sharding-constraint-to-reshard
將 ShardingConstraintOp 轉換為 ReshardOp。
-sdy-sink-data-flow-edges
將所有 DataFlowEdgeOp
匯入輸入內容。
將每個 DataFlowEdgeOp
的分割作業移至其輸入內容 (邊緣的根目錄目標),並將作業替換為其輸入內容。
TODO(tomnatan):請考慮將區隔作業移至所有可附加區隔作業的目標。
-sdy-update-non-divisible-input-output-shardings
讓 FuncOp 輸入/輸出均勻分割,消除因不可分割的分割而需要填充的情況。
Shardy 使用者預期函式輸入/輸出內容可平均分割/分割,以免需要填充張量。傳播可能會使輸入/輸出端具有不可分割的分割,因此這個傳遞會將這些端更新為原始分割的最大維度分割前置字串,以便平均分割。