

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

# 分散式訓練的策略
<a name="distributed-training-strategies"></a>

分散式訓練通常分為兩種方法：資料平行與模型平行。*資料平行*是分散式訓練最常見的方法：您擁有大量資料，將其進行批次處理，然後將資料區塊傳送至多個 CPU 或 GPU (節點)，以供神經網路或機器學習 (ML) 演算法處理，然後合併結果。每個節點上的神經網路都相同。*模型平行*方法用於無法整體裝入節點記憶體的大型模型；它分解模型並將不同的部分放置在不同的節點。在這種情況下，您需要將批次的資料傳送到每個節點，以便在模型的所有部分處理資料。

術語*網路*和*模型*通常可以互換使用：大型模型實際上是具有許多層及參數的大型網路。使用大型網路進行訓練會產生一個大型模型，然後使用所有預先訓練的參數及其權重將模型載入到記憶體中。當您分解模型以將其拆分到節點時，您也會分解基礎網路。網路由層組成，若要分割網路，您可以將層放在不同的運算裝置。

在不同裝置間天真地分割層的常見陷阱，會造成 GPU 使用率不足嚴重。在向前和向後傳遞中，訓練本質上是連續的，並且在指定的時間，只有一個 GPU 可以主動計算，而其他 GPU 則等待發送啟動。現代模型平行程式庫透過使用管道執行計劃來提高裝置使用率來解決此問題。不過，只有 Amazon SageMaker AI 的分散式模型平行化程式庫包含自動模型分割。程式庫的兩個核心特徵，即自動模型分割及管道執行排程，可透過自動化決策來簡化實作模型平行處理的程序，進而提高裝置使用效率。

## 透過資料平行與模型平行進行訓練
<a name="distributed-training-data-model-parallel"></a>

如果您正在使用大型資料集進行訓練，請從資料平行方法開始。如果在訓練期間記憶體不足，您可能需要切換到模型平行方法，或嘗試混合模型和資料平行處理。您也可以嘗試以下方法來改善資料平行的效能：
+ 變更模型的超參數。
+ 減少批次大小。
+ 繼續減小批次大小，直到合適為止。如果您將批次大小減少到 1，但仍然耗盡記憶體，那麼您應該嘗試模型平行訓練。

嘗試梯度壓縮 (FP16、INT8)：
+ 在配備 NVIDIA TensorCool 的硬體，使用[混合精準度訓練](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html)可以提高速度並減少記憶體消耗。
+ SageMaker AI 的分散式資料平行化程式庫支援開箱即用的自動混合精確度 (AMP)。除了對訓練指令碼進行架構層級修改之外，無需執行任何額外操作即可啟用 AMP。如果梯度是 FP16，SageMaker AI 資料平行化程式庫會以 FP16 執行其 `AllReduce` 操作。有關將 AMP API 實施到訓練指令碼的詳細資訊，請參閱以下資源：
  + [架構–](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#pytorch)*NVIDIA Deep Learning Performance 文件的 PyTorch*
  + [架構–](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow)*NVIDIA Deep Learning Performance 文件的 TensorFlow*
  + *NVIDIA 開發人員文件*中的 [Automatic Mixed Precision for Deep Learning](https://developer.nvidia.com/automatic-mixed-precision)
  + [在 *PyTorch 部落格*介紹原生 PyTorch 自動混合精度，以加快 NVIDIA GPU 的訓練速度](https://pytorch.org/blog/accelerating-training-on-nvidia-gpus-with-pytorch-automatic-mixed-precision/)
  + *TensorFlow 文件*中的 [TensorFlow 混合精度 API](https://www.tensorflow.org/guide/mixed_precision)

嘗試減小輸入大小：
+ 如果您增加序列連結、需要向下調整批次大小或向上調整 GPU 以分散批次，請減少 NLP 序列長度。
+ 降低影像解析度。

檢查是否使用批次標準化，因為這可能會影響收斂。當您使用分散式訓練時，您的批次會跨 GPU 分割，而較低批次大小的影響可能會產生較高的錯誤率，進而中斷模型收斂。例如，如果您在批次大小為 64 的單一 GPU 對網路進行原型設計，然後縱向擴展為使用四個 p3dn.24xlarge，則您現在擁有 32 個 GPU，並且每個 GPU 批次大小會從 64 降至 2。這可能會破壞您在單一節點看到的收斂。

在下列情況下，從模型平行訓練開始：
+  您的模型不適用於單一裝置。
+ 由於模型大小的原因，您在選擇較大的批次大小時面臨限制，例如，如果您的模型權重佔用了大部分 GPU 記憶體，並且您被迫選擇較小且不理想的批次大小。  

進一步了解 SageMaker AI 分散式程式庫的詳細資訊，請參閱以下內容：
+  [使用 SageMaker AI 分散式資料平行化程式庫執行分散式訓練](data-parallel.md) 
+  [(存檔) SageMaker 模型平行化程式庫 v1.x](model-parallel.md) 