SageMaker 訓練編譯器疑難 - Amazon SageMaker

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

SageMaker 訓練編譯器疑難

重要

Amazon Web Services(AWS)宣布將不會有新版本或 SageMaker 培訓編譯器版本。您可以透過現有的 AWS Deep Learning Containers (DLCs) 繼續使用 SageMaker 訓練編譯器進行 SageMaker 訓練。請務必注意,儘管現有的DLCs保持可存取,但根據 AWS Deep Learning Containers 架構 Support 政策 AWS,它們將不再從中接收修補程式或更新。

如果遇到錯誤,您可以透過下列清單嘗試疑難排解訓練工作。如果您需要進一步的 Support,請透過 Amazon 的AWS 支援或AWS 開發人員論壇與 SageMaker 團隊聯絡 SageMaker。

相較於原生架構訓練工作,訓練工作未如預期般收斂

融合問題的範圍從「 SageMaker 訓練編譯器開啟時模型未學習」到「模型正在學習,但速度比原生架構慢」。在本故障排除指南中,我們假設您的收斂性沒有 SageMaker 培訓編譯器(在本機框架中),並將其視為基準。

面對此類融合問題時,第一步是確定問題是否僅限於分散式訓練,還是源於單一GPU訓練。使用訓練編譯器的分散式 SageMaker 訓練是單一GPU訓練的延伸,其中包含額外的步驟。

  1. 設定具有多個執行個體或的叢集GPUs。

  2. 分配輸入資料至所有工作者。

  3. 同步處理來自所有工作者的模型更新。

因此,單一GPU訓練中的任何融合問題都會傳播到包含多個工作人員的分散式訓練中。

使 SageMaker 用訓練編譯器時,疑難排解訓練工作中收斂問題的流程圖。

單一GPU訓練中發生的收斂問題

如果您的收斂問題源於單一GPU訓練,這可能是因為超參數或設定不正確。torch_xla APIs

檢查超參數

使用 SageMaker 訓練編譯器進行訓練會導致模型的記憶體佔用量發生變化。編譯器會以智慧方式在重複使用及重新計算之間進行仲裁,因而增加或減少相應記憶體消耗量。若要利用此功能,將訓練工作移轉至訓練編譯器時,必須重新調整批次大小和相關聯的超參數。 SageMaker 然而,不正確的超參數設定常會導致訓練損失振盪,且可能因而減慢收斂速度。在極少數情況,積極超參數可能導致模型無法學習 (訓練損失指標未減少或傳回 NaN)。若要確定收斂問題是否是由於超參數造成的,請在使用和不使用訓練編譯器的情況下 side-by-side 測試兩個 SageMaker 訓練工作,同時保持所有超參數相同。

檢查是否torch_xlaAPIs正確設置了單次GPU培訓

如果基準線超參數仍然存在收斂問題,則需要檢查是否有任何不正確的使用 torch_xlaAPIs,特別是用於更新模型的使用。基本上,torch_xla 會繼續以圖形的形式累積指令 (延遲執行),直到明確指示執行累積圖形為止。torch_xla.core.xla_model.mark_step() 函式可協助執行累積圖形。在每個模型更新之後,以及在列印及記錄任何變數之前,應採用此函式來同步執行圖形。如缺少同步處理步驟,則模型可能在列印、記錄及後續向前傳遞期間採用記憶體的過時值,而非採用最新值 (應於每次重複及模型更新之後進行同步)。

使用帶有漸變縮放(可能來自使用AMP)或漸變剪裁技術的 SageMaker 培訓編譯器時,它可能會更複雜。梯度計算的適當順AMP序如下。

  1. 具縮放功能的梯度運算

  2. 梯度不縮放,梯度剪輯,然後縮放

  3. 模式更新

  4. 利用 mark_step() 同步執行圖形

若要尋找清單中提到之作業的權限APIs,請參閱將訓練指令碼移轉至 SageMaker 訓練編譯器的指南。

考慮使用自動模型調校

如果在使用「 SageMaker 訓練編譯器」時重新調整批次大小和相關聯的超參數 (例如學習速率) 時出現收斂問題,請考慮使用「自動模型微調」來調整超參數。您可以參考使用 SageMaker 訓練編譯器調整超參數的範例筆記本

在分散式訓練時發生的收斂問題

如果您的收斂問題仍然存在於分散式訓練中,這可能是由於權重初始化或重量初始化的設定不當所致torch_xlaAPIs。

檢查工作者的權重初始化

如在執行具多位工作者的分散式訓練工作時出現收斂問題,請在適當情況設定常數種子,以便確保所有工作者採取一致確定性行為。請注意權重初始化等技術,因其涉及隨機性。若無常數種子,每位工作者最終可能訓練出不同模型。

檢查是否torch_xlaAPIs已正確設置分散式訓練

如果問題仍然存在,這可能是因為不當使用分散式訓練所torch_xlaAPIs致。請務必在估算器中新增下列項目,以便使用訓練編譯器設定叢集以進行分散式 SageMaker 訓練。

distribution={'torchxla': {'enabled': True}}

這應伴隨訓練指令碼的函式 _mp_fn(index),每位工作者都會調用一次。如無 mp_fn(index) 函式,可能導致每位工作者各自獨立訓練模型,而未共用模型更新。

接下來,請確定您使用與分散式資料取樣器一torch_xla.distributed.parallel_loader.MpDeviceLoaderAPI起使用,如下列範例所示的文件中有關將訓練指令碼移轉至 SageMaker 訓練編譯器的指引。

torch.utils.data.distributed.DistributedSampler()

這可確保輸入資料正確分配至所有工作者。

最後,若要同步處理來自所有工作者的模型更新,請利用 torch_xla.core.xla_model._fetch_gradients 來收集所有工作者的梯度,並利用 torch_xla.core.xla_model.all_reduce 來整合所有收集的梯度為單一更新。

使用帶有漸變縮放(可能來自使用AMP)或漸變剪裁技術的 SageMaker 培訓編譯器時,它可能會更複雜。梯度計算的適當順AMP序如下。

  1. 具縮放功能的梯度運算

  2. 跨所有工作者進行梯度同步處理

  3. 梯度不縮放,梯度剪輯,然後梯度縮放

  4. 模式更新

  5. 利用 mark_step() 同步執行圖形

請注意,與單一GPU訓練的檢查清單相比,此檢查清單還有一個用於同步處理所有工作者的額外項目。

由於缺少/配XLA置而導致培訓工作 PyTorch失敗

如果訓練工作失敗並顯示Missing XLA configuration錯誤訊息,可能是因為您使用的GPUs每個執行個體數目設定錯誤。

XLA需要額外的環境變數來編譯訓練工作。最常見的遺失環境變數是 GPU_NUM_DEVICES。若要讓編譯器正常運作,您必須將此環境變數設定為等於GPUs每個執行個體的數目。

有三種方法可設定 GPU_NUM_DEVICES 環境變數:

  • 方法 1 — 使用 SageMaker 估算器類的environment參數。例如,如果您使用具有四個的ml.p3.8xlarge執行個體GPUs,請執行下列動作:

    # Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... instance_type="ml.p3.8xlarge", hyperparameters={...}, environment={ ... "GPU_NUM_DEVICES": "4" # corresponds to number of GPUs on the specified instance }, )
  • 方法 2 — 使用 SageMaker 估算器類的hyperparameters引數,並在訓練腳本中對其進行解析。

    1. 若要指定的數目GPUs,請將索引鍵值配對新增至hyperparameters引數。

      例如,如果您使用具有四個的ml.p3.8xlarge執行個體GPUs,請執行下列動作:

      # Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... entry_point = "train.py" instance_type= "ml.p3.8xlarge", hyperparameters = { ... "n_gpus": 4 # corresponds to number of GPUs on specified instance } ) hf_estimator.fit()
    2. 在訓練指令碼剖析 n_gpus 超參數,並指定其為 GPU_NUM_DEVICES 環境變數的輸入。

      # train.py import os, argparse if __name__ == "__main__": parser = argparse.ArgumentParser() ... # Data, model, and output directories parser.add_argument("--output_data_dir", type=str, default=os.environ["SM_OUTPUT_DATA_DIR"]) parser.add_argument("--model_dir", type=str, default=os.environ["SM_MODEL_DIR"]) parser.add_argument("--training_dir", type=str, default=os.environ["SM_CHANNEL_TRAIN"]) parser.add_argument("--test_dir", type=str, default=os.environ["SM_CHANNEL_TEST"]) parser.add_argument("--n_gpus", type=str, default=os.environ["SM_NUM_GPUS"]) args, _ = parser.parse_known_args() os.environ["GPU_NUM_DEVICES"] = args.n_gpus
  • 方法 3 — 在訓練指令碼針對 GPU_NUM_DEVICES 環境變數進行硬式編碼。例如,如果您使用具有四個的執行個體,請將下列項目新增至指令碼GPUs。

    # train.py import os os.environ["GPU_NUM_DEVICES"] = 4
提示

若要尋找您要使用的機器學習執行個體上的GPU裝置數量,請參閱 Amazon EC2 執行個體類型頁面中的加速運算

SageMaker 訓練編譯器不會減少總訓練時間

如果訓練編譯器的總訓 SageMaker 練時間沒有減少,我們強烈建議您SageMaker 訓練編譯器最佳做法和考量瀏覽該頁面以檢查訓練配置、輸入張量形狀的填充策略以及超參數。