SageMaker 训练编译器最佳实践和注意事项 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

SageMaker 训练编译器最佳实践和注意事项

重要

Amazon Web Services (Amazon) 宣布, SageMaker 训练编译器将没有新版本或新版本。你可以继续通过现有的 Dee Amazon p Lear SageMaker ning Containers (DLC) 使用 Training Compiler 进行 SageMaker 训练。值得注意的是,尽管现有的 DLC 仍然可以访问,但根据Amazon 深度学习容器框架支持政策 Amazon,它们将不再收到来自的补丁或更新。

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

最佳实操

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

一般最佳实践
  • 请务必使用支持的实例类型经过测试的模型

  • 在训练脚本中使用 Hugging Face Transformers 库为 NLP 模型创建分词器时,请务必通过指定 padding='max_length' 来使用静态输入张量形状。请勿使用 padding='longest',因为填充批处理中的最长序列可能会改变每个训练批处理的张量形状。动态输入形状可以启动对模型的重新编译,并可能会增加总训练时间。有关 Transformers 分词器的填充选项的更多信息,请参阅 Hugging Face Transformers 文档中的填充和截断

  • 测量 GPU 内存利用率,确保使用可容纳 GPU 内存的最大批处理大小。Amazon SageMaker Training Compiler 可以减少训练期间模型的内存占用,这通常允许您在 GPU 内存batch_size中容纳更大的内存。使用更大的 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.saveXLA 设备PyTorch 上的文档

    要了解如何向 PyTorch 脚本添加修改,请参阅 PyTorch 直接使用大型语言模型(没有 Hugging Face Transformers Trainer API)

    有关使用模型保存功能的实际应用的更多信息,请参阅 /XLA TPU PyTorch 上的 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 添加 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 (),这可能会引入明确的评估。在深度学习中,此类显式评估可能会产生开销,因为它们会中断模型编译图中的融合运算并导致重新计算张量。

    如果您仍然想在训练期间使用 SageMaker Training Compiler 定期评估模型,我们建议以较低的频率进行日志记录和检查点检查,以减少因显式评估而产生的开销。例如,每 10 个纪元而不是每个纪元记录一次。

  • 图形编译在训练的前几个步骤中运行。因此,预计前几个步骤的速度将非常慢。不过,这是一次性编译成本,可以通过较长时间的训练来摊销,因为编译会加快未来步骤的速度。初始编译开销取决于模型的大小、输入张量的大小以及输入张量形状的分布。

直接使用时 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 Transformers Trainer API)