

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 張量平行處理的運作方式
<a name="model-parallel-extended-features-pytorch-tensor-parallelism-how-it-works"></a>

張量平行處理可在 `nn.Modules` 層級運作；其可將模型的特定模組跨張量平行等級分割。這是管道平行處理所用的*模組集*現有分區之外的補充。

當模組透過張量平行處理進行分割時，會分散其向前與向後傳播。程式庫會處理所有裝置之間的必要通訊，以實作這些模組的分散式執行。模組會跨多個資料平行等級進行分割。與傳統工作負載發佈相反，當使用程式庫的張量平行處理時，每個資料平行等級均**無**完整模型複本。反之，除了整個未分散的模組，每個資料平行等級可能只有分散式模組的分區。

**範例：**考慮跨資料平行等級的張量平行處理，其中資料平行處理程度為 4，而張量平行處理程度為 2。假設您有資料平行群組，且在分割模組集之後，其包含下列模組樹狀目錄。

```
A
├── B
|   ├── E
|   ├── F
├── C
└── D
    ├── G
    └── H
```

假設模組 B、G、H 支援張量平行處理，則此模型的張量平行分割可能結果之一如下：

```
dp_rank 0 (tensor parallel rank 0): A, B:0, C, D, G:0, H
dp_rank 1 (tensor parallel rank 1): A, B:1, C, D, G:1, H
dp_rank 2 (tensor parallel rank 0): A, B:0, C, D, G:0, H
dp_rank 3 (tensor parallel rank 1): A, B:1, C, D, G:1, H
```

每一行代表儲存在該 `dp_rank` 的模組集，表示法 `X:y` 代表模組 `X` 的第 `y` 個部分。注意下列事項：

1. 分割發生在跨資料平行級的子集 (稱為 `TP_GROUP`)，而非整個 `DP_GROUP`，以便跨 `dp_rank` 0 與 `dp_rank` 2 複寫確切的模型分割，並以類似方式跨 `dp_rank` 1 與 `dp_rank` 3 進行複寫。

1. 模組 `E` 與 `F` 不再是模型的一部分，這是因為其父模組 `B` 已分割，且在任何正常情況，屬於 `E` 與 `F` 一部分的任何執行會在 (已分割) `B` 模組進行。

1. 儘管張量平行處理支援 `H`，但在此範例並未進行分割，這強調顯示是否分割模組取決於使用者輸入。張量平行處理支援模組的事實未必代表會對其進行分割。

## 程式庫如何調整張量平行處理，使其適應 PyTorch `nn.Linear` 模組
<a name="model-parallel-extended-for-pytorch-adapt-to-module"></a>

當透過資料平行等級執行張量平行處理時，會*針對分割的模組*，在張量平行裝置之間分割參數、漸層與最佳化工具狀態的子集。對於模組的其餘部分，張量平行裝置會以一般資料平行方式操作。若要執行分割的模組，裝置會先在相同張量平行處理群組跨對等裝置收集*所有資料範例*的必要部分。然後，裝置會在所有這些資料範例執行模組的本機部分，接著再執行另一輪同步，這兩個階段都會合並每個資料範例的輸出部分，並將合併的資料範例傳回資料範例首次產生的 GPU。下圖顯示範例就已分割的 `nn.Linear` 模組說明此程序。

![\[兩個圖顯示兩個張量平行概念。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/distributed/model-parallel/tensor-parallel-concept.png)


第一個圖顯示具大型 `nn.Linear` 模組的小型模型，在兩個張量平行處理等級進行資料平行處理。該 `nn.Linear` 模組複寫至兩個平行等級。

第二個圖顯示在分割 `nn.Linear` 模組時，套用張量平行處理至較大模型。每個 `tp_rank` 保留一半線性模組以及整個作業的其餘部分。當執行線性模組時，每個 `tp_rank` 都會針對所有資料範例收集相關的一半，並將其傳遞到其所屬 `nn.Linear` 模組的一半。結果需要減少散佈 (以求和作為減少作業)，以便每個等級都有其各自資料範例的最終線性輸出。模型的其餘部分以典型資料平行方式執行。