

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# SageMaker 训练编译器最佳实践和注意事项
<a name="training-compiler-tips-pitfalls"></a>

**重要**  
Amazon Web Services (AWS) 宣布， SageMaker 训练编译器将没有新版本或新版本。你可以继续通过现有的 Dee AWS p Learning Containers (DLCs) 使用 SageMaker SageMaker 训练编译器进行训练。值得注意的是，根据[AWS 深度学习容器（Deep Learning Containers Framework Support）政策 AWS](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/support-policy.html)，虽然现有内容 DLCs 仍然可以访问，但它们将不再收到来自的补丁或更新。

使用 SageMaker 训练编译器时，请查看以下最佳做法和注意事项。

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

使用 Training Compiler 运行训练作业时，请遵循以下准则以 SageMaker 获得最佳结果。

**一般最佳实践**
+ 请务必使用[支持的实例类型](training-compiler-support.md#training-compiler-supported-instance-types)或[经过测试的模型](training-compiler-support.md#training-compiler-tested-models)。
+ 在训练脚本中使用 Hugging Face Transformers 库为 NLP 模型创建分词器时，请务必通过指定 `padding='max_length'` 来使用静态输入张量形状。请勿使用 `padding='longest'`，因为填充批处理中的最长序列可能会改变每个训练批处理的张量形状。动态输入形状可以启动对模型的重新编译，并可能会增加总训练时间。有关 Transformers 分词器的填充选项的更多信息，请参阅 *Hugging Face Transformers 文档*中的[填充和截断](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 的模型保存功能来正确检查您的模型。有关该功能的更多信息，请参阅 [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)*XLA 设备PyTorch 上的文档*。

  要了解如何向 PyTorch 脚本添加修改，请参阅[PyTorch 直接使用大型语言模型（没有 Hugging Face 变形金刚训练器 API）](training-compiler-pytorch-models.md#training-compiler-pytorch-models-non-trainer)。

  有关使用模型保存功能的实际应用的更多信息，请参阅 *Hugging Fac PyTorch/XLA TPUs e 中的[检查点写作和加载](https://huggingface.co/blog/pytorch-xla#checkpoint-writing-and-loading)：更快、更便宜的训练博*客。
+ 要实现分布式训练的最佳训练时间，请考虑以下几点。
  + 使用具有多个 GPU 的实例， GPUs 而不是使用单 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 训练编译器时，请考虑以下几点。

### 由于日志记录、检查点设置和分析而导致性能下降
<a name="training-compiler-considerations-performance-degradation"></a>
+ 避免因对模型张量进行日志记录、检查点设置和分析而导致显式评估。要了解什么是显式评估，请考虑以下代码编译示例。

  ```
  a = b+c
  e = a+d
  ```

  编译器按如下方式解释代码，并减少变量 `a` 的内存占用：

  ```
  e = b+c+d
  ```

  现在考虑以下情况，即更改代码来为变量 `a` 添加 print 函数。

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

  编译器按如下方式对变量 `a` 进行显式评估。

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

  例如 PyTorch，避免使用 t [orch.tensor.items ()，这可能会引](https://pytorch.org/docs/stable/generated/torch.Tensor.item.html)入明确的评估。在深度学习中，此类显式评估可能会产生开销，因为它们会中断模型编译图中的融合运算并导致重新计算张量。

  如果您仍然想在训练期间使用 SageMaker Training Compiler 定期评估模型，我们建议以较低的频率进行日志记录和检查点检查，以减少因显式评估而产生的开销。例如，每 10 个纪元而不是每个纪元记录一次。
+ 图形编译在训练的前几个步骤中运行。因此，预计前几个步骤的速度将非常慢。不过，这是一次性编译成本，可以通过较长时间的训练来摊销，因为编译会加快未来步骤的速度。初始编译开销取决于模型的大小、输入张量的大小以及输入张量形状的分布。

### PyTorch 直接使用 PyTorch/XLA APIs 时使用不正确
<a name="training-compiler-considerations-incorrect-api-use"></a>

PyTorch/XLA 定义了一组 APIs 来替换某些现有 PyTorch训练。 APIs不正确使用它们会导致 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 的一个障碍。如果设置不正确，则会导致训练作业停滞。
+ PyTorch/XLA 提供额外的分布式训练。 APIs未能 APIs 正确编程会导致梯度收集不正确，从而导致训练收敛失败。

要正确设置 PyTorch 脚本并避免上述不正确的 API 使用，请参阅[PyTorch 直接使用大型语言模型（没有 Hugging Face 变形金刚训练器 API）](training-compiler-pytorch-models.md#training-compiler-pytorch-models-non-trainer)。