

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

# Amazon SageMaker AI 分散式訓練
<a name="distributed-training"></a>

SageMaker AI 提供分散式訓練資料庫，並支援用於深度學習任務的各種分散式訓練選項，例如電腦視覺 (CV) 與自然語言處理 (NLP)。使用 SageMaker AI 的分散式訓練程式庫，您可執行可擴展且符合成本效益的自訂資料平行和模型平行深度學習訓練任務。您也可以使用其他分散式訓練架構及套件，例如 PyTorch DistributedDataParallel (DDP)、`torchrun`、MPI (`mpirun`) 以及參數伺服器。下一節提供基本分散式訓練概念的相關資訊。在整份文件中，指示及範例重點介紹如何使用 SageMaker Python SDK 設定深度學習任務的分散式訓練選項。

**提示**  
若要了解機器學習 (ML) 訓練及處理任務的分散式運算的最佳實務，請參閱[SageMaker AI 分散式運算最佳實務](distributed-training-options.md)。

## 分散式訓練概念
<a name="distributed-training-basic-concepts"></a>

 SageMaker AI 的分散式訓練資料庫使用下列分散式訓練術語與功能。

**資料集和批次**
+ **訓練資料集**：用於訓練模型的所有資料。
+ **全域批次大小**：在每次反覆運算，從訓練資料集中選取要傳送至叢集 GPU 的記錄數。這是在每次反覆運算時計算梯度的記錄數。如果使用資料平行處理，則等於模型副本總數乘以每個副本批次大小:`global batch size = (the number of model replicas) * (per-replica batch size)`。在機器學習文獻，全域批次大小的單一批次通常被稱為*小批次*。
+ **每個副本批次大小：**使用資料平行處理時，這是傳送至每個模型副本的記錄數。每個模型副本都會對此批次執行向前和向後傳遞，以計算權重更新。在處理下一組每個副本批次之前，產生的權重更新會在所有副本之間同步 (平均)。
+ **微型批次**：小批次的子集，或者，如果使用混合模型和資料平行處理，則它是每個副本大小批次的子集。當您使用 SageMaker AI 的分散式模型平行化程式庫時，每個微型批次都會逐一送入訓練管道，並遵循程式庫執行時期所定義的[執行排程](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-core-features.html#model-parallel-pipeline-execution)。

**訓練**
+ **Epoch**：整個資料集的一個訓練週期。每個時期有多個反覆運算這很常見。您在訓練中使用的 Epoch 數量對於您的模型及案例來說是唯一的。
+ **反覆運算**：使用全域批次大小批次 (小批次) 訓練資料執行的單一向前和向後傳遞。訓練期間執行的反覆運算次數取決於全域批次大小和用於訓練的 Epoch 數量。例如，如果資料集包含 5,000 個範例，而您使用的全域批次大小為 500，則需要 10 次反覆運算才能完成單一 Epoch。
+ **學習速率**：影響權重根據模型計算誤差而變化的量的變數。學習速率對於模型的收斂能力以及收斂的速度及最佳化方面起著重要作用。

**執行個體和 GPU**
+ **執行個體**： AWS [Anmachine Learning 運算執行個體](https://aws.amazon.com/sagemaker/pricing/)。這些也稱為*節點*。
+ **叢集大小**：使用 SageMaker AI 的分散式訓練程式庫時，這是執行個體數目乘以每個執行個體的 GPU 數目。例如，如果您在訓練工作使用兩個 ml.p3.8xlarge 執行個體，每個執行個體都有 4 個 GPU，則叢集大小為 8。雖然增加叢集大小可以縮短訓練時間，但必須最佳化執行個體之間的通訊；否則，節點之間的通訊可能會增加額外負荷，並導致訓練時間變慢。SageMaker AI 分散式訓練程式庫旨在最佳化 Amazon EC2 ML 運算執行個體之間的通訊，進而提高裝置使用率並縮短訓練時間。

**分散式訓練方案**
+ **資料平行處理**：分散式訓練的一種策略，其中訓練資料集會分割到運算叢集的多個 GPU，該叢集由多個 Amazon EC2 ML 執行個體組成。每個 GPU 都包含模型的*副本*，接收不同批次的訓練資料，執行向前和向後傳遞，並與其他節點共用權重更新以進行同步處理，然後再進行下一個批次，最後再進行另一個 Epoch。
+ **模型平行處理**：分散式訓練的一種策略，其中模型跨運算叢集的多個 GPU 進行分割，該運算叢集由多個 Amazon EC2 機器學習 (ML) 執行個體組成。該模型可能很複雜，並且具有大量隱藏的層與權重，因此無法容納單一執行個體的記憶體。每個 GPU 都承載模型的子集，透過該子集共用及編譯資料流和轉換。就 GPU 使用率與訓練時間而言，模型平行處理的效率在很大程度取決於模型的分割方式，以及用來執行向前和向後傳遞的執行排程。
+ **管道執行排程** (**管道**)：管道執行排程決定進行計算 (微型批次) 的順序，以及在模型訓練期間跨裝置處理資料的順序。管線是一種技術，可讓 GPU 在不同的資料範本同時運算，在模型平行處理中達到真正的平行化，並克服循序運算造成的效能損失。如需進一步了解，請參閱[管道執行排程](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-core-features.html#model-parallel-pipeline-execution)。

### 進階概念
<a name="distributed-training-advanced-concepts"></a>

在訓練模型時，機器學習 (ML) 從業人員通常會面臨兩個擴展挑戰：*擴展模型大小*和*擴展訓練資料*。雖然模型大小與複雜性可以提高準確性，但單一 CPU 或 GPU 可以容納的模型大小有限。此外，擴展模型大小可能會導致更多的計算和更長的訓練時間。

並非所有模型都能夠很好處理訓練資料擴展，因為它們需要*在記憶體中*擷取所有訓練資料以進行訓練。它們只能垂直縮放，並擴展到越來越大的執行個體類型。在大多數情況下，擴展訓練資料會導致更長的訓練時間。

深度學習 (DL) 是一個特定的機器學習 (ML) 演算法系列，由多層人工神經網路組成。最常見的訓練方法是使用小批次隨機梯度下降 (SGD)。在小批次 SGD，模型是透過在減少誤差的方向對其係數進行少量反覆運算變更來進行訓練。這些反覆運算是在訓練資料集的相同大小的子範本 (稱為*小批次*) 所進行。對於每個小批次，該模型在小批次的每個記錄中執行，測量其誤差並估計誤差的梯度。然後在小批次的所有記錄中測量平均梯度，並為每個模型係數提供更新方向。訓練資料集的一個完整傳遞稱為 *Epoch*。模型訓練通常包含數十到數百個 Epoch。小批次 SGD 有幾個好處：首先，它的反覆運算設計使訓練時間理論上與資料集大小呈線性關係。其次，在指定的小批次，每個記錄都由模型單獨處理，除了最終的梯度平均值之外，不需要記錄間通訊。因此，小批次的處理特別適合於平行化和分散式。  

將小批次的記錄分散到不同的運算裝置，將 SGD 訓練平行化，稱為*資料平行分散式訓練*，也是最常用的 DL 分散式範例。資料平行訓練是一種相關的分散式策略，可以擴展小批次大小並更快處理每個小批次。但是，資料平行訓練帶來了額外的複雜性：必須使用來自所有工作人員的梯度來計算小批次梯度平均值並將其傳達給所有工作者，這一步驟稱為 *allreduce*，該步驟可以代表不斷增長的額外負荷，因為訓練叢集被擴展，如果實施不當或實施不當的硬體減法，也會大大減少訓練時間。  

資料平行 SGD 仍需要開發人員至少能夠在運算裝置 (例如單一 CPU 或 GPU) 容納模型和單一記錄。當訓練非常大的模型時，例如自然語言處理 (NLP) 中的大型轉換器，或在高解析度影像分割模型時，在某些情況下這可能不可行。分解工作負載的另一種方法是在多個運算裝置對模型進行分割，這種方法稱為*模型平行分散式訓練*。