使用 API 安排 Amazon SageMaker 笔记本作业并管理多步骤笔记本工作流程 | 亚马逊网络服务

使用 API 安排 Amazon SageMaker 笔记本作业并管理多步骤笔记本工作流程 | 亚马逊网络服务

源节点: 2985648

亚马逊SageMaker Studio 为数据科学家提供完全托管的解决方案,以交互方式构建、训练和部署机器学习 (ML) 模型。 Amazon SageMaker 笔记本职位 允许数据科学家只需在 SageMaker Studio 中点击几下即可按需或按计划运行他们的笔记本。 通过此次发布,您可以使用以下提供的 API 以编程方式将笔记本作为作业运行 Amazon SageMaker管道,ML工作流程编排功能 亚马逊SageMaker。 此外,您可以使用这些 API 创建具有多个相关笔记本的多步骤 ML 工作流程。

SageMaker Pipelines 是一种本机工作流程编排工具,用于构建利用直接 SageMaker 集成的 ML 管道。 每个 SageMaker 管道由以下部分组成 步骤,对应于单独的任务,例如使用处理、训练或数据处理 亚马逊电子病历。 SageMaker 笔记本作业现在可作为 SageMaker 管道中的内置步骤类型使用。 您可以使用此笔记本作业步骤轻松地将笔记本作为作业运行,只需使用几行代码即可 亚马逊SageMaker Python SDK。 此外,您可以将多个相关笔记本拼接在一起,以有向无环图 (DAG) 的形式创建工作流程。 然后,您可以运行这些笔记本作业或 DAG,并使用 SageMaker Studio 管理和可视化它们。

数据科学家目前使用 SageMaker Studio 以交互方式开发他们的 Jupyter 笔记本,然后使用 SageMaker 笔记本作业按计划作业运行这些笔记本。 这些作业可以立即运行或按循环时间表运行,而无需数据工作者将代码重构为 Python 模块。 执行此操作的一些常见用例包括:

  • 在后台运行长时间运行的笔记本
  • 定期运行模型推理以生成报告
  • 从准备小样本数据集扩展到处理 PB 级大数据
  • 以某种节奏重新训练和部署模型
  • 调度模型质量或数据漂移监控作业
  • 探索参数空间以获得更好的模型

尽管此功能使数据工作者可以轻松地自动化独立笔记本,但机器学习工作流程通常由多个笔记本组成,每个笔记本执行具有复杂依赖性的特定任务。 例如,监视模型数据漂移的笔记本应该有一个允许提取、转换和加载 (ETL) 以及处理新数据的前置步骤,以及在发现重大漂移时进行模型刷新和训练的后置步骤。 此外,数据科学家可能希望定期触发整个工作流程,以根据新数据更新模型。 为了使您能够轻松自动化笔记本并创建如此复杂的工作流程,SageMaker 笔记本作业现在作为 SageMaker Pipelines 中的一个步骤提供。 在这篇文章中,我们将展示如何使用几行代码解决以下用例:

  • 以编程方式立即或按定期计划运行独立笔记本
  • 将笔记本的多步骤工作流程创建为 DAG,以实现持续集成和持续交付 (CI/CD) 目的,并可通过 SageMaker Studio UI 进行管理

解决方案概述

下图展示了我们的解决方案架构。 您可以使用 SageMaker Python SDK 运行单个笔记本作业或工作流程。 此功能创建 SageMaker 训练作业来运行笔记本。

在以下部分中,我们将逐步介绍示例 ML 用例,并展示创建笔记本作业工作流程、在不同笔记本步骤之间传递参数、安排工作流程以及通过 SageMaker Studio 进行监控的步骤。

对于本例中的机器学习问题,我们正在构建情感分析模型,这是一种文本分类任务。 情绪分析最常见的应用包括社交媒体监控、客户支持管理和分析客户反馈。 本示例中使用的数据集是斯坦福情绪树库 (SST2) 数据集,其中包含电影评论以及指示评论的正面或负面情绪的整数(0 或 1)。

下面是一个例子 data.csv 文件对应于 SST2 数据集,并显示其前两列中的值。 请注意,该文件不应有任何标头。

列1 列2
0 向亲代单位隐藏新的分泌物
0 没有智慧,只有费力的笑点
1 热爱它的角色并传达人性中相当美丽的东西
0 仍然非常满意始终保持不变
0 电影制片人可以挖掘出最糟糕的书呆子复仇陈词滥调
0 这太悲惨了,不值得如此肤浅的对待
1 证明了《爱国者游戏》等好莱坞大片的导演仍然可以拍出一部带有情感冲击力的小型个人电影。

在此 ML 示例中,我们必须执行多项任务:

  1. 执行特征工程,以我们的模型可以理解的格式准备此数据集。
  2. 后功能工程,运行使用 Transformer 的训练步骤。
  3. 使用微调模型设置批量推理,以帮助预测新评论的情绪。
  4. 设置数据监控步骤,以便我们可以定期监控新数据的质量偏差,这可能需要我们重新训练模型权重。

通过将笔记本作业的启动作为 SageMaker 管道中的一个步骤,我们可以编排此工作流程,该工作流程由三个不同的步骤组成。 工作流程的每个步骤都在不同的笔记本中开发,然后转换为独立的笔记本作业步骤并作为管道连接:

  • 前处理 – 从以下位置下载公共 SST2 数据集 亚马逊简单存储服务 (Amazon S3) 并为步骤 2 中的笔记本创建一个 CSV 文件以供运行。 SST2 数据集是一个文本分类数据集,具有两个标签(0 和 1)和一列要分类的文本。
  • 产品培训 – 获取成形的 CSV 文件并使用 BERT 进行微调,以利用 Transformers 库进行文本分类。 我们使用测试数据准备笔记本作为此步骤的一部分,这是微调和批量推理步骤的依赖项。 微调完成后,该笔记本将使用 run magic 运行,并准备一个测试数据集,用于使用微调模型进行样本推理。
  • 转换和监控 – 执行批量推理并通过模型监控设置数据质量,以获得基线数据集建议。

运行笔记本

该解决方案的示例代码可在 GitHub上.

创建 SageMaker 笔记本作业步骤与创建其他 SageMaker Pipeline 步骤类似。 在此笔记本示例中,我们使用 SageMaker Python SDK 来编排工作流程。 要在 SageMaker Pipelines 中创建笔记本步骤,您可以定义以下参数:

  • 输入笔记本 – 此笔记本步骤将编排的笔记本的名称。 在这里您可以传入输入笔记本的本地路径。 或者,如果此笔记本正在运行其他笔记本,您可以将它们传递到 AdditionalDependencies 笔记本作业步骤的参数。
  • 图片URI – 笔记本作业步骤背后的 Docker 映像。 这可以是 SageMaker 已提供的预定义映像,也可以是您已定义并推送到的自定义映像 Amazon Elastic Container注册 (亚马逊 ECR)。 有关支持的图像,请参阅本文末尾的注意事项部分。
  • 内核名称 – 您在 SageMaker Studio 上使用的内核的名称。 该内核规范已注册在您提供的映像中。
  • 实例类型(可选) ——由数百家创建、维护和提供物联网(IoT)全球开放标准的公司所组成的 亚马逊弹性计算云 您已定义并将运行的笔记本作业背后的 (Amazon EC2) 实例类型。
  • 参数(可选) – 您可以传入的参数可供您的笔记本访问。 这些可以在键值对中定义。 此外,可以在各种笔记本作业运行或管道运行之间修改这些参数。

我们的示例共有五个笔记本:

  • NB-作业管道.ipynb – 这是我们的主要笔记本,我们在其中定义管道和工作流程。
  • 预处理.ipynb – 此笔记本是我们工作流程的第一步,包含将提取公共 AWS 数据集并从中创建 CSV 文件的代码。
  • 训练.ipynb – 此笔记本是我们工作流程中的第二步,包含用于获取上一步中的 CSV 并进行本地培训和微调的代码。 此步骤还依赖于 prepare-test-set.ipynb 笔记本来拉取测试数据集,以便使用微调模型进行样本推理。
  • 准备测试集.ipynb – 此笔记本创建一个测试数据集,我们的训练笔记本将在第二个管道步骤中使用该数据集,并用于通过微调模型进行样本推理。
  • 变换监视器.ipynb – 此笔记本是我们工作流程中的第三步,它采用基本 BERT 模型并运行 SageMaker 批量转换作业,同时还通过模型监控设置数据质量。

接下来,我们浏览一下主要笔记本 nb-job-pipeline.ipynb,它将所有子笔记本组合到一个管道中并运行端到端工作流程。 请注意,虽然以下示例仅运行笔记本一次,但您也可以安排管道重复运行笔记本。 参考 SageMaker文档 有关详细说明。

对于我们的第一个笔记本作业步骤,我们传入一个带有默认 S3 存储桶的参数。 我们可以使用此存储桶转储我们希望可用于其他管道步骤的任何工件。 对于第一个笔记本(preprocess.ipynb),我们拉取 AWS 公共 SST2 训练数据集并从中创建一个训练 CSV 文件,并将其推送到此 S3 存储桶。 请看下面的代码:

# Parameters
print(default_s3_bucket)

!aws s3 cp s3://sagemaker-sample-files/datasets/text/SST2/sst2.train sst2.train

# will read just the first 500 lines for quicker execution
with open('sst2.train', 'r') as f:
    lines = f.readlines()[:500] 

data = []
for line in lines:
    label, text = line.strip().split(' ', 1)
    data.append((int(label), text))

df = pd.DataFrame(data, columns=['label', 'text'])
df.to_csv("train.csv", index=False) #create csv file with smaller dataset
!aws s3 cp "train.csv" {default_s3_bucket}

然后我们可以将此笔记本转换为 NotebookJobStep 在我们的主笔记本中使用以下代码:

# provide S3 Bucket to dump artifacts in
nb_job_params = {"default_s3_bucket": notebook_artifacts}

preprocess_nb_step = NotebookJobStep(
name=preprocess_step_name,
description=preprocess_description,
notebook_job_name=preprocess_job_name,
image_uri=image_uri,
kernel_name=kernel_name,
display_name=display_name,
role=role,
input_notebook=preprocess_notebook,
instance_type="ml.m5.4xlarge",
parameters=nb_job_params,
)

现在我们有了一个示例 CSV 文件,我们可以开始在训练笔记本中训练我们的模型。 我们的训练笔记本采用与 S3 存储桶相同的参数,并从该位置提取训练数据集。 然后我们使用 Transformers 训练器对象和以下代码片段进行微调:

from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir="test_trainer", evaluation_strategy="epoch")

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eval_dataset=small_eval_dataset,
    compute_metrics=compute_metrics,
)

trainer.train()

微调后,我们想要运行一些批量推理来查看模型的表现。 这是使用单独的笔记本完成的(prepare-test-set.ipynb)在创建测试数据集的同一本地路径中,以使用我们训练的模型执行推理。 我们可以使用以下魔法单元在训练笔记本中运行附加笔记本:

%run 'prepare-test-set.ipynb'

我们在中定义了这个额外的笔记本依赖项 AdditionalDependencies 我们的第二个笔记本作业步骤中的参数:

train_nb_step = NotebookJobStep(
name=training_step_name,
description=training_description,
notebook_job_name=training_job_name,
input_notebook=training_notebook,
additional_dependencies=[test_data_prep_notebook],
image_uri=image_uri,
kernel_name=kernel_name,
display_name=display_name,
instance_type="ml.m5.12xlarge",
role=role,
parameters=nb_job_params,
)

我们还必须指定训练笔记本作业步骤(步骤 2)取决于预处理笔记本作业步骤(步骤 1),方法是使用 add_depends_on API调用如下:

train_nb_step.add_depends_on([preprocess_nb_step])

我们的最后一步是让 BERT 模型运行 SageMaker 批量转换,同时通过 SageMaker 模型监视器设置数据捕获和质量。 请注意,这与使用内置的 改造 or 捕获 通过管道的步骤。 此步骤的笔记本将执行相同的 API,但将作为笔记本作业步骤进行跟踪。 此步骤取决于我们之前定义的训练作业步骤,因此我们还使用 dependent_on 标志来捕获它。

batch_monitor_step = NotebookJobStep(
name=batch_monitor_step_name,
description=batch_monitor_description,
notebook_job_name=batch_monitor_job_name,
input_notebook=batch_monitor_notebook,
image_uri=image_uri,
kernel_name=kernel_name,
display_name=display_name,
instance_type="ml.m5.12xlarge",
role=role,
parameters=nb_job_params,
)
batch_monitor_step.add_depends_on([train_nb_step])

定义工作流程的各个步骤后,我们可以创建并运行端到端管道:

# create pipeline
pipeline = Pipeline(
name=pipeline_name,
steps=[preprocess_nb_step, train_nb_step, batch_monitor_step],
)

# execute pipeline
pipeline.create(session.get_execution_role())
execution = pipeline.start(parameters={})
execution.wait(delay=30, max_attempts=60)
execution_steps = execution.list_steps()
print(execution_steps)

监控管道运行情况

您可以通过 SageMaker Pipelines DAG 跟踪和监控笔记本步骤的运行,如以下屏幕截图所示。

您还可以选择在笔记本作业仪表板上监控单个笔记本的运行,并切换通过 SageMaker Studio UI 创建的输出文件。 在 SageMaker Studio 外部使用此功能时,您可以定义可以使用标签在笔记本作业仪表板上跟踪运行状态的用户。 有关要包含的标签的更多详细信息,请参阅 在 Studio UI 仪表板中查看您的笔记本作业并下载输出.

对于此示例,我们将生成的笔记本作业输出到名为的目录 outputs 在您的本地路径中使用管道运行代码。 如以下屏幕截图所示,您可以在此处看到输入笔记本的输出以及您为该步骤定义的任何参数。

清理

如果您遵循我们的示例,请务必删除创建的管道、笔记本作业以及示例笔记本下载的 s3 数据。

需要考虑的事项

以下是此功能的一些重要注意事项:

  • SDK限制 – 笔记本作业步骤只能通过 SageMaker Python SDK 创建。
  • 图像限制 –笔记本作业步骤支持以下图像:

结论

通过此次发布,数据工作者现在可以使用以下命令通过几行代码以编程方式运行他们的笔记本: SageMaker Python 开发工具包。 此外,您可以使用笔记本创建复杂的多步骤工作流程,从而显着减少从笔记本迁移到 CI/CD 管道所需的时间。 创建管道后,您可以使用 SageMaker Studio 查看和运行管道的 DAG,并管理和比较运行。 无论您是安排端到端 ML 工作流程还是其中的一部分,我们都鼓励您尝试 基于笔记本的工作流程.


关于作者

安吉古普塔 是 Amazon SageMaker Studio 的高级产品经理。 她专注于在 SageMaker Studio IDE 中启用交互式数据科学和数据工程工作流程。 业余时间,她喜欢烹饪、玩棋盘/纸牌游戏和阅读。

拉姆·维吉拉茹 是 SageMaker 服务团队的 ML 架构师。 他专注于帮助客户在 Amazon SageMaker 上构建和优化他们的 AI/ML 解决方案。 在业余时间,他喜欢旅行和写作。

孙爱德 是 Amazon Web Services 的 SageMaker Studio 的一名高级 SDE。 他专注于构建交互式 ML 解决方案并简化客户体验,以将 SageMaker Studio 与数据工程和 ML 生态系统中的流行技术相集成。 在业余时间,Edward 非常喜欢露营、远足和钓鱼,并喜欢与家人共度时光。

时间戳记:

更多来自 AWS机器学习