使用 Amazon SageMaker Hyperband 自动模型调整有效解决分布式训练融合问题

作者: 乌里·罗森伯格 | 202

近年来,深度学习神经网络 (DNN) 取得了惊人的发展。这种增长可以从更精确的模型中看出,甚至可以通过生成式人工智能开辟新的可能性:合成自然语言的大型语言模型 (LLM)、文本到图像生成器等等。DNN 能力的增强伴随着大规模模型的成本,这些模型需要大量的计算资源才能进行训练。分布式训练通过两种技术解决了这个问题:数据并行性和模型并行性。数据并行性用于在多个节点和工作节点上扩展训练过程,模型并行性会拆分模型并将其拟合到指定的基础架构上。 借助 Amazon S ageMaker 分布式 训练任务,您只需单击(或一次 API 调用)即可设置分布式计算集群、训练模型、将结果保存 到亚马逊简单存储 服务(Amazon S3),并在完成后关闭集群。 此外,SageMaker 通过推出 异构集群 和用于 数据并行 和模型并行的分布式训练库等功能,在分布式训练领域不断创新。

在分布式环境中进行高效训练需要调整超参数。在多个 GPU 上训练时,一个常见的良好做法示例是将批处理(或小批量)大小乘以 GPU 数量,以保持每个 GPU 的批次大小相同。但是,调整超参数通常会影响模型的收敛性。因此,分布式训练需要平衡三个因素:分布、超参数和模型精度。

在这篇文章中,我们探讨了分布式训练对收敛的影响,以及如何使用 Amazon SageMaker 自动模型 调整来微调模型 超参数,以便使用数据并行进行分布式训练。

这篇文章中提到的源代码可以在 GitHub 存储库中找到 (建议 使用 m5.xlarge 实例)。

将训练从单一环境扩展到分布式环境

数据并行化是一种将训练过程扩展到多种计算资源并缩短训练时间的方法。使用数据并行性,数据在计算节点之间进行分区,每个节点根据其分区计算梯度并更新模型。这些更新可以使用一个或多个参数服务器以异步、一对多或全对所有的方式完成。另一种方法是使用 AllReduce 算法。例如,在 ring-allreduce 算法中,每个节点仅与两个相邻节点通信,从而减少了总体数据传输。要了解有关参数服务器和 ring-allreduce 的更多信息,请参阅 使用亚马逊 SageMaker 中的 Horovod 或参数服务器轻松 启动 TensorFlow 分布式训练 。 关于数据分区,如果有 n 个 计算节点,则每个节点都应获得数据子集,大小约为 1/ n

为了演示横向扩展训练对模型收敛的影响,我们进行了两个简单的实验:

  • 使用 MxNet 和 Gluon 框架,使用具有 ReLU 激活功能的全连接层 DNN 训练图像分类模型。对于训练数据,我们使用了手写数字的 MNIST 数据集 。我们使用了 SageMaker 示例存储库 中提供的源代码。
  • 使用 SageMaker 内置 XgBoost 算法训练二进制 分类模型。 我们使用 直销数据集 来预测可能以特定报价做出回应的银行客户。重现实验的源代码和步骤可以在 GitHub存储库 中找到。

每个模型训练运行两次:在单个实例上,分布在多个实例上。对于 DNN 分布式训练,为了充分利用分布式处理器,我们将小批量大小乘以实例数(四个)。下表汇总了设置和结果。

Problem type Image classification Binary classification
Model DNN XGBoost
Instance ml.c4.xlarge ml.m5.2xlarge
Data set

MNIST

(带标签的图片)

Direct Marketing
(tabular, numeric and vectorized categories)
Validation metric Accuracy AUC
Epocs/Rounds 20 150
Number of Instances 1 4 1 3
Distribution type N/A Parameter server N/A AllReduce
Training time (minutes) 8 3 3 1
Final Validation score 0.97 0.11 0.78 0.63

对于这两个模型,分布因子几乎线性地缩短了训练时间。但是,模型收敛性大幅下降。对于两种不同的模型、不同的计算实例、不同的分配方法和不同的数据类型,这种行为是一致的。那么,为什么分布训练过程会影响模型的准确性呢?

有许多理论试图解释这种影响:

  • 当张量更新规模较大时,工作人员和参数服务器之间的流量可能会变得拥塞。因此,由于权重更新的延迟,异步参数服务器的收敛性会大大降低 [1]。
  • 增加批量大小会导致过度拟合和概化不佳,从而降低验证精度 [2]。
  • 异步更新模型参数时,有些 DNN 可能没有使用最新更新的模型权重;因此,他们将根据延迟几次迭代的权重来计算梯度。这会导致体重陈旧 [3],可能由多种原因引起。
  • 一些超参数是特定于模型或优化器的。例如,XgBoost 官方文档说, tree_mod e 超参数的 确切 值不支持分布式训练,因为 XgBoost 采用行拆分数据分布,而 精确的 树方法适用于排序列格式。
  • 一些研究人员提出,配置更大的迷你批次可能会降低随机性的梯度。当损失函数包含局部最小值和鞍点并且没有更改步长,优化停留在局部最小值或鞍点时,就会发生这种情况 [4]。

针对分布式训练进行优化

超参数优化 (HPO) 是搜索和选择一组最适合学习算法的超参数的过程。SageMaker 自动模型调整 (AMT) 通过在提供的数据集上运行多个训练作业,将 HPO 作为托管服务提供。SageMaker AMT 会搜索您指定的超参数范围并返回最佳值,这些值由您选择的指标进行测量。您可以将 SageMaker AMT 与内置算法一起使用,也可以使用您的自定义算法和容器。

但是,分布式训练的优化不同于普通的 HPO,因为每个作业实际上不是启动一个实例集群,而是每个训练作业启动一个实例集群。这意味着对成本的影响更大(特别是如果您考虑昂贵的 GPU 加速实例,这在 DNN 中很常见)。除了 AMT 限制外 ,您还可能达 SageMaker 账户 对并发训练实例数的限制 。最后,由于启动时间较长,启动集群可能会带来运营开销。SageMaker AMT 具有解决这些问题的特定功能。 具有提前停止功能的超频段 可确保对性能良好的超参数配置进行微调,而性能不佳的超参数配置会自动停止。这样可以有效地利用训练时间并减少不必要的成本。此外,SageMaker AMT 完全支持使用 Amazon EC2 竞价型实例,与按需实例相比,它可以 将培训 成本优化 多达 90% 。关于较长的启动时间,SageMaker AMT 会在每个调整作业中自动重复使用训练实例,从而将每个 训练作业 的平均启动时间缩短 20 倍。 此外,您还应遵循 AMT 最佳实践 ,例如选择相关的超参数、相应的范围和尺度以及最佳数量的并行训练作业,以及设置随机种子以重现结果。

在下一节中,我们将使用前面讨论的 XgBoost 示例配置、运行和分析 AMT 作业时看到这些功能的实际应用。

配置、运行和分析调整作业

如前所述,源代码可以在 GitHub存储库 中找到。在步骤 1—5 中,我们下载并准备数据,创建 xg b3 估计器(分布式 X gBoost 估计器设置为使用三个实例),运行训练作业,然后观察结果。在本节中,假设你已经完成了步骤 1—5,我们将介绍如何为该估算器设置调整作业。

调优作业通过使用评估性能的指标来计算其启动的训练作业的最佳超参数。 您可以 配置自己的指标 ,SageMaker 将根据您配置的正则表达式对其进行解析并将其发送到 stdout ,也可以使用 SageMaker 内置算法的指标。 在此示例中,我们使用 内置的 XgBoost 目标指标 ,因此我们无需配置正则表达式。为了优化模型收敛,我们基于验证 AUC 指标进行优化:

objective_metric_name="validation:auc"

我们调整了七个超参数:

  • num_round — 训练期间需要提升的回合数。
  • eta — 更新中使用的步长缩小以防止过度拟合。
  • alpha — 关于权重的 L1 正则化项。
  • min_child_weig h t — 孩子所需的实例权重(黑森州)的最小总和。如果树分区步骤生成的叶节点的实例权重总和小于 min_child_ weight ,则构建过程将放弃进一步的分区。
  • 最大深度 - 树的最大深度。
  • colsample_bylevel — 每个级别中每个分割的列的子样本比例。树中每达到一个新的深度等级,就会进行一次子采样。
  • colsample_bytree — 构造每棵树时列的子样本比例。对于构造的每棵树,子采样发生一次。

要了解有关 XgBoost 超参数的更多信息,请参阅 XgBoost 超参数。 以下代码显示了七个超参数及其范围:

hyperparameter_ranges = {
    "num_round": IntegerParameter(100, 200),
    "eta": ContinuousParameter(0, 1),
    "min_child_weight": ContinuousParameter(1, 10),
    "alpha": ContinuousParameter(0, 2),
    "max_depth": IntegerParameter(1, 10),
    "colsample_bylevel": ContinuousParameter(0, 1),
    "colsample_bytree": ContinuousParameter(0, 1),
}

接下来,我们使用 Sage Maker SDK 提供超频带策略 配置 和调谐器对象配置。 H@@ yperbandStrategyConfig 可以使用两个参数: max_resou rce (可选)表示训练作业用于实现目标的最大迭代次数; min_resou rce — 训练作业在停止训练之前使用的最小迭代次数。我们使用 HyperbandStrategyConfig 来配置 StrategyConfig ,稍后会将其用于调整作业定义。参见以下代码:

hsc = HyperbandStrategyConfig(max_resource=30, min_resource=1)
sc = StrategyConfig(hyperband_strategy_config=hsc)

现在我们创建一个 HyperParameterTuner 对象,我们将以下信息传递给该对象:

  • xgBoost 估算器,设置为使用三个实例运行
  • 客观指标的名称和定义
  • 我们的超参数范围
  • 调整资源配置,例如要运行的训练作业总数以及可以并行运行的训练作业数量
  • 超频段设置(我们在上一步中配置的策略和配置)
  • 提前停止( 提前停止类型)设置为关闭

为什么我们将 “提前停车” 设置为 “关闭”?当训练作业不太可能改善超参数调整作业的客观指标时,可以提前停止。这可以帮助减少计算时间并避免模型过度拟合。但是,Hyperband 使用先进的内置机制来进行提前停止。因此,在使用 H yperband 内部提前停止功能 时, 必须将参数 early_stopping_ type 设置为。参见以下代码:

tuner = HyperparameterTuner(
    xgb3,
    objective_metric_name,
    hyperparameter_ranges,
    max_jobs=30,
    max_parallel_jobs=4,
    strategy="Hyperband",
    early_stopping_type="Off",
    strategy_config=sc
)

最后,我们通过调用 fit 方法开始自动模型调整作业。如果要以异步方式启动作业,请将 wai t 设置 为 False 。参见以下代码:

tuner.fit(
{"train": s3_input_train, "validation": s3_input_validation},
include_cls_metadata=False,
wait=True,
)

您可以在 SageMaker 控制台上关注作业进度和摘要。在导航窗格的 “ 训练” 下 ,选择 超参数调整作业 ,然后选择相关的调整作业。以下屏幕截图显示了调整作业,其中包含有关训练作业状态和性能的详细信息。

调整工作完成后,我们可以查看结果。在笔记本示例中,我们展示了如何使用 SageMaker SDK 提取结果。首先,我们研究调整工作如何提高模型的收敛性。 你可以使用作业名称附加 HyperParameterTuner 对象并调用描述方法。 该方法返回一个包含调整作业元数据和结果的字典。

在以下代码中,我们检索了表现最好的训练工作的价值,该值以我们的客观指标(验证 AUC)来衡量:

tuner = HyperparameterTuner.attach(tuning_job_name=tuning_job_name)
tuner.describe()["BestTrainingJob"]["FinalHyperParameterTuningJobObjectiveMetric"]["Value"]

验证集上的 AUC 结果为 0.78。与最初的 0.63 相比,这是一个显著的改进!

接下来,让我们看看我们的训练任务运行得有多快。为此,我们使用 SDK 中的 HyperParameterTuningJobaNalytics 方法来获取有关调优作业的结果,然后读入 Pan das 数据框进行分析和可视化:

tuner_analytics = sagemaker.HyperparameterTuningJobAnalytics(tuning_job_name)
full_df = tuner_analytics.dataframe()
full_df.sort_values(by=["FinalObjectiveValue"], ascending=False).head()

让我们看看使用 Hyperband 策略进行训练作业所花费的平均时间:

full_df["TrainingElapsedTimeSeconds"].mean()

平均时间约为 1 分钟。这与 Hyperband 策略机制一致,该机制可尽早阻止训练工作表现不佳。在成本方面,调音工作共向我们收取了30分钟的培训时间。如果不提前停止 Hyperband,则总计费训练时长预计为 90 分钟(30 个作业 x 每个作业 1 分钟 x 每个作业 3 个实例)。这在节省成本方面好了三倍!最后,我们看到调优作业运行了 30 个训练作业,总共花了 12 分钟。这比预期时间减少了将近 50%(30 个作业/4 个任务并行完成 * 每个作业 3 分钟)。

结论

在这篇文章中,我们描述了在分布式环境中训练模型时观察到的一些收敛问题。我们看到,使用Hyperband的SageMaker AMT解决了优化数据并行分布式训练所引入的主要问题:融合(提高了10%以上)、运营效率(调整工作所需的时间比连续的非优化作业少50%)和成本效益(30分钟,而训练作业的计费时间为90分钟)。下表总结了我们的结果:

Improvement Metric No Tuning/Naive Model Tuning Implementation SageMaker Hyperband Automatic Model Tuning Measured Improvement
Model Quality
(Measured by validation AUC)
0.63 0.78 15%
Cost
(Measured by billable training minutes)
90 30 66%
Operational efficiency
(Measured by total running time)
24 12 50%

为了对扩展(集群大小)进行微调,您可以使用多个集群配置重复调整作业,并比较结果,找到满足速度和模型精度的最佳超参数。

我们在 笔记本 的最后一部分中包括了实现这一目标的步骤 。

参考文献

[1] Lian、Xiangru 等“异步去中心化并行随机梯度下降。” 机器学习国际会议 。PMLR,2018。

[2] Keskar、Nitish Shirish 等。“论深度学习的大批量训练:广义差距和极小值。” arxiv 预印本 arxiv: 1609.04836 (2016)。

[3] Dai、Wei 等。“努力理解陈旧对分布式机器学习的影响。” arxiv 预印本 arxiv: 1810.03264 (2018)。

[4] Dauphin、Yann N. 等。“识别和解决高维非凸优化中的鞍点问题。” 神经信息处理系统的进展 27 (2014)。


作者简介

乌里·罗森伯格是欧洲、中东和非洲的人工智能和机器学习专业技术经理。Uri 总部位于以色列,致力于让企业客户能够大规模设计、构建和运营 ML 工作负载。在业余时间,他喜欢骑自行车、徒步旅行和抱怨数据准备。