本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为一个或多个算法创建超参数优化调优作业(控制台)
本指南介绍如何为一个或多个算法创建新的超参数优化 (HPO) 调整作业。要创建HPO作业,请定义调整作业的设置,并为正在调整的每种算法创建训练作业定义。接下来,为调优作业配置资源并创建调优作业。以下各部分提供了有关如何完成每个步骤的详细信息。我们举了一个示例,说明如何使用调整多种算法 SageMaker SDK for Python 本指南末尾的客户。
调优作业的组件
HPO调优作业包含以下三个组成部分:
-
调优作业设置
-
训练作业定义
-
调优作业配置
调整作业中包含这些组件的方式取决于您的HPO调优作业是包含一个还是多个训练算法。以下指南描述了每个组件,并列举了两种调优作业类型的示例。
您的调优任务设置将应用于HPO调优作业中的所有算法。热启动和提前停止仅当调整单个算法时才可用。定义作业设置后,可以为要调整的每个算法或变体创建单独的训练定义。
热启动
如果克隆了此作业,那么可以使用先前的调优作业结果,提高新的调优作业的性能。这便是热启动功能,仅用于调整单个算法时。如果选择热启动选项,那么最多可以选择使用五个先前的超参数调优作业。或者,可以使用迁移学习将其他数据添加到父调优作业中。选择此选项时,您可以选择以前的一个调优作业作为父作业。
注意
热启动仅与 2018 年 10 月 1 日之后创建的调优作业兼容。有关更多信息,请参阅运行热启动作业。
提前停止
为减少计算时间并避免模型过度拟合,可以提前停止训练作业。如果训练作业不太可能改进超参数调优作业当前的最佳目标指标,那么提前停止是有帮助的。与热启动一样,此功能仅用于调整单个算法时。这是一项无配置选项的自动功能,默认为禁用状态。有关提前停止的工作原理、支持早期停止的算法以及如何将此功能与您自己的算法结合使用的更多信息,请参阅提前停止训练作业。
调优策略
调整策略可以是随机、贝叶斯或 Hyperband。 这些选择指定了自动调整算法如何搜索在后续步骤中选择的指定超参数范围。随机搜索从指定范围中选择值的随机组合,并且可以依次运行或并行运行。根据先前选择的已知历史记录,贝叶斯优化根据可能获得最佳结果的值来选择值。Hyperband 使用多保真度策略,将资源动态分配给利用率较高的作业,并自动停止那些表现不佳的任务。在停止其他配置后启动的新配置是随机选择的。
Hyperband 只能与迭代算法或在迭代中运行步骤的算法一起使用,例如 XGBoost或随机砍伐森林。Hyperband 不能与非迭代算法一起使用,例如决策树或 K 最近邻居。有关搜索策略的更多信息,请参阅超参数调优的工作原理。
注意
Hyperband 使用先进的内部机制来应用提前停止。因此,当你使用 Hyperband 内部提前停止功能,TrainingJobEarlyStoppingType
中的参数HyperParameterTuningJobConfig
API必须设置为OFF
。
标签
为帮助管理调优作业,您可以将标签作为键值对输入,以便将元数据分配给调优作业。键值对中的值不是必需的。您可以使用不带值的键。要查看与作业关联的键,可在调优作业的详细信息页面上,选择标签选项卡。有关将标签用于调优作业的更多信息,请参阅管理超参数调优和训练作业。
要创建训练作业定义,您必须配置算法和参数、定义数据输入和输出并配置资源。为每项HPO调优作业提供至少一个TrainingJobDefinition
。每个训练定义都指定算法的配置。
要为训练作业创建多个定义,您可以克隆作业定义。克隆作业可以节省时间,因为它会复制所有的作业设置,包括数据通道和输出构件的 Amazon S3 存储位置。您可以编辑克隆的作业,根据使用案例需要进行更改。
配置算法和参数
以下列表描述了为每个训练作业配置超参数值集所需的内容。
-
调优作业的名称
-
访问服务的权限
-
任何算法选项的参数
-
目标指标
-
超参数值的范围(如果需要)
名称
为训练定义提供唯一名称。
权限
Amazon SageMaker 需要代表您拨打其他服务的权限。选择一个 AWS Identity and Access Management (IAM) 角色,或者让我们 AWS 创建一个附加AmazonSageMakerFullAccess
IAM策略的角色。
可选的安全设置
网络隔离设置可防止容器进行任何出站网络调用。这是 AWS Marketplace 机器学习产品所必需的。
您也可以选择使用虚拟私有云 (VPC)。
注意
仅当您从中创建任务定义时,容器间加密才可用。API
算法选项
您可以选择内置算法、您自己的算法、您自己的带算法的容器,也可以从 AWS Marketplace订阅算法。
-
如果您选择内置算法,则会预先填充亚马逊弹性容器注册表 (AmazonECR) 的图像信息。
-
如果您选择自己的容器,则必须指定(AmazonECR)的图片信息。 您可以将算法的输入模式选择为文件或管道。
-
如果您计划使用 Amazon S3 中的CSV文件提供数据,则应选择该文件。
指标
如果选择内置算法,系统会为您提供指标。如果您选择自己的算法,则必须定义指标。您可为调优作业定义最多 20 个要监控的指标。必须选择一个指标作为目标指标。有关如何为调优作业定义指标的更多信息,请参阅定义指标。
目标指标
要找到最佳训练作业,可设置目标指标,以及是最大化还是最小化。训练作业完成后,可以查看调优作业详细信息页面。详细信息页面汇总了使用此目标指标找到的最佳训练作业。
超参数配置
如果选择内置算法,则将使用针对要调整的算法进行了优化的范围,为您设置其超参数的默认值。您可以根据您认为合适的情况更改这些值。例如,您可以通过将参数类型设置为静态来为超参数设置固定值,而不是范围。每个算法都有不同的必需参数和可选参数。有关更多信息,请参阅超参数调优最佳实践和定义超参数范围。
定义数据输入和输出
调优作业的每个训练作业定义必须为每个训练作业配置数据输入通道、数据输出位置,以及任何检查点存储位置(可选)。
输入数据配置
输入数据由通道定义。每个通道有自己的源位置(Amazon S3 或 Amazon Elastic File System)、压缩和格式选项。最多可以定义 20 个输入源通道。如果您选择的算法支持多个输入通道,您也可以指定这些通道。例如,当你使用 XGBoost 流失预测笔记本
检查点配置
在训练期间定期生成检查点。对于要保存的检查点,必须选择 Amazon S3 位置。检查点用于指标报告,还用于恢复托管的竞价型训练作业。有关更多信息,请参阅 Amazon 中的检查点 SageMaker。
输出数据配置
为要存储的训练作业构件定义 Amazon S3 位置。您可以选择使用 AWS Key Management Service (AWS KMS) 密钥为输出添加加密。
配置训练作业资源
调优作业的每个训练作业定义必须配置要部署的资源,包括实例类型和计数、托管的竞价型训练和停止条件。
资源配置
每个训练定义可以有不同的资源配置。您可以选择实例类型和节点数。
托管的竞价型训练
如果您允许使用剩余容量来运行作业,从而在开始和结束时间方面具有灵活性 SageMaker ,则可以节省作业的计算机成本。有关更多信息,请参阅 Amazon 中的托管竞技训练 SageMaker。
停止条件
停止条件指定了每个训练作业允许的最长持续时间。
添加或克隆训练作业
为调优作业创建训练作业定义后,您将返回到训练作业定义面板。在此面板中,您可以创建其他训练作业定义以训练其他算法。您可以选择添加训练作业定义,然后按照步骤再次定义训练作业。
或者,如果要复制现有的训练作业定义,并根据新算法进行编辑,可从操作菜单中选择克隆。克隆选项可以节省时间,因为它会复制作业的所有设置,包括数据通道和 Amazon S3 存储位置。有关克隆的更多信息,请参阅管理超参数调优和训练作业。
资源限制
您可以指定超参数调优作业可以同时运行的最大并发训练作业数(最多 10 个)。还可以指定超参数调优作业可以运行的最大训练作业数(最多 500 个)。并行作业数不应超过您在所有训练定义中请求的节点数。作业总数不能超过您的定义预期运行的作业数。
查看作业设置、训练作业定义和资源限制。然后选择创建超参数调优作业。
HPO调优作业示例
要运行超参数优化 (HPO) 训练作业,请先为每个正在调整的算法创建一个训练作业定义。接下来,定义调优作业设置并配置调优作业的资源。最后,运行调优作业。
如果您的HPO调优作业包含单个训练算法,则 SageMaker 调整函数将HyperparameterTuner
API直接调用并传入您的参数。如果您的HPO调优作业包含多个训练算法,则您的调优函数将调用的create
函数HyperparameterTuner
API。该create
函数告诉API期待一个包含一个或多个估计器的字典。
在下一节中,代码示例展示了如何使用以下方法调整包含单个训练算法或多个算法的作业 SageMaker Python SDK.
创建训练作业定义
您在创建包含多个训练算法的调优作业时,调优作业配置将包括训练作业的评估程序和指标以及其他参数。因此,您需要先创建训练作业定义,然后再配置调优作业。
以下代码示例显示如何检索两个包含内置算法的 SageMaker 容器 XGBoost 和 Linear Learner。 如果您的调优作业仅包含一种训练算法,则省略其中一个容器和一个估计器。
import sagemaker from sagemaker import image_uris from sagemaker.estimator import Estimator sess = sagemaker.Session() region = sess.boto_region_name role = sagemaker.get_execution_role() bucket = sess.default_bucket() prefix = "sagemaker/multi-algo-hpo" # Define the training containers and intialize the estimators xgb_container = image_uris.retrieve("xgboost", region, "latest") ll_container = image_uris.retrieve("linear-learner", region, "latest") xgb_estimator = Estimator( xgb_container, role=role, instance_count=1, instance_type="ml.m4.xlarge", output_path='s3://{}/{}/xgb_output".format(bucket, prefix)', sagemaker_session=sess, ) ll_estimator = Estimator( ll_container, role, instance_count=1, instance_type="ml.c4.xlarge", output_path="s3://{}/{}/ll_output".format(bucket, prefix), sagemaker_session=sess, ) # Set static hyperparameters ll_estimator.set_hyperparameters(predictor_type="binary_classifier") xgb_estimator.set_hyperparameters( eval_metric="auc", objective="binary:logistic", num_round=100, rate_drop=0.3, tweedie_variance_power=1.4, )
接下来,通过指定训练、验证和测试数据集来定义输入数据,如以下代码示例中所示。此示例演示了如何调整多个训练算法。
training_data = sagemaker.inputs.TrainingInput( s3_data="s3://{}/{}/train".format(bucket, prefix), content_type="csv" ) validation_data = sagemaker.inputs.TrainingInput( s3_data="s3://{}/{}/validate".format(bucket, prefix), content_type="csv" ) test_data = sagemaker.inputs.TrainingInput( s3_data="s3://{}/{}/test".format(bucket, prefix), content_type="csv" ) train_inputs = { "estimator-1": { "train": training_data, "validation": validation_data, "test": test_data, }, "estimator-2": { "train": training_data, "validation": validation_data, "test": test_data, }, }
如果调优算法仅包含一个训练算法,则 train_inputs
应仅包含一个评估程序。
您必须先将训练、验证和训练数据集的输入上传到您的 Amazon S3 存储桶,然后才能在HPO调整作业中使用这些数据。
为调优作业定义资源和设置
本部分将介绍如何初始化调优程序、定义资源以及为调优作业指定作业设置。如果调优作业包含多个训练算法,则这些设置将应用于调优作业中包含的所有算法。本部分提供了两个定义调优程序的代码示例。代码示例将演示如何优化单个训练算法,其后是如何调整多个训练算法的示例。
调整单个训练算法
以下代码示例显示了如何初始化调谐器并为一个 SageMaker 内置算法设置超参数范围,XGBoost.
from sagemaker.tuner import HyperparameterTuner from sagemaker.parameter import ContinuousParameter, IntegerParameter hyperparameter_ranges = { "max_depth": IntegerParameter(1, 10), "eta": ContinuousParameter(0.1, 0.3), } objective_metric_name = "validation:accuracy" tuner = HyperparameterTuner( xgb_estimator, objective_metric_name, hyperparameter_ranges, objective_type="Maximize", max_jobs=5, max_parallel_jobs=2, )
调整多个训练算法
每个训练作业需要不同的配置,这些配置使用字典指定。以下代码示例显示了如何使用两个 SageMaker 内置算法的配置初始化调谐器,XGBoost 以及 Linear Learner。 该代码示例还展示了如何设置调整策略和其他作业设置,例如调优作业的计算资源。以下代码示例使用了 metric_definitions_dict
,这是一个可选项。
from sagemaker.tuner import HyperparameterTuner from sagemaker.parameter import ContinuousParameter, IntegerParameter # Initialize your tuner tuner = HyperparameterTuner.create( estimator_dict={ "estimator-1": xgb_estimator, "estimator-2": ll_estimator, }, objective_metric_name_dict={ "estimator-1": "validation:auc", "estimator-2": "test:binary_classification_accuracy", }, hyperparameter_ranges_dict={ "estimator-1": {"eta": ContinuousParameter(0.1, 0.3)}, "estimator-2": {"learning_rate": ContinuousParameter(0.1, 0.3)}, }, metric_definitions_dict={ "estimator-1": [ {"Name": "validation:auc", "Regex": "Overall test accuracy: (.*?);"} ], "estimator-2": [ { "Name": "test:binary_classification_accuracy", "Regex": "Overall test accuracy: (.*?);", } ], }, strategy="Bayesian", max_jobs=10, max_parallel_jobs=3, )
运行你的HPO调优作业
现在,您可以将训练输入传递给 HyperparameterTuner
类的 fit
函数,以运行调优作业。以下代码示例演示了如何将上个代码示例中定义的 train_inputs
参数传递给您的调优程序。
tuner.fit(inputs=train_inputs, include_cls_metadata ={}, estimator_kwargs ={})