使用 Amazon SageMaker Experiments 和 Amazon SageMaker Pipelines PlatoBlockchain Data Intelligence 组织您的机器学习之旅。 垂直搜索。 哎。

使用 Amazon SageMaker Experiments 和 Amazon SageMaker Pipelines 组织您的机器学习之旅

构建机器学习 (ML) 模型的过程是迭代的,直到您找到性能良好且可以部署的候选模型。 随着数据科学家迭代该过程,他们需要一种可靠的方法来轻松跟踪实验,以了解每个模型版本是如何构建的以及它是如何执行的。

亚马逊SageMaker 允许团队利用广泛的功能来快速准备、构建、训练、部署和监控 ML 模型。 Amazon SageMaker管道 为迭代模型构建活动提供了一个可重复的过程,并与 Amazon SageMaker实验. 默认情况下,每个 SageMaker 管道都与一个实验相关联,并且该管道的每次运行都作为该实验中的试验进行跟踪。 然后您的迭代将被自动跟踪,无需任何额外步骤。

在这篇文章中,我们将仔细研究使用 Experiments 和内置于 Pipelines 中的本机功能来跟踪实验的自动化过程背后的动机。

为什么保持实验井井有条很重要?

让我们退后一步,尝试理解为什么为机器学习组织实验很重要。 当数据科学家处理新的 ML 问题时,他们必须回答许多不同的问题,从数据可用性到如何衡量模型性能。

一开始,这个过程充满了不确定性并且是高度迭代的。 因此,这个实验阶段可以生成多个模型,每个模型都从自己的输入(数据集、训练脚本和超参数)创建,并产生自己的输出(模型工件和评估指标)。 接下来的挑战是跟踪每次迭代的所有这些输入和输出。

数据科学家通常会训练许多不同的模型版本,直到他们找到数据转换、算法和超参数的组合,从而产生最佳性能的模型版本。 这些独特的组合中的每一个都是一个实验。 通过该试验使用的输入、算法和超参数的可追溯记录,数据科学团队可以轻松地重现他们的步骤。

采用自动化流程来跟踪实验可以提高重现和部署性能良好的特定模型版本的能力。 Pipelines 与 Experiments 的原生集成使得跨管道运行自动跟踪和管理实验变得容易。

SageMaker 实验的好处

SageMaker Experiments 允许数据科学家组织、跟踪、比较和评估他们的训练迭代。

让我们首先概述一下您可以使用 Experiments 做什么:

  • 组织实验—— Experiments 使用称为 an 的顶级实体构建实验 实验 包含一组 试验. 每个试验都包含一组步骤,称为 试用组件. 每个试验组件都是数据集、算法和参数的组合。 您可以将实验描述为用于组织假设的顶级文件夹,将试验描述为每个组测试运行的子文件夹,将试验组件描述为每个测试运行实例的文件。
  • 跟踪实验—— 实验允许数据科学家跟踪实验。 它提供了通过简单配置和跟踪 SDK 将 SageMaker 作业自动分配给试用版的可能性。
  • 比较和评估实验—— 实验与整合 亚马逊SageMaker Studio 使生成数据可视化和比较不同试验变得容易。 您还可以通过 Python SDK 访问试验数据,以使用您喜欢的绘图库生成您自己的可视化。

要了解有关 Experiments API 和 SDK 的更多信息,我们推荐以下文档: 创建实验Amazon SageMaker 实验 Python 开发工具包。

如果您想深入了解,我们建议您查看 amazon-sagemaker-examples/sagemaker-experiments GitHub 存储库 进一步的例子。

管道和实验之间的集成

作为 Pipelines 一部分的模型构建管道专为 ML 构建,允许您使用管道工具编排模型构建任务,该工具包括与其他 SageMaker 功能的本机集成,以及通过在 SageMaker 外部运行的步骤来扩展管道的灵活性. 每个步骤都定义了管道采取的操作。 步骤之间的依赖关系由使用 Pipelines Python SDK 构建的直接无环图 (DAG) 定义。 您可以通过相同的 SDK 以编程方式构建 SageMaker 管道。 部署管道后,您可以选择在 Studio 中可视化其工作流。

通过为每次运行自动创建实验和试验,管道自动与实验集成。 除非指定了这些输入中的一个或两个,否则在运行这些步骤之前,管道会自动为管道的每次运行创建一个试验和试验。 在运行管道的 SageMaker 作业时,管道将试验与试验相关联,并将作业创建的每个试验组件与试验相关联。 以编程方式指定您自己的实验或试验允许您微调如何组织您的实验。

我们在此示例中展示的工作流程包括一系列步骤:将输入数据集拆分为训练、测试和验证数据集的预处理步骤; 调整我们的超参数并开始训练工作以使用 XGBoost 内置算法; 最后是从经过最佳训练的模型工件创建 SageMaker 模型的模型步骤。 Pipelines 还提供了几个本机支持的 步骤类型 在这篇文章中讨论的内容之外。 我们还说明了如何跟踪您的管道工作流程并生成指标和比较图表。 此外,我们展示了如何将生成的新试验与可能在定义管道之前创建的现有试验相关联。

SageMaker 管道代码

您可以从 GitHub存储库 与这篇文章相关联。 我们查看管道特定的代码以更好地理解它。

管道使您能够在运行时传递参数。 在这里,我们使用预设默认值在运行时定义处理和训练实例类型和计数:

base_job_prefix = "pipeline-experiment-sample"
model_package_group_name = "pipeline-experiment-model-package"

processing_instance_count = ParameterInteger(
  name="ProcessingInstanceCount", default_value=1
)

training_instance_count = ParameterInteger(
  name="TrainingInstanceCount", default_value=1
)

processing_instance_type = ParameterString(
  name="ProcessingInstanceType", default_value="ml.m5.xlarge"
)
training_instance_type = ParameterString(
  name="TrainingInstanceType", default_value="ml.m5.xlarge"
)

接下来,我们设置一个处理脚本,下载输入数据集并将其拆分为训练、测试和验证部分。 我们用 SKLearnProcessor 用于运行此预处理步骤。 为此,我们定义了一个处理器对象,其中包含运行处理作业所需的实例类型和计数。

管道允许我们通过使用特定于执行的变量以编程方式实现数据版本控制,例如 ExecutionVariables.PIPELINE_EXECUTION_ID,这是管道运行的唯一 ID。 例如,我们可以创建一个唯一键来将输出数据集存储在 亚马逊简单存储服务 (Amazon S3) 将它们与特定的管道运行联系起来。 有关变量的完整列表,请参阅 执行变量.

framework_version = "0.23-1"

sklearn_processor = SKLearnProcessor(
    framework_version=framework_version,
    instance_type=processing_instance_type,
    instance_count=processing_instance_count,
    base_job_name="sklearn-ca-housing",
    role=role,
)

process_step = ProcessingStep(
    name="ca-housing-preprocessing",
    processor=sklearn_processor,
    outputs=[
        ProcessingOutput(
            output_name="train",
            source="/opt/ml/processing/train",
            destination=Join(
                on="/",
                values=[
                    "s3://{}".format(bucket),
                    prefix,
                    ExecutionVariables.PIPELINE_EXECUTION_ID,
                    "train",
                ],
            ),
        ),
        ProcessingOutput(
            output_name="validation",
            source="/opt/ml/processing/validation",
            destination=Join(
                on="/",
                values=[
                    "s3://{}".format(bucket),
                    prefix,
                    ExecutionVariables.PIPELINE_EXECUTION_ID,
                    "validation",
                ],
            )
        ),
        ProcessingOutput(
            output_name="test",
            source="/opt/ml/processing/test",
            destination=Join(
                on="/",
                values=[
                    "s3://{}".format(bucket),
                    prefix,
                    ExecutionVariables.PIPELINE_EXECUTION_ID,
                    "test",
                ],
            )
        ),
    ],
    code="california-housing-preprocessing.py",
)

然后我们继续创建一个估计器对象来训练一个 XGBoost 模型。 我们设置了一些 XGBoost 常用的静态超参数:

model_path = f"s3://{default_bucket}/{base_job_prefix}/ca-housing-experiment-pipeline"

image_uri = sagemaker.image_uris.retrieve(
    framework="xgboost",
    region=region,
    version="1.2-2",
    py_version="py3",
    instance_type=training_instance_type,
)

xgb_train = Estimator(
    image_uri=image_uri,
    instance_type=training_instance_type,
    instance_count=training_instance_count,
    output_path=model_path,
    base_job_name=f"{base_job_prefix}/ca-housing-train",
    sagemaker_session=sagemaker_session,
    role=role,
)

xgb_train.set_hyperparameters(
    eval_metric="rmse",
    objective="reg:squarederror",  # Define the object metric for the training job
    num_round=50,
    max_depth=5,
    eta=0.2,
    gamma=4,
    min_child_weight=6,
    subsample=0.7
)

我们通过使用 ContinuousParameter 范围 lambda. 选择一个指标作为目标指标会告诉调优器(运行超参数调优作业的实例)您将根据此特定指标评估训练作业。 调谐器根据此客观指标的最佳值返回最佳组合,这意味着最小化最佳均方根误差 (RMSE) 的最佳组合。

objective_metric_name = "validation:rmse"

hyperparameter_ranges = {
    "lambda": ContinuousParameter(0.01, 10, scaling_type="Logarithmic")
}

tuner = HyperparameterTuner(estimator,
                            objective_metric_name,
                            hyperparameter_ranges,
                            objective_type=objective_type,
                            strategy="Bayesian",
                            max_jobs=10,
                            max_parallel_jobs=3)

tune_step = TuningStep(
    name="HPTuning",
    tuner=tuner_log,
    inputs={
        "train": TrainingInput(
            s3_data=process_step.properties.ProcessingOutputConfig.Outputs[
                "train"
            ].S3Output.S3Uri,
            content_type="text/csv",
        ),
        "validation": TrainingInput(
            s3_data=process_step.properties.ProcessingOutputConfig.Outputs[
                "validation"
            ].S3Output.S3Uri,
            content_type="text/csv",
        ),
    } 
)

调整步骤运行多次试验,目的是在测试的参数范围内确定最佳模型。 用方法 get_top_model_s3_uri,我们对模型工件 S50 URI 的前 3 个性能版本进行排名,并且只提取性能最好的版本(我们指定 k=0 最好)来创建 SageMaker 模型。

model_bucket_key = f"{default_bucket}/{base_job_prefix}/ca-housing-experiment-pipeline"
model_candidate = Model(
    image_uri=image_uri,
    model_data=tune_step.get_top_model_s3_uri(top_k=0, s3_bucket=model_bucket_key),
    sagemaker_session=sagemaker_session,
    role=role,
    predictor_cls=XGBoostPredictor,
)

create_model_step = CreateModelStep(
    name="CreateTopModel",
    model=model_candidate,
    inputs=sagemaker.inputs.CreateModelInput(instance_type="ml.m4.large"),
)

当管道运行时,它会为每个超参数调整作业和管道步骤创建的每个 SageMaker 作业创建试用组件。

您可以通过创建一个进一步配置管道与实验的集成 PipelineExperimentConfig 对象并将其传递给管道对象。 这两个参数定义了将要创建的试验的名称,以及将引用整个管道运行的试验。

如果您想将管道运行与现有试验相关联,您可以传递其名称,管道会将新试验与其相关联。 您可以通过设置来阻止为管道运行创建试验和试验 pipeline_experiment_configNone.

#Pipeline experiment config
ca_housing_experiment_config = PipelineExperimentConfig(
    experiment_name,
    Join(
        on="-",
        values=[
            "pipeline-execution",
            ExecutionVariables.PIPELINE_EXECUTION_ID
        ],
    )
)

我们将实例类型和计数作为参数传递,并按如下顺序链接前面的步骤。 管道工作流由一个步骤的输出作为另一个步骤的输入来隐式定义。

pipeline_name = f"CAHousingExperimentsPipeline"

pipeline = Pipeline(
    name=pipeline_name,
    pipeline_experiment_config=ca_housing_experiment_config,
    parameters=[
        processing_instance_count,
        processing_instance_type,
        training_instance_count,
        training_instance_type
    ],
    steps=[process_step,tune_step,create_model_step],
)

成熟的管道现已创建并准备就绪。 我们将执行角色添加到管道并启动它。 从这里,我们可以转到 SageMaker Studio Pipelines 控制台并直观地跟踪每一步。 您还可以从控制台访问链接的日志以调试管道。

pipeline.upsert(role_arn=sagemaker.get_execution_role())
execution = pipeline.start()

前面的屏幕截图以绿色显示成功运行的管道。 我们使用以下代码从管道运行中获取一次试验的指标:

# SM Pipeline injects the Execution ID into trial component names
execution_id = execution.describe()['PipelineExecutionArn'].split('/')[-1]
source_arn_filter = Filter(
    name="TrialComponentName", operator=Operator.CONTAINS, value=execution_id
)

source_type_filter = Filter(
    name="Source.SourceType", operator=Operator.EQUALS, value="SageMakerTrainingJob"
)

search_expression = SearchExpression(
    filters=[source_arn_filter, source_type_filter]
)

trial_component_analytics = ExperimentAnalytics(
    sagemaker_session=sagemaker_session,
    experiment_name=experiment_name,
    search_expression=search_expression.to_boto()
)

analytic_table = trial_component_analytics.dataframe()
analytic_table.head()

比较每个试验组件的指标

您可以在 Studio 中或通过其他 Python 绘图库绘制超参数调整的结果。 我们展示了这两种方法。

探索 Studio 中的训练和评估指标

Studio 提供了一个交互式用户界面,您可以在其中生成交互式绘图。 步骤如下:

  1. 实验和试验 来自 SageMaker资源 左侧边栏上的图标。
  2. 选择您的实验以打开它。
  3. 选择(右键单击)感兴趣的试验。
  4. 在试用组件列表中打开.
  5. 媒体 转移 选择代表训练作业的试验组件。
  6. 添加图表.
  7. 新图表 并对其进行自定义以绘制要分析的收集指标。 对于我们的用例,请选择以下内容:
    1. 针对 数据类型选择 汇总统计.
    2. 针对 图表类型选择 散点图.
    3. 针对 X轴,选择 lambda.
    4. 针对 Y轴,选择 validation:rmse_last.

新图表出现在窗口底部,标记为“8”。

您可以通过按来包含更多或更少的培训作业 转移 并选择眼睛图标以获得更具交互性的体验。

使用 Amazon SageMaker Experiments 和 Amazon SageMaker Pipelines PlatoBlockchain Data Intelligence 组织您的机器学习之旅。 垂直搜索。 哎。

使用 SageMaker Experiments 进行分析

管道运行完成后,我们可以快速可视化模型的不同变体在训练期间收集的指标方面的比较情况。 之前,我们将所有试验指标导出到 熊猫 DataFrame 运用 ExperimentAnalytics. 我们可以使用 Matplotlib 库重现 Studio 中获得的绘图。

analytic_table.plot.scatter("lambda", "validation:rmse - Last", grid=True)

结论

SageMaker Pipelines 和 SageMaker Experiments 之间的原生集成允许数据科学家在模型开发活动期间自动组织、跟踪和可视化实验。 您可以创建实验来组织所有模型开发工作,例如:

  • 您正在处理的业务用例,例如创建一个预测客户流失的实验
  • 例如,数据科学团队拥有的关于营销分析的实验
  • 特定的数据科学和机器学习项目

在这篇文章中,我们深入研究了 Pipelines,以展示如何将它与 Experiments 结合使用,以组织一个完全自动化的端到端工作流程。

下一步,您可以将这三个 SageMaker 功能 - Studio、Experiments 和 Pipelines - 用于您的下一个 ML 项目。

建议读物


关于作者

保罗·迪·弗朗切斯科保罗·迪·弗朗切斯科 是 AWS 的解决方案架构师。 他在电信和软件工程方面拥有丰富的经验。 他对机器学习充满热情,目前专注于利用他的经验帮助客户在 AWS 上实现目标,特别是在围绕 MLOps 的讨论中。 工作之余,他喜欢踢足球和阅读。

使用 Amazon SageMaker Experiments 和 Amazon SageMaker Pipelines PlatoBlockchain Data Intelligence 组织您的机器学习之旅。 垂直搜索。 哎。马里奥·布尔根 是 AWS 的高级合作伙伴解决方案架构师、AI/ML 专家和 MLOps 的全球技术主管。 他与企业客户和合作伙伴一起在云端部署人工智能解决方案。 他在初创公司和企业中拥有 30 多年从事机器学习和人工智能的经验,从创建第一个用于大数据的商业机器学习系统开始。 马里奥在空闲时间与他的三个比利时 Tervurens 一起玩耍,为家人做饭,学习数学和宇宙学。

使用 Amazon SageMaker Experiments 和 Amazon SageMaker Pipelines PlatoBlockchain Data Intelligence 组织您的机器学习之旅。 垂直搜索。 哎。加纳帕提·克里希纳穆尔提 是 AWS 的高级 ML 解决方案架构师。 Ganathi 为初创企业和企业客户提供规范性指导,帮助他们大规模设计和部署云应用程序。 他专攻机器学习,专注于帮助客户利用 AI/ML 实现业务成果。 工作之余,他喜欢在户外探索和听音乐。

使用 Amazon SageMaker Experiments 和 Amazon SageMaker Pipelines PlatoBlockchain Data Intelligence 组织您的机器学习之旅。 垂直搜索。 哎。瓦莱丽·松萨基思 是 AWS 的解决方案架构师,在游戏行业工作,并与合作伙伴一起部署 AI 解决方案。 她的目标是围绕计算机视觉建立自己的职业生涯。 在她的空闲时间,瓦莱丽花时间去旅行,发现新的美食地点并改变她的房子内部。

时间戳记:

更多来自 AWS机器学习