使用亚马逊SageMaker Hyperband自动模型调优,有效解决分布式训练收敛问题
使用亚马逊SageMaker Hyperband自动模型调优,解决分布式训练收敛问题
近年来,深度学习神经网络(DNN)取得了惊人的增长。这种增长体现在更准确的模型上,甚至通过生成型人工智能带来了新的可能性:合成自然语言的大型语言模型(LLM)、文本到图像生成器等。这些增强的DNN功能是以需要大量计算资源来训练庞大模型的代价为基础的。分布式训练通过两种技术来解决这个问题:数据并行和模型并行。数据并行用于将训练过程在多个节点和工作器之间进行扩展,而模型并行将模型分割并适应指定的基础设施。亚马逊SageMaker分布式训练作业可以通过一个点击(或一次API调用)设置一个分布式计算集群,训练模型,将结果保存到亚马逊简单存储服务(Amazon S3),并在完成后关闭集群。此外,SageMaker通过推出异构集群和用于数据并行和模型并行的分布式训练库等功能,在分布式训练领域不断创新。
在分布式环境中进行高效训练需要调整超参数。一个常见的例子是在多个GPU上进行训练时,将批次(或小批次)大小乘以GPU数量,以保持每个GPU的相同批次大小。然而,调整超参数通常会影响模型的收敛性。因此,分布式训练需要平衡三个因素:分布、超参数和模型准确性。
在本文中,我们将探讨分布式训练对收敛性的影响,以及如何使用亚马逊SageMaker自动模型调整来优化使用数据并行进行分布式训练的模型超参数。
本文中提到的源代码可以在GitHub存储库中找到(推荐使用m5.xlarge实例)。
从单一环境扩展到分布式环境的训练
数据并行是一种将训练过程扩展到多个计算资源并实现更快训练时间的方式。使用数据并行,数据被划分到计算节点之间,每个节点根据其划分计算梯度并更新模型。这些更新可以使用一个或多个参数服务器以异步、一对多或全对全的方式进行。另一种方式是使用AllReduce算法。例如,在环形全局归约算法中,每个节点仅与其相邻节点通信,从而减少总体数据传输量。要了解更多关于参数服务器和环形全局归约的信息,请参阅使用Horovod轻松启动TensorFlow分布式训练或亚马逊SageMaker中的参数服务器。关于数据划分,如果有n个计算节点,则每个节点应该得到数据的一个子集,大约为1/n的大小。
为了演示扩展训练对模型收敛性的影响,我们进行了两个简单的实验:
- 使用MXNet和Gluon框架训练一个使用全连接层DNN和ReLU激活函数的图像分类模型。对于训练数据,我们使用了手写数字的MNIST数据集。我们使用SageMaker示例存储库中提供的源代码。
- 使用SageMaker内置的XGBoost算法训练一个二元分类模型。我们使用直接营销数据集来预测可能会对特定优惠方案做出回应的银行客户。源代码和重现实验的步骤可以在GitHub存储库中找到。
每个模型训练运行了两次:在单个实例上和分布在多个实例上。对于DNN分布式训练,为了充分利用分布式处理器,我们将小批次大小乘以实例数(四个)。下表总结了设置和结果。
问题类型 | 图像分类 | 二元分类 | ||
模型 | DNN | XGBoost | ||
|
ml.c4.xlarge | ml.m5.2xlarge | ||
数据集 |
MNIST (带标签的图像) |
直接营销(表格、数值和向量化类别) | ||
|
准确率 | AUC | ||
迭代轮数 | 20 | 150 | ||
实例数量 | 1 | 4 | 1 | 3 |
分布类型 | N/A | 参数服务器 | N/A | AllReduce |
训练时间(分钟) | 8 | 3 | 3 | 1 |
最终验证得分 | 0.97 | 0.11 | 0.78 | 0.63 |
对于这两个模型,训练时间几乎线性地减少了。然而,模型的收敛性却明显下降。这种行为在不同的模型、不同的计算实例、不同的分布方法和不同的数据类型下都是一致的。那么,为什么分布式训练过程会影响模型的准确性呢?
有一些理论试图解释这种影响:
- 当张量更新的大小较大时,工作节点和参数服务器之间的通信可能会拥塞。因此,异步参数服务器由于权重更新的延迟而导致收敛性明显变差[1]。
- 增加批量大小可能导致过拟合和泛化能力较差,从而降低验证准确性[2]。
- 当异步更新模型参数时,某些深度神经网络可能没有使用最新更新的模型权重;因此,它们将根据几次迭代之前的权重计算梯度。这会导致权重陈旧[3],可能由多种原因引起。
- 某些超参数是模型或优化器特定的。例如,XGBoost官方文档表示,
tree_mode
超参数的exact
值不支持分布式训练,因为XGBoost采用了行分割数据分布,而exact
树方法则适用于排序的列格式。 - 一些研究人员提出,配置更大的小批量可能导致梯度的随机性较小。当损失函数包含局部最小值和鞍点,并且步长没有改变时,优化器可能会陷入这些局部最小值或鞍点[4]。
为分布式训练进行优化
超参数优化(HPO)是搜索和选择一组最适合学习算法的超参数的过程。SageMaker自动模型调优(AMT)通过在提供的数据集上运行多个训练作业,提供了作为托管服务的HPO。SageMaker AMT搜索您指定的超参数范围,并返回根据您选择的指标进行测量的最佳值。您可以使用SageMaker AMT与内置算法一起使用,也可以使用自定义算法和容器。
然而,为分布式训练进行优化与常规的HPO不同,因为每个作业不是启动单个实例,而是启动一个实例集群。这意味着对成本的更大影响(特别是如果考虑到昂贵的GPU加速实例,这对于DNN来说是常见的)。除了AMT的限制外,您还可能遇到SageMaker账户对并发训练实例数量的限制。最后,启动集群可能会引入操作开销,因为启动时间会更长。SageMaker AMT具有专门的功能来解决这些问题。采用早停的Hyperband算法可以确保性能良好的超参数配置进行微调,并自动停止表现不佳的配置。这样可以高效利用训练时间并减少不必要的成本。此外,SageMaker AMT完全支持使用Amazon EC2 Spot Instances,可将训练成本优化高达90%,超过按需实例的成本。至于长时间启动,SageMaker AMT会自动在每个调优作业中重新使用训练实例,从而将每个训练作业的平均启动时间缩短20倍。此外,您应该遵循AMT的最佳实践,例如选择相关的超参数、适当的范围和比例、最佳的并发训练作业数量以及设置随机种子以重现结果。
在下一节中,我们将看到这些特性在一个使用我们之前讨论的XGBoost示例的AMT作业中如何配置、运行和分析。
配置、运行和分析调优作业
如前所述,源代码可以在GitHub存储库中找到。在步骤1-5中,我们下载和准备数据,创建xgb3
估算器(分布式XGBoost估算器设置为使用三个实例),运行训练作业并观察结果。在本节中,我们将介绍如何为该估算器设置调优作业,假设您已经完成了步骤1-5。
调优作业通过使用指标评估性能来计算启动的训练作业的最佳超参数。您可以配置自己的指标,SageMaker会根据您配置的正则表达式解析并发出到stdout
,或者使用SageMaker内置算法的指标。在本例中,我们使用内置的XGBoost目标指标,因此不需要配置正则表达式。为了优化模型的收敛性,我们基于验证AUC指标进行优化:
objective_metric_name="validation:auc"
我们调整了七个超参数:
- num_round – 训练期间增强的回合数。
- eta – 在更新中使用的步长缩减,以防止过拟合。
- alpha – 权重的L1正则化项。
- min_child_weight – 子节点中所需的实例权重(海森)之和的最小值。如果树分割步骤导致叶节点的实例权重之和小于
min_child_weight
,则建模过程停止进一步分割。 - max_depth – 树的最大深度。
- 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),
}
接下来,我们使用SageMaker SDK提供Hyperband策略和调谐器对象配置的配置。 HyperbandStrategyConfig
可以使用两个参数:max_resource
(可选)用于在训练作业中使用的最大迭代次数以达到目标,以及 min_resource
– 在停止训练之前由训练作业使用的最小迭代次数。我们使用 HyperbandStrategyConfig
配置 StrategyConfig
,后者随后由调谐作业定义使用。请参见以下代码:
hsc = HyperbandStrategyConfig(max_resource=30, min_resource=1)
sc = StrategyConfig(hyperband_strategy_config=hsc)
现在,我们创建一个 HyperparameterTuner
对象,向其传递以下信息:
- XGBoost 评估器,设置为使用三个实例运行
- 目标指标名称和定义
- 我们的超参数范围
- 调谐资源配置,例如要运行的总训练作业数以及可以并行运行的训练作业数
- Hyperband 设置(我们在上一步中配置的策略和配置)
- 早期停止(
early_stopping_type
)设置为Off
为什么我们将早期停止设置为Off?当训练作业不太可能改善超参数调谐作业的目标指标时,可以提前停止训练作业。这可以帮助减少计算时间并避免过拟合模型。然而,Hyperband 使用先进的内置机制应用早期停止。因此,使用 Hyperband 内部早期停止功能时,参数 early_stopping_type
必须设置为 Off
。请参见以下代码:
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 方法启动自动模型调谐作业。如果您想以异步方式启动作业,请将 wait
设置为 False
。请参见以下代码:
tuner.fit(
{"train": s3_input_train, "validation": s3_input_validation},
include_cls_metadata=False,
wait=True,
)
您可以在 SageMaker 控制台上跟踪作业进度和摘要。在导航窗格中,选择 Training,然后选择 Hyperparameter tuning jobs,再选择相关的调谐作业。以下屏幕截图显示了具有有关训练作业状态和性能的调谐作业的详细信息。
调参作业完成后,我们可以查看结果。在笔记本示例中,我们展示了如何使用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方法来获取有关调参作业的结果,并将其读入Pandas数据框进行分析和可视化:
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个作业 * 每个作业1分钟 * 每个作业3个实例)。这在成本节约方面有三倍的改进!最后,我们看到调参作业运行了30个训练作业,并总共耗时12分钟。这几乎比预期时间少了50%(30个作业/4个并行作业 * 每个作业3分钟)。
结论
在本文中,我们描述了在分布式环境中训练模型时遇到的一些收敛问题。我们看到SageMaker AMT使用Hyperband解决了优化数据并行分布式训练引入的主要问题:收敛性(提高了10%以上)、操作效率(调参作业所需时间比顺序非优化作业少了50%)和成本效率(调参作业所需训练时间为30分钟,而预期为90分钟)。以下表格总结了我们的结果:
改进指标 | 无调参/Naive模型调参实现 | SageMaker Hyperband自动模型调参 | 测量改进 |
模型质量(通过验证AUC测量) | 0.63 | 0.78 | 15% |
成本(通过计费训练分钟数测量) | 90 | 30 | 66% |
操作效率(通过总运行时间测量) | 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)。