

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

# SageMaker Training Compiler 最佳實務和考量事項
<a name="training-compiler-tips-pitfalls"></a>

**重要**  
Amazon Web Services (AWS) 宣佈不再推出新版本的 SageMaker Training Compiler。您可以透過現有的 SageMaker 訓練 AWS 深度學習容器 (DLC)，繼續利用 SageMaker Training Compiler。請務必注意，雖然現有 DLCs仍可存取，但根據深度學習容器架構支援政策 AWS，他們將不再收到來自 的修補程式或更新。 [AWS](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/support-policy.html)

當採用 SageMaker Training Compiler 時，請檢閱下列最佳實務和考量事項。

## 最佳實務
<a name="training-compiler-tips-pitfalls-best-practices"></a>

當採用 SageMaker Training Compiler 執行訓練工作時，請遵循下列準則來取得最佳結果。

**一般最佳實務**
+ 請確保採用 [支援的執行個體類型](training-compiler-support.md#training-compiler-supported-instance-types) 與 [測試過的模型](training-compiler-support.md#training-compiler-tested-models) 其中一個。
+ 當您利用訓練指令碼的 Hugging Face 轉換器程式庫來為 NLP 模型建立權杖化工具時，請確保指定 `padding='max_length'`，以便採用靜態輸入張量形狀。請勿使用 `padding='longest'`，因為填補至批次最長的序列可能變更每個訓練批次的張量形狀。動態輸入形狀可啟動模型的重新編譯，並可能增加總訓練時間。如需更多資訊了解轉換器權杖化工具填補選項，請參閱 *Hugging Face 轉換器文件*的[填補及截斷](https://huggingface.co/docs/transformers/pad_truncation)。
+ 測量 GPU 記憶體使用率，以確定您使用的是 GPU 記憶體可容納的最大批次大小。Amazon SageMaker Training Compiler 可減少訓練期間模型的記憶體用量，這通常可讓您在 GPU 記憶體容納較大 `batch_size`。使用較大 `batch_size` 可提高 GPU 使用率並減少總訓練時間。

  當您調整批次大小時，必須同時適當調整 `learning_rate`。例如，如您依係數 `k` 增加批次大小，則需要線性調整 `learning_rate` (簡單乘以 `k`) 或乘以 `k` 的平方根。這是為了在縮短的訓練時間內達成相同或類似的收斂行為。如需參考資料了解針對熱門模型測試的 `batch_size`，請參閱[測試過的模型](training-compiler-support.md#training-compiler-tested-models)。
+ 若要偵錯利用編譯器加速的訓練工作，請啟用 `compiler_config` 參數的 `debug` 旗標。這可讓 SageMaker AI 將偵錯記錄放入 SageMaker 訓練任務記錄。

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

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

**PyTorch 最佳實務**
+ 如您採用自有 PyTorch 模型並希望加以檢查，請確保使用 Pytorch/XLA 的模型儲存功能來正確檢查模型。如需有關此功能的詳細資訊，請參閱 *XLA 裝置的 PyTorch 文件*的 [https://pytorch.org/xla/release/1.9/index.html#torch_xla.core.xla_model.save](https://pytorch.org/xla/release/1.9/index.html#torch_xla.core.xla_model.save)。

  如需了解如何新增修改至 PyTorch 指令碼，請參閱[直接使用 PyTorch 的大型語言模型 (無需 Hugging Face 轉換器訓練器 API)](training-compiler-pytorch-models.md#training-compiler-pytorch-models-non-trainer)。

  如需詳細資訊了解使用模型儲存功能的實際應用程式，請參閱 *Pytorch/XLA TPU 的 Hugging Face：更快、更低廉的訓練部落格*的[檢查點寫入及載入](https://huggingface.co/blog/pytorch-xla#checkpoint-writing-and-loading)。
+ 若要針對分散式訓練達到最佳訓練時間，請考慮下列事項。
  + 採用具多 GPU 執行個體，而非單 GPU 執行個體。例如，相較於 8 x `ml.p3.2xlarge` 執行個體，單 `ml.p3dn.24xlarge` 執行個體的訓練時間更快。
  + 採用具 EFA 支援的執行個體，例如 `ml.p3dn.24xlarge` 與 `ml.p4d.24xlarge`。這些執行個體類型可加快聯網速度並減少訓練時間。
  + 調整資料集的 `preprocessing_num_workers` 參數，讓模型訓練不會因緩慢的預處理而延遲。

## 考量事項
<a name="training-compiler-tips-pitfalls-considerations"></a>

當採用 SageMaker Training Compiler 時，請考量下列事項。

### 因記錄、檢查點及分析而降低效能
<a name="training-compiler-considerations-performance-degradation"></a>
+ 避免記錄、檢查點及導致明確評估的分析模型張量。若要了解什麼是明確評估，請考慮以下代碼編譯範例。

  ```
  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()](https://pytorch.org/docs/stable/generated/torch.Tensor.item.html)，因其可能導致明確評估。對於深度學習，由於這種明確評估會破壞模型編譯圖的融合操作，並導致重新計算張量，因此可能導致額外負荷。

  如您在運用 SageMaker Training Compiler 時，仍想於訓練期間定期評估模型，建議您以較低頻率記錄及檢查，以便減少因明確評估而產生的額外負荷。例如，每 10 個 epoch 記錄一次，而非每一 epoch。
+ 圖形編譯會於訓練的前幾個步驟執行。因此，預計前幾個步驟將非常緩慢。然而，此為一次性編譯成本，且由於編譯可讓未來步驟更快，因此可透過更長時間的訓練來攤銷。初始編譯額外負荷取決於模型大小、輸入張量大小，以及輸入張量形狀的分佈。

### 當直接採用 PyTorch 時，未正確使用 PyTorch/XLA API
<a name="training-compiler-considerations-incorrect-api-use"></a>

PyTorch/XLA 定義一組 API 來取代部分現有 PyTorch 訓練 API。如未正確使用會導致 PyTorch 訓練失敗。
+ 在編譯 PyTorch 模型時，最典型的錯誤之一是，採用錯誤運算子與張量裝置類型。若要正確編譯 PyTorch 模型，請務必使用 XLA 裝置 ([https://pytorch.org/xla/release/1.9/index.html](https://pytorch.org/xla/release/1.9/index.html))，而非 CUDA 或混合 CUDA 裝置與 XLA 裝置。
+ `mark_step()` 僅對 XLA 而言是障礙。若未正確設定，會導致訓練工作停頓。
+ Pytor/XLA 提供額外分散式訓練 API。若未正確編寫 API，會導致梯度收集不正確，進而造成訓練收斂失敗。

若要正確設定 PyTorch 指令碼並避免上述 API 錯誤使用，請參閱[直接使用 PyTorch 的大型語言模型 (無需 Hugging Face 轉換器訓練器 API)](training-compiler-pytorch-models.md#training-compiler-pytorch-models-non-trainer)。