

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

# 管道模型
<a name="model-parallel-core-features-pipieline-parallelism"></a>

SageMaker 模型平行化程式庫的其中一項核心功能是*管道平行化*，其可決定進行運算順序，以及在模型訓練期間跨裝置處理資料的順序。管道傳輸是在模型平行化達成真正平行化的技術，方法是讓 GPU 在不同資料範例同時運算，並克服因循序運算而導致的效能損失。當您使用管道平行處理時，訓練任務會以管道方式透過微批次執行，以利最大化 GPU 使用率。

**注意**  
管道平行處理 (也稱為模型分割) 可用於 PyTorch 與 TensorFlow。如需架構的支援版本清單，請參閱[支援的架構和 AWS 區域](distributed-model-parallel-support.md)。

## 管道執行排程
<a name="model-parallel-pipeline-execution"></a>

管道傳輸是基於將迷你批次分割為微批次，將其逐一送入訓練管道，並遵循程式庫執行期所定義的執行排程。*微批次*是指定訓練迷你批次的較小子集。管道排程決定每個時段由哪個裝置執行哪個微批次。

例如，根據管道排程與模型分割區而定，GPU `i` 可能會在微批次 `b` 執行 (向前或向後) 運算，而 GPU `i+1` 則在微批次 `b+1` 執行運算，進而同時保持兩個 GPU 處於有效狀態。在單次向前或向後傳遞期間，單一微批次的執行流程可能多次造訪相同裝置，具體取決於分割決定。例如，模型開頭的作業可能與模型結束時間的作業位於同一裝置，而介於兩者之間的作業則位於不同裝置，這代表造訪該裝置兩次。

程式庫提供兩種不同管道排程，分別是*簡便式*與 *INTERLEAVED*，可使用 SageMaker Python SDK 的 `pipeline` 參數進行設定。在多數情況，INTERLEAVED 管道可更有效利用 GPU 來達到較佳效能。

### INTERLEAVED 管道
<a name="model-parallel-pipeline-execution-interleaved"></a>

在 INTERLEAVED 管道，盡可能優先考量微批次的向後執行。這樣可更快釋放用於啟用的記憶體，以便更以有效的方式使用記憶體。這還允許更高度擴展微批次數量，進而減少 GPU 的閒置時間。在穩定狀態，每個裝置在向前與向後傳遞之間進行交替。這代表可能會先執行單一微批次的向後傳遞，即使另一微批次的向前傳遞尚未完成。

![\[2 個 GPU 上交錯管道的範例執行排程。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/distributed/model-parallel/interleaved-pipeline-execution.png)


上圖為執行排程範例，說明 2 個 GPU 的 INTERLEAVED 管道。在圖中，F0 代表微批次 0 的向前傳遞，B1 代表微批次 1 的向後傳遞。**更新**代表參數的最佳化工具更新。GPU0 一律會盡可能優先處理向後傳遞 (例如，先執行 B0，然後再執行 F2)，這可允許清除之前用於啟用的記憶體。

### 簡便管道
<a name="model-parallel-pipeline-execution-simple"></a>

相比之下，簡便管道會先完成執行每個微批次的向前傳遞，然後再開始向後傳遞。這代表其只在其管道內傳輸向前傳遞及向後傳遞階段。下圖範例說明這在 2 個 GPU 的運作方式。

![\[在開始後向傳遞之前，對每個微批次執行前向傳遞的管道範例。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/distributed/model-parallel/simple-pipeline-execution.png)


### 在特定架構執行管道傳輸
<a name="model-parallel-pipeline-frameworks"></a>

請參閱下列各區段，了解 SageMaker 模型平行化程式庫針對TensorFlow 與 PyTorch 所做的特定架構管道排程決定。

#### 使用 TensorFlow 執行管道
<a name="model-parallel-pipeline-execution-interleaved-tf"></a>

下列映像範例說明採用自動化模型分割利用模型平行化程式庫分割TensorFlow 圖表。當分割圖表時，每個生成的子圖表會複寫 B 倍 (變數除外)，其中 B 是微批次數量。在此圖，每個子圖表均複寫 2 次 (B=2)。在子圖表的每個輸入處插入 `SMPInput` 作業，並在每個輸出處插入 `SMPOutput` 作業。這些作業會與程式庫後端進行通訊，以便彼此傳輸張量。

![\[使用自動模型分割，由模型平行化程式庫分割的 TensorFlow 圖表範例。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/distributed/model-parallel/interleaved-pipeline-tf.png)


下列映像範例說明 2 個子圖表以 B=2 分割並新增漸層作業。`SMPInput` 作業的漸層是 `SMPOutput` 作業，反之亦然。這可讓漸層在反向傳播期間向後流動。

![\[以 B=2 分割的 2 個子圖的範例，並加入梯度操作。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/distributed/model-parallel/interleaved-pipeline-tf.gif)


此 GIF 顯示範例 INTERLEAVED 管道執行排程，其中包含 B=2 微批次與 2 個子圖表。每個裝置都會循序執行其中一個子圖表複本，以便改善 GPU 使用率。隨著 B 變大，閒置時間時段的小部分會變為零。無論何時在特定子圖形複本執行 (向前或向後) 運算時，管道層都會向相應藍色 `SMPInput` 作業發出訊號以開始執行。

一旦運算單一最小批次所有微批次的漸層，程式庫會跨微批次結合漸層，然後可將其套用至參數。

#### 使用 PyTorch 執行管道
<a name="model-parallel-pipeline-execution-interleaved-pt"></a>

就概念而言，管道傳輸在 PyTorch 遵循類似想法。然而，由於 PyTorch 不涉及靜態圖表，因此模型平行化程式庫的 PyTorch 功能使用更加動態的管道傳輸範例。

與 TensorFlow 一樣，每個批次都會分成多個微批次，且每個裝置一次會執行一個微批次。不過，執行排程是透過啟動於每個裝置的執行伺服器來處理。每當目前裝置需要放置在另一裝置的子模組輸出時，執行請求將與子模組的輸入張量一起傳送至遠端裝置的執行伺服器。然後，伺服器使用指定輸入來執行此模組，並將回應傳回目前裝置。

由於目前裝置在遠端子模組執行期間處於閒置狀態，因此目前微批次的本機執行會暫停，且程式庫執行期將切換為執行目前裝置可有效處理的另一微批次。微批次的優先順序由所選擇的管道排程決定。對於 INTERLEAVED 管道排程，處於運算向後階段的微批次會盡可能優先考量。