SageMaker AI 分散式運算最佳實務 - Amazon SageMaker AI

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

SageMaker AI 分散式運算最佳實務

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

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

下列清單涵蓋大規模執行機器學習 (ML) 訓練工作時可能面臨的常見挑戰。

  • 您必須根據機器學習任 (ML) 務、要使用的軟體程式庫以及運算資源,決定如何分散運算。

  • 未必所有機器學習 (ML) 任務都能直接分散。此外,並非所有機器學習 (ML) 程式庫都支援分散式運算。

  • 分散式運算未必會讓運算效率線性增加。特別是,您必須識別資料 I/O 和 GPU 間通訊是否有瓶頸或造成額外負荷。

  • 分散式運算可能會干擾數值程序及改變模型的準確度。特別是對於資料平行神經網路訓練而言,變更全域批次大小,同時縱向擴充至更大的運算叢集時,也必須相應調整學習速率。

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

選項 1:使用支援分散式訓練的 SageMaker AI 內建演算法

SageMaker AI 提供內建演算法,透過 SageMaker AI 主控台或 SageMaker Python SDK 可開箱即用。使用內建演算法,您不需要花時間進行程式碼自訂、不用了解模型的科學基礎,也不必在佈建的 Amazon EC2 執行個體執行 Docker。

SageMaker AI 內建演算法的子集支援分散式訓練。若要檢查您選擇的演算法是否支援分散式訓練,請見內建演算法相關一般資訊表格中的可平行化欄。部分演算法支援多執行個體分散式訓練,而其餘的可平行化演算法則支援單一執行個體中多個 GPU 的平行化,如同可平行化欄所示。

選項 2:在 SageMaker AI 管理的訓練或處理環境中執行自訂 ML 程式碼

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

如果您的機器學習 (ML) 程式碼使用深度學習架構

您可以使用適用於 SageMaker AI 訓練的 Deep Learning Containers (DLC) 啟動分散式訓練任務,然後透過 SageMaker AI Python SDK 中的專用 Python 模組進行協調,也可以透過 SageMaker API 搭配 AWS CLI適用於 Python (Boto3) 的 AWS SDK 進行協調。SageMaker AI 提供適用於機器學習架構的訓練容器,包括 PyTorchTensorFlowHugging Face TransformersApache MXNet。您有兩個選項可以為分散式訓練撰寫深度學習程式碼。

  • SageMaker AI 分散式訓練程式庫

    SageMaker AI 分散式訓練程式庫提出了用於神經網路資料平行化和模型平行化的 AWS 管理程式碼。SageMaker AI 分散式訓練也隨附內建於 SageMaker Python SDK 的啟動器用戶端,而且您不需要撰寫平行啟動程式碼。如需進一步了解,請參閱 SageMaker AI 的資料平行化程式庫SageMaker AI 的模型平行化程式庫

  • 開放原始碼的分散式訓練程式庫

    開放原始碼架構有自己的分散機制,例如 PyTorch 中的 DistributedDataParallelism (DDP) 或 TensorFlow 中的 tf.distribute 模組。您可以選擇在 SageMaker AI 管理的架構容器中執行這些分散式訓練架構。例如,在 SageMaker AI 訓練 MaskRCNN 用的範例程式碼,會示範如何同時在 SageMaker AI PyTorch 架構容器中使用 PyTorch DDP,以及在 SageMaker TensorFlow 架構容器中使用 Horovod

SageMaker AI ML 容器預先安裝 MPI,因此您可以使用 mpi4py 平行化進入點指令碼。啟動第三方分散式訓練啟動器,或在 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 等 (2017)]。

  • 監控 I/O 瓶頸

    隨著 GPU 數量增加,讀取和寫入儲存裝置的輸送量也應該隨之提高。確保您的資料來源和管道不會成為瓶頸。

  • 視需要修改訓練指令碼

    針對單 GPU 訓練撰寫的訓練指令碼必須修改,才能用於多個節點多個 GPU 訓練。在多數資料平行處理程式庫中,必須修改指令碼才能執行以下操作。

    • 為每個 GPU 指派批次的訓練資料。

    • 使用可在多個 GPU 處理梯度運算和參數更新的最佳化工具。

    • 將檢查點的責任指派給特定主機和 GPU。

如果您的機器學習 (ML) 程式碼涉及表格式資料處理

PySpark 是 Apache Spark 的 Python 前端 (Apache Spark 屬於開放原始碼分散式運算架構)。PySpark 已被廣泛應用於大規模生產工作負載的分散式表格式資料處理。如果想執行表格式資料處理程式碼,請考慮使用 SageMaker Processing PySpark 容器並執行平行工作。您也可以在 Amazon SageMaker Studio Classic (整合於 Amazon EMRAWS Glue) 中使用 SageMaker Training 和 SageMaker Processing API,平行執行資料處理任務。

選項 3:撰寫您自己的自訂分散式訓練程式碼

向 SageMaker AI 提交訓練或處理工作時,SageMaker Training 和 SageMaker AI Processing API 會啟動 Amazon EC2 運算執行個體。您可以在 AWS 管理的容器執行自己的 Docker 容器或安裝其他程式庫,在執行個體中自訂訓練和處理環境。如需 Docker 搭配 SageMaker Training 使用的更多相關資訊,請參閱調整自有的 Docker 容器以搭配 SageMaker AI 使用,以及使用自有的演算法和模型建立容器。如需 Docker 搭配 SageMaker AI Processing 使用的更多相關資訊,請參閱使用自有的處理程式碼

每個 SageMaker 訓練任務環境在 /opt/ml/input/config/resourceconfig.json 都包含一個組態檔案,且每個 SageMaker 處理任務環境在 /opt/ml/config/resourceconfig.json 都包含類似的組態檔案。您的程式碼可讀取此檔案,尋找 hostnames 並建立節點間通訊。若要進一步了解 (包括 JSON 檔案的結構描述),請參閱分散式訓練組態Amazon SageMaker Processing 如何設定處理容器。您也可以在 SageMaker AI 中安裝和使用第三方的分散式運算程式庫,例如 Ray 或 DeepSpeed。

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

選項 4:平行或循序啟動多個工作

您也可以將機器學習 (ML) 運算工作流程分配到較小的平行或循序運算任務,每個任務都由其自己的 SageMaker Training 或 SageMaker Processing 工作表示。對於以下情況或任務,將任務拆分為多個工作可能有所助益:

  • 每個子任務都有特定的資料通道和中繼資料項目 (例如超參數、模型組態或執行個體類型) 時。

  • 在子任務等級實作重試步驟時。

  • 在工作負載過程改變子任務的組態時,例如進行增加批次大小訓練時。

  • 需要執行比單一訓練工作所允許之訓練時間上限 (最多 28 天) 更長的機器學習 (ML) 任務時。

  • 運算工作流程的不同步驟需要不同的執行個體類型時。

對於超參數搜尋的特定情況,請使用 SageMaker AI Automated Model Tuning。SageMaker AI Automated Model Tuning 是無伺服器參數搜尋協調器,可根據隨機、Bayesian 或 HyperBand 的搜尋邏輯,代表您啟動多個訓練任務。

此外,若要協調多個訓練任務,您也可以考慮工作流程協同運作工具,例如 SageMaker AI 管道AWS Step FunctionsAmazon Managed Workflows for Apache Airflow (MWAA) 支援的 Apache Airflow 與 SageMaker AI Workflows