

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

# SageMaker AI 分散式運算最佳實務
<a name="distributed-training-options"></a>

這個最佳實務頁面介紹機器學習 (ML) 任務的各種分散式運算。本頁面的*分散式運算*一詞包含針對機器學習任務的分散式訓練，以及針對資料處理、資料產生、特徵工程和強化學習的平行運算。本頁面討論分散式運算中常見的挑戰，以及 SageMaker 訓練和 SageMaker 處理可用的選項。如需有關分散式運算的其他閱讀資料，請參閱[分散式運算是什麼？](https://aws.amazon.com/what-is/distributed-computing/)。

您可以將 ML 任務設定為跨多個節點 （執行個體）、加速器 (NVIDIA GPUs、 AWS Trainium 晶片） 和 vCPU 核心以分散式方式執行。透過執行分散式運算，您可以達成各種目標，例如加速運算作業、處理大型資料集或訓練大型機器學習 (ML) 模型。

下列清單涵蓋大規模執行機器學習 (ML) 訓練工作時可能面臨的常見挑戰。
+ 您必須根據機器學習任 (ML) 務、要使用的軟體程式庫以及運算資源，決定如何分散運算。
+ 未必所有機器學習 (ML) 任務都能直接分散。此外，並非所有機器學習 (ML) 程式庫都支援分散式運算。
+ 分散式運算未必會讓運算效率線性增加。特別是，您必須識別資料 I/O 和 GPU 間通訊是否有瓶頸或造成額外負荷。
+ 分散式運算可能會干擾數值程序及改變模型的準確度。特別是對於資料平行神經網路訓練而言，變更全域批次大小，同時縱向擴充至更大的運算叢集時，也必須相應調整學習速率。

SageMaker AI 提供分散式訓練解決方案，緩解各種使用案例的這類難題。請從下列其中一個選項，選擇最適合您的使用案例。

**Topics**
+ [選項 1：使用支援分散式訓練的 SageMaker AI 內建演算法](#distributed-training-options-1)
+ [選項 2：在 SageMaker AI 管理的訓練或處理環境中執行自訂 ML 程式碼](#distributed-training-options-2)
+ [選項 3：撰寫您自己的自訂分散式訓練程式碼](#distributed-training-options-3)
+ [選項 4：平行或循序啟動多個工作](#distributed-training-options-4)

## 選項 1：使用支援分散式訓練的 SageMaker AI 內建演算法
<a name="distributed-training-options-1"></a>

SageMaker AI 提供[內建演算法](https://docs.aws.amazon.com/sagemaker/latest/dg/algos.html)，透過 SageMaker AI 主控台或 SageMaker Python SDK 可開箱即用。使用內建演算法，您不需要花時間進行程式碼自訂、不用了解模型的科學基礎，也不必在佈建的 Amazon EC2 執行個體執行 Docker。

SageMaker AI 內建演算法的子集支援分散式訓練。若要檢查您選擇的演算法是否支援分散式訓練，請見[內建演算法相關一般資訊](https://docs.aws.amazon.com/sagemaker/latest/dg/common-info-all-im-models.html)表格中的**可平行化**欄。部分演算法支援多執行個體分散式訓練，而其餘的可平行化演算法則支援單一執行個體中多個 GPU 的平行化，如同**可平行化**欄所示。

## 選項 2：在 SageMaker AI 管理的訓練或處理環境中執行自訂 ML 程式碼
<a name="distributed-training-options-2"></a>

SageMaker AI 任務可針對特定使用案例和架構將分散式訓練環境具現化。這個環境可當成現成可用的白板，在這裡導入及執行自己的機器學習 (ML) 程式碼。

### 如果您的機器學習 (ML) 程式碼使用深度學習架構
<a name="distributed-training-options-2-1"></a>

您可以使用適用於 SageMaker AI 訓練的 [Deep Learning Containers (DLC)](https://github.com/aws/deep-learning-containers) 啟動分散式訓練任務，然後透過 [SageMaker AI Python SDK](http://sagemaker.readthedocs.io/) 中的專用 Python 模組進行協調，也可以透過 SageMaker API 搭配 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/index.html)、[適用於 Python (Boto3) 的 AWS SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html) 進行協調。SageMaker AI 提供適用於機器學習架構的訓練容器，包括 [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/index.html)、[TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/index.html)、[Hugging Face Transformers](https://sagemaker.readthedocs.io/en/stable/frameworks/huggingface/index.html) 與 [Apache MXNet](https://sagemaker.readthedocs.io/en/stable/frameworks/mxnet/index.html)。您有兩個選項可以為分散式訓練撰寫深度學習程式碼。
+ **SageMaker AI 分散式訓練程式庫**

  SageMaker AI 分散式訓練程式庫提議神經網路資料平行處理和模型平行處理的 AWS受管程式碼。SageMaker AI 分散式訓練也隨附內建於 SageMaker Python SDK 的啟動器用戶端，而且您不需要撰寫平行啟動程式碼。如需進一步了解，請參閱 [SageMaker AI 的資料平行化程式庫](https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel.html)和 [SageMaker AI 的模型平行化程式庫](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel.html)。
+ **開放原始碼的分散式訓練程式庫** 

  開放原始碼架構有自己的分散機制，例如 [PyTorch 中的 DistributedDataParallelism (DDP)](https://pytorch.org/docs/stable/notes/ddp.html) 或 TensorFlow 中的 `tf.distribute` 模組。您可以選擇在 SageMaker AI 管理的架構容器中執行這些分散式訓練架構。例如，[在 SageMaker AI 訓練 MaskRCNN](https://github.com/aws-samples/amazon-sagemaker-cv) 用的範例程式碼，會示範如何同時在 SageMaker AI PyTorch 架構容器中使用 PyTorch DDP，以及在 SageMaker TensorFlow 架構容器中使用 [Horovod](https://horovod.readthedocs.io/en/stable/)。

SageMaker AI ML 容器預先安裝 [MPI](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/mpi_on_sagemaker/intro/mpi_demo.ipynb)，因此您可以使用 [mpi4py](https://mpi4py.readthedocs.io/en/stable/) 平行化進入點指令碼。啟動第三方分散式訓練啟動器，或在 SageMaker AI 管理的訓練環境中撰寫臨機操作平行程式碼時，使用 MPI 整合式訓練容器是個不錯的選擇。

*GPU 上資料平行神經網路訓練注意事項*
+ **可適時擴充至多個 GPU 和多機平行處理**

  我們經常在多個 CPU 或多個 GPU 執行個體上執行神經網路訓練任務。每個 GPU 型執行個體通常都包含多個 GPU 裝置。因此，分散式 GPU 運算可在具有多個 GPU (單一節點多個 GPU 訓練) 的單一 GPU 執行個體進行，或是在每個 (多個節點多個 GPU 訓練) 有多個 GPU 核心執行個體的多個 GPU 執行個體進行。單一執行個體訓練較容易撰寫程式碼和偵錯，而且節點內部 GPU 至 GPU 的輸送量，通常比節點間 GPU 至 GPU 輸送量快。因此，最好先垂直擴充資料平行處理 (使用具有多個 GPU 的一個 GPU 執行個體)，並視需要擴充至多個 GPU 執行個體。這可能不適用於 CPU 預算高的情況 (例如，資料預處理的龐大工作負載)，以及多個 GPU 執行個體的 CPU 與 GPU 比例太低時。無論任何情況，您都必須根據自己的機器學習 (ML) 訓練需求和工作負載，實驗不同的執行個體類型組合。
+ **監控收斂品質**

  訓練具有資料平行處理的神經網路時，增加 GPU 數目，同時保持每個 GPU 的小批次大小不變，會增加小批次隨機梯度下降 (MSGD) 處理程序的全域小批次大小。MSGD 的小批次大小已知會影響下降噪聲和收斂。為了在保持準確度的同時正確擴充，您必須調整其他超參數，例如學習速率 [Goyal 等](https://arxiv.org/abs/1706.02677) (2017)]。
+ **監控 I/O 瓶頸**

  隨著 GPU 數量增加，讀取和寫入儲存裝置的輸送量也應該隨之提高。確保您的資料來源和管道不會成為瓶頸。
+ **視需要修改訓練指令碼**

  針對單 GPU 訓練撰寫的訓練指令碼必須修改，才能用於多個節點多個 GPU 訓練。在多數資料平行處理程式庫中，必須修改指令碼才能執行以下操作。
  + 為每個 GPU 指派批次的訓練資料。
  + 使用可在多個 GPU 處理梯度運算和參數更新的最佳化工具。
  + 將檢查點的責任指派給特定主機和 GPU。

   

### 如果您的機器學習 (ML) 程式碼涉及表格式資料處理
<a name="distributed-training-options-2-2"></a>

PySpark 是 Apache Spark 的 Python 前端 (Apache Spark 屬於開放原始碼分散式運算架構)。PySpark 已被廣泛應用於大規模生產工作負載的分散式表格式資料處理。如果想執行表格式資料處理程式碼，請考慮使用 [SageMaker Processing PySpark 容器](https://docs.aws.amazon.com/sagemaker/latest/dg/use-spark-processing-container.html)並執行平行工作。您也可以在 Amazon SageMaker Studio Classic (整合於 [Amazon EMR](https://aws.amazon.com/blogs/machine-learning/part-1-create-and-manage-amazon-emr-clusters-from-sagemaker-studio-to-run-interactive-spark-and-ml-workloads/) 和 [AWS Glue](https://aws.amazon.com/about-aws/whats-new/2022/09/sagemaker-studio-supports-glue-interactive-sessions/?nc1=h_ls)) 中使用 SageMaker Training 和 SageMaker Processing API，平行執行資料處理任務。

## 選項 3：撰寫您自己的自訂分散式訓練程式碼
<a name="distributed-training-options-3"></a>

向 SageMaker AI 提交訓練或處理工作時，SageMaker Training 和 SageMaker AI Processing API 會啟動 Amazon EC2 運算執行個體。您可以透過執行您自己的 Docker 容器或在 AWS 受管容器中安裝其他程式庫，在執行個體中自訂訓練和處理環境。如需 Docker 搭配 SageMaker Training 使用的更多相關資訊，請參閱[調整自有的 Docker 容器以搭配 SageMaker AI 使用](https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers-adapt-your-own.html)，以及[使用自有的演算法和模型建立容器](https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers-create.html)。如需 Docker 搭配 SageMaker AI Processing 使用的更多相關資訊，請參閱[使用自有的處理程式碼](https://docs.aws.amazon.com/sagemaker/latest/dg/use-your-own-processing-code.html)。

每個 SageMaker 訓練任務環境在 `/opt/ml/input/config/resourceconfig.json` 都包含一個組態檔案，且每個 SageMaker 處理任務環境在 `/opt/ml/config/resourceconfig.json` 都包含類似的組態檔案。您的程式碼可讀取此檔案，尋找 `hostnames` 並建立節點間通訊。若要進一步了解 (包括 JSON 檔案的結構描述)，請參閱[分散式訓練組態](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo-running-container.html#your-algorithms-training-algo-running-container-dist-training)和 [Amazon SageMaker Processing 如何設定處理容器](https://docs.aws.amazon.com/sagemaker/latest/dg/build-your-own-processing-container.html#byoc-config)。您也可以在 SageMaker AI 中安裝和使用第三方的分散式運算程式庫，例如 [Ray](https://github.com/aws-samples/aws-samples-for-ray/tree/main/sagemaker) 或 DeepSpeed。

您也可以使用 SageMaker Training 和 SageMaker Processing，執行不需要工作者間通訊的自訂分散式運算。在運算用語中，這些任務通常被描述為*尷尬平行*或*無共享*。範例包括資料檔案的平行處理、在不同組態平行計算的訓練模型，或在記錄集合執行批次推論。您可以使用 Amazon SageMaker AI 輕鬆平行處理這類無共享使用案例。在具有多個節點的叢集啟動 SageMaker Training 或 SageMaker Processing 任務時，SageMaker AI 預設會在所有節點複寫並啟動您的訓練程式碼 (使用 Python 或 Docker)。在 SageMaker AI `TrainingInput` API 的資料輸入組態設定 `S3DataDistributionType=ShardedByS3Key`，可以加速完成需要在這類多個節點隨機分散輸入資料的任務。

## 選項 4：平行或循序啟動多個工作
<a name="distributed-training-options-4"></a>

您也可以將機器學習 (ML) 運算工作流程分配到較小的平行或循序運算任務，每個任務都由其自己的 SageMaker Training 或 SageMaker Processing 工作表示。對於以下情況或任務，將任務拆分為多個工作可能有所助益：
+ 每個子任務都有特定的[資料通道](https://docs.aws.amazon.com/sagemaker/latest/dg/model-train-storage.html)和中繼資料項目 (例如超參數、模型組態或執行個體類型) 時。
+ 在子任務等級實作重試步驟時。
+ 在工作負載過程改變子任務的組態時，例如進行增加批次大小訓練時。
+ 需要執行比單一訓練工作所允許之訓練時間上限 (最多 28 天) 更長的機器學習 (ML) 任務時。
+ 運算工作流程的不同步驟需要不同的執行個體類型時。

對於超參數搜尋的特定情況，請使用 [SageMaker AI Automated Model Tuning](https://docs.aws.amazon.com/sagemaker/latest/dg/automatic-model-tuning.html)。SageMaker AI Automated Model Tuning 是無伺服器參數搜尋協調器，可根據隨機、Bayesian 或 HyperBand 的搜尋邏輯，代表您啟動多個訓練任務。

此外，若要協調多個訓練任務，您也可以考慮工作流程協同運作工具，例如 [SageMaker AI 管道](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-pipelines/index.html)、[AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/connect-sagemaker.html)、[Amazon Managed Workflows for Apache Airflow (MWAA)](https://aws.amazon.com/managed-workflows-for-apache-airflow/) 支援的 Apache Airflow 與 [SageMaker AI Workflows](https://sagemaker.readthedocs.io/en/stable/workflows/airflow/using_workflow.html)。