-sdy-add-data-flow-edges

為每個資料流動邊插入 DataFlowEdgeOp

針對資料流動邊緣的擁有者 (也就是模組中每個操作的 getDataFlowEdgeOwners 所傳回的所有值),為每個值插入 DataFlowEdgeOp

插入的 DataFlowEdgeOp 會採用擁有者目標的現有區塊劃分 (如果有的話)。

-sdy-apply-sharding-constraints

套用限制,以便決定輸入內容的分割方式。

如果 ShardingConstraintOp 滿足下列所有條件,就會將其分割作業複製到輸入內容:

  • 輸入內容沒有現有的切割。
  • ShardingConstraintOp 的分割作業已完全關閉。
  • 輸入內容沒有其他使用者,且使用者類型為 ShardingConstraintOpManualComputationOp,且使用者有不同的分割。

這些條件表示 ShardingConstraintOp 會決定輸入內容的分割方式。

如果輸入內容是由 DataFlowEdgeOp 產生,我們會將 input 的所有用途替換為 ShardingConstraintOp,以免限制邊緣的所有目標分割。

請注意,無論此傳遞是否成功,ShardingConstraintOp 的區隔作業都會在傳遞期間傳播至其輸入或使用者,但由於維度的封閉屬性不會傳播,因此請務必複製區隔作業,以便在上述情況下完全遵守限制。

此外,如果張量是由一連串 ShardingConstraintOp 使用,且符合下列所有條件:

  • 張量不是由 ShardingConstraintOp 產生,也沒有任何其他 ShardingConstraintOpManualComputationOp 類型的使用者。
  • 除了最後一個 ShardingConstraintOp 外,鏈結中的所有 ShardingConstraintOp 都只使用一次;
  • 鏈結中的最後一個 ShardingConstraintOp 沒有任何 ShardingConstraintOpManualComputationOp 類型的使用者 (否則就不是鏈結中的最後一個)。

然後,這個傳遞會將鏈結的結果取代鏈結輸入的所有其他用途,這些用途是在鏈結中的最後一個 ShardingConstraintOp (以及同一區塊內) 之後定義,因為它應會指示這些用途的分割。

-sdy-constant-splitter

將常數子運算分割,讓每個子運算只使用一次。

將常數子運算分割,讓每個子運算都有單一使用者。

這可確保在常數子運算的不同用途之間不會傳播分割作業,因為這會被視為錯誤的依附元件 (常數的用途不應以相同方式分割,只因它們使用相同的常數)。實際上,每個用途都可以有不同的切割作業,可獨立傳播至常數子運算的專屬副本。

常數子運算可分為以下兩種:

  • 常數或 iota 運算子 (沒有運算元)
  • 廣播、切片或純元素運算子,其運算元皆由常數子運算 (遞迴) 定義,以及定義運算元的整個子運算。

請注意,在常數子運算中,值可在該子運算中多次使用。

-sdy-lift-inlined-meshes

將分割區中的內嵌 MeshAttr 提升為符號 MeshOp

TensorShardingAttr 中任何內嵌的 MeshAttr 替換為網格符號名稱,並參照模組中現有或新的 MeshOp,以便確保沒有兩個 MeshOp 具有相同的 MeshAttr (現有的 MeshOp 也會進行重複排除)。

每個新的 MeshOp 名稱會是下列其中一種:

  • maximal_mesh_{device-id} (用於最大網格,即空白軸清單和單一裝置 ID),或
  • [mesh, mesh_0, mesh_1, ...] 中第一個可用的名稱。

-sdy-manual-axes-cleanup

清理 ManualComputationOp 中手動軸的使用情形

  1. 對於未指定手動軸的任何入/出切割,請將該手動軸新增至其 replicated_axes。這麼做可確保手動軸一律完整指定。
  2. 以網格軸宣告順序排序手動軸。

-sdy-sharding-group-import

為分割群組執行標準化和驗證作業。

在匯入時,將標準化和驗證套用至分割群組。具體來說,這些功能包括:

  1. 分割群組統合

    使用群組成員的傳遞性屬性,合併分割群組。每當向量 T 位於切割群組 G1 切割群組 G2 時,我們可以推斷 G1 和 G2 中的所有成員都應以相同方式切割。因此,我們可以將 G1 和 G2 合併為單一群組。合併後的標準群組 ID 集合,將會是 0,1,...N-1,其中 N 是群組的最小集合。

  2. 分割群組驗證

    驗證分割群組是否正確形成,且符合實作中的假設。這項驗證目前會指出,如果區塊處理群組包含在 ManualComputationOp 區塊內定義的 Value,則該群組中的所有其他值都必須位於相同的區塊中。