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

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

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

重要

Amazon Web Services (AWS) 宣布, SageMaker 训练编译器将没有新版本或新版本。你可以继续通过现有的 Dee AWS p Learning Containers (DLCs) 使用 SageMaker SageMaker 训练编译器进行训练。值得注意的是,根据AWS 深度学习容器(Deep Learning Containers Framework Support)政策 AWS,虽然现有内容DLCs仍然可以访问,但它们将不再收到来自的补丁或更新。

使用 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的模型保存功能来正确检查您的模型。有关该函数的更多信息,请参阅 “XLA设备” 文档torch_xla.core.xla_model.save中的PyTorch 。

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

    有关使用模型保存功能的实际应用的更多信息,请参阅 Hugging Face 中的 Checkpoin t Writing and Loading PyTorch on XLATPUs/:更快、更便宜的训练博客

  • 要实现分布式训练的最佳训练时间,请考虑以下几点。

    • 使用具有多个 GPU 的实例,GPUs而不是使用单 GPU 实例。例如,与 8 x ml.p3.2xlarge 实例相比,单个 ml.p3dn.24xlarge 实例的训练时间更短。

    • 使用EFA支持如ml.p3dn.24xlarge和的实例ml.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 直接使用时使用 PyTorch/XLAAPIs时使用不正确

PyTorch/XLA定义了一组APIs来替换某些现有 PyTorch训练APIs。不正确使用它们会导致 PyTorch 训练失败。

  • 编译 PyTorch 模型时最典型的错误之一是由于运算符和张量的设备类型不正确。要正确编译 PyTorch 模型,请确保使用XLA设备 (xm.xla_device()),而不是使用CUDA或混合CUDA设备和XLA设备。

  • mark_step()是专用的屏障XLA。如果设置不正确,则会导致训练作业停滞。

  • PyTorch/XLA提供额外的分布式训练APIs。未能APIs正确编程会导致梯度收集不正确,从而导致训练收敛失败。

要正确设置 PyTorch 脚本并避免上述错误API使用,请参阅 PyTorch 直接使用大型语言模型(没有 Hugging Face Transformers Trainer API)