SageMaker 訓練編譯器最佳做法和考量 - Amazon SageMaker

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

SageMaker 訓練編譯器最佳做法和考量

重要

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

使用 SageMaker 訓練編譯器時,請檢閱下列最佳作法和考量事項。

最佳實務

使用「訓練編譯器」執行訓練工作時,請遵循下列準則來取得最佳結果。 SageMaker

一般最佳實務
  • 請確保採用 支援的執行個體類型測試模型模型 其中一個。

  • 當您使用訓練腳本中的 Hugging Face 變形器庫為NLP模型創建標記生成器時,請確保您通過指定來使用靜態輸入張量形狀。padding='max_length'請勿使用 padding='longest',因為填補至批次最長的序列可能變更每個訓練批次的張量形狀。動態輸入形狀可啟動模型的重新編譯,並可能增加總訓練時間。如需更多資訊了解轉換器權杖化工具填補選項,請參閱 Hugging Face 轉換器文件填補及截斷

  • 測量GPU記憶體使用率,以確定您使用的是可容納GPU記憶體的最大批次大小。Amazon SageMaker 訓練編譯器可減少訓練期間模型的記憶體佔用量,這通常可讓您在記憶體batch_size中容納更大的GPU記憶體。使用較大的batch_size結果可以更好地GPU利用並減少總訓練時間。

    當您調整批次大小時,必須同時適當調整 learning_rate。例如,如您依係數 k 增加批次大小,則需要線性調整 learning_rate (簡單乘以 k) 或乘以 k 的平方根。這是為了在縮短的訓練時間內達成相同或類似的收斂行為。如需參考資料了解針對熱門模型測試的 batch_size,請參閱測試模型模型

  • 若要偵錯利用編譯器加速的訓練工作,請啟用 compiler_config 參數的 debug 旗標。這可讓您 SageMaker 將偵錯記錄放入 SageMaker 訓練工作記錄中。

    huggingface_estimator=HuggingFace( ... compiler_config=TrainingCompilerConfig(debug=True) )

    請注意,如您啟用編譯器訓練工作的完整偵錯功能,可能會增加部分額外負荷。

的最佳做法 PyTorch
  • 如果你帶來一個 PyTorch 模型,並想檢查它,請確保你使用 PyTorch/XLA的模型保存功能來正確檢查你的模型。如需有關此功能的詳細資訊,請參閱torch_xla.core.xla_model.saveXLADevices PyTorch 上的說明文件中。

    若要瞭解如何將修改新增至 PyTorch 指令碼,請參閱 PyTorch 直接使用的大型語言模型(無需 Hugging Face 變形金剛訓練器 API)

    如需有關使用模型儲存功能的實際應用程式的詳細資訊,請參閱 < Hugging Face 部落格上的檢查點寫入和載入 > XLATPUs:更快 PyTorch、更便宜的訓練部落格

  • 若要針對分散式訓練達到最佳訓練時間,請考慮下列事項。

    • 搭配多個執行個體使用,GPUs而不是使用單 GPU 執行個體。例如,相較於 8 x ml.p3.2xlarge 執行個體,單 ml.p3dn.24xlarge 執行個體的訓練時間更快。

    • 使用具有EFA支援的執行個體,例如ml.p3dn.24xlargeml.p4d.24xlarge。這些執行個體類型可加快聯網速度並減少訓練時間。

    • 調整資料集的 preprocessing_num_workers 參數,讓模型訓練不會因緩慢的預處理而延遲。

考量事項

使用 SageMaker 訓練編譯器時,請考慮下列事項。

因記錄、檢查點及分析而降低效能

  • 避免記錄、檢查點及導致明確評估的分析模型張量。若要了解什麼是明確評估,請考慮以下代碼編譯範例。

    a = b+c e = a+d

    編譯器以如下方式解釋代碼,並減少變數 a 的記憶體用量:

    e = b+c+d

    現在請考慮以下情況,其中代碼經變更,以便針對變數 a 新增列印功能。

    a = b+c e = a+d print(a)

    編譯器會針對變數 a 進行明確評估,如下所示。

    e = b+c+d a = b+c # Explicit evaluation print(a)

    例如 PyTorch,在中,避免使用 torch.tensor.items (),這可能會引入明確的評估。對於深度學習,由於這種明確評估會破壞模型編譯圖的融合操作,並導致重新計算張量,因此可能導致額外負荷。

    如果您仍想要在訓練期間定期評估模型,同時使用 SageMaker 訓練編譯器,我們建議您以較低的頻率記錄和檢查點,以減少因為明確評估所造成的負荷。例如,每 10 個 epoch 記錄一次,而非每一 epoch。

  • 圖形編譯會於訓練的前幾個步驟執行。因此,預計前幾個步驟將非常緩慢。然而,此為一次性編譯成本,且由於編譯可讓未來步驟更快,因此可透過更長時間的訓練來攤銷。初始編譯額外負荷取決於模型大小、輸入張量大小,以及輸入張量形狀的分佈。

PyTorch 直 PyTorch接使用XLAAPIs時/不正確使用/

PyTorch/XLA定義了一組APIs來取代一些現有的 PyTorch訓練APIs。如果不正確地使用它們會導致 PyTorch 培訓失敗。

  • 編譯模型時最典 PyTorch 型的錯誤之一是由於操作員和張量的設備類型錯誤。要正確編譯 PyTorch 模型,請確保使用 XLA devices (xm.xla_device()) 而不是使用CUDA或混合CUDA設備和XLA設備。

  • mark_step()是一個障礙只是為了XLA. 若未正確設定,會導致訓練工作停頓。

  • PyTorch/XLA提供額外的分佈式培訓APIs。未正確設定程式會導致不APIs正確地收集漸層,進而導致訓練收斂失敗。

要正確設置 PyTorch 腳本並避免上述不正確的API用法,請參閱 PyTorch 直接使用的大型語言模型(無需 Hugging Face 變形金剛訓練器 API)