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

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

SageMaker 最佳實務的分散式運算

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

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

下列清單涵蓋大規模執行 ML 訓練任務時可能面臨的常見挑戰。

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

  • 未必所有 ML 任務都能直接發佈。此外,並非所有 ML 程式庫都支援分散式運算。

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

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

SageMaker 提供分散式訓練解決方案,以減輕各種使用案例的挑戰。請從下列其中一個選項,選擇最適合您的使用案例:

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

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

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

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

SageMaker 工作可以針對特定用例和框架實例化分佈式培訓環境。此環境充當 ready-to-use 白板,您可以在其中攜帶和運行自己的 ML 代碼。

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

您可以使用適用於訓練的 Deep Learning Containers (DLC) 啟動分散式 SageMaker 訓練任務,您可以透過 Python SDK 中的專用 SageMaker Python 模組或透過 SageMaker API 來協調。AWS CLIAWS SDK for Python (Boto3) SageMaker 提供適用於機器學習架構的訓練容器 PyTorchTensorFlow,包括「Hugging Face 部變形金剛」和 Apache MX Net。您有兩個選項可以為分散式訓練撰寫深度學習程式碼。

  • SageMaker 分散式訓練資料庫

    SageMaker 分散式訓練程式庫針對神經網路資料平行處 AWS理和模型平行處理原則提出託管程式碼。 SageMaker 分散式訓練也隨附 SageMaker Python SDK 內建的啟動器用戶端,而且您不需要撰寫 parallel 啟動程式碼。若要深入了解,請參閱SageMaker的資料平行程度程式庫SageMaker模型平行程式庫。

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

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

SageMaker ML 容器還預先安裝了 MPI,因此您可以使用 mpi4py 並行化您的入口點腳本。當您啟動第三方分散式訓練啟動器或在 SageMaker 受管理的訓練環境中撰寫臨機操作 parallel 程式碼時,使用 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 的星火,這是一個開源的分佈式計算框架的 Python 前端。 PySpark 已廣泛應用於大規模生產工作負載的分散式表格資料處理。如果您想要執行表格式資料處理程式碼,請考慮使用SageMaker 處理 PySpark 容器並執行 parallel 工作。您也可以使用 Amazon 工作 SageMaker 室經典版中的 SageMaker 培訓和 SageMaker 處理 API,parallel 執行資料處理任務,該 API 與 Amazon EMRAWS Glue.

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

當您向提交培訓或處理任務時 SageMaker, SageMaker 訓練和 SageMaker處理 API 會啟動 Amazon EC2 運算執行個體。您可以執行自己的 Docker 容器或在 AWS 受管理容器中安裝其他程式庫,在執行個體中自訂訓練和處理環境。有關 Docker 與 SageMaker 訓練的詳情,請參閱調整您自己的 Docker 容器以使用 SageMaker和使用您自己的演算法和模型建立容器。如需有關 Docker 與 SageMaker處理的詳細資訊,請參閱使用您自己的處理程式碼

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

您也可以使用「 SageMaker 訓練與 SageMaker 處理」來執行不需要工作者間通訊的自訂分散式計算。在運算文獻中,這些任務通常被描述為極度並行無共享。範例包括資料檔案的平行處理、在不同組態平行訓練模型,或在記錄集合執行批次推論。您可以使用 Amazon 輕鬆並行處理此類無共享用案例。 SageMaker當您在具有多個節點的叢集上啟動「 SageMaker 訓練」或「 SageMaker 處理」工作時, SageMaker 依預設會在所有節點上複寫並啟動訓練程式碼 (使用 Python 或 Docker)。透過S3DataDistributionType=ShardedByS3Key在 SageMaker TrainingInput API 的資料輸入設定中設定,可以透過設定來進行需要隨機散佈輸入資料到這類多個節點的工作。

選項 4:平行或依序啟動多個任務

您也可以將機器學習計算工作流程散佈至較小的 parallel 或循序運算工作,每個工作都由自己的 SageMaker 訓練或 SageMaker 處理工作表示。對於以下情況或任務,將任務拆分為多個任務可能有所助益:

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

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

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

  • 需要執行比單一訓練任務所允許之訓練時間上限 (最多 28 天) 的 ML 任務時。

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

對於超參數搜尋的特定情況,請使用「SageMaker 自動模型調整」。 SageMaker 自動化模型調整是一種無伺服器參數搜尋協調器,根據可以是隨機、貝葉斯或的搜尋邏輯,代表您啟動多個訓練工作。 HyperBand

此外,若要協調多個訓練任務,您也可以考慮使用 Amazon Apache Airflow (MWAA) 和工作流程所支援的工作流程協調工具,例如SageMaker 管道、AWS Step Functions 和 Apache 氣流。SageMaker