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

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

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

重要

Amazon Web Services(AWS)宣布將不會有新版本或 SageMaker 培訓編譯器版本。您可以透過現有的 AWS Deep Learning Containers (DLC) 進行 SageMaker 訓練,繼續使用 SageMaker 訓練編譯器。請務必注意,雖然現有的 DLC 仍可供存取,但根據 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 的模型保存功能來正確檢查模型。如需有關此功能的詳細資訊,請參閱 XLA 裝置PyTorch 上的說明文件torch_xla.core.xla_model.save中的。

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

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

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

    • 採用具多 GPU 執行個體,而非單 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 /XLA API PyTorch

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

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

  • mark_step() 僅對 XLA 而言是障礙。若未正確設定,會導致訓練工作停頓。

  • PyTorch/XLA 提供額外的分散式訓練 API。若未正確編寫 API,會導致梯度收集不正確,進而造成訓練收斂失敗。

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