Amazon SageMaker Experiments – 组织、跟踪和比较机器学习训练

阅读数:4 2019 年 12 月 11 日 15:34

Amazon SageMaker Experiments – 组织、跟踪和比较机器学习训练

今天,我们很高兴地宣布推出 Amazon SageMaker Experiments,它是 Amazon SageMaker 的一项新功能,可让您组织、跟踪、比较和评估机器学习 (ML) 实验和模型版本。

ML 是一个高度迭代的过程。在单个项目的过程中,数据科学家和 ML 工程师通常会训练数千个不同的模型,以寻求最大的准确度。算法、数据集和训练参数(又称为超参数)的组合数量是无限的…,就是众所周知的大海捞针的挑战。

自动模型调整 Amazon SageMaker Autopilot 之类的工具可帮助 ML 从业者自动探索大量组合,并快速放大高性能模型。然而,它们会进一步加大训练作业的爆炸式增长。随着时间的推移,这给 ML 团队带来了新的困难,因为要高效处理成千上万个作业几乎是不可能的:跟踪指标、按实验对作业分组、在同一个实验中或各实验间比较作业、查询过去的作业等。

当然,也可以通过构建、管理和扩展定制工具来解决此问题:然而,这样做会浪费实际 ML 工作所需的宝贵时间和资源。本着帮助客户专注于 ML 的精神,我们不能让这个问题得不到解决。

** 隆重推出 Amazon SageMaker Experiments
** 首先,我们来定义几个核心概念:

  • 试验是单个训练作业中所涉及的训练步骤集合。训练步骤通常包括预处理、训练、模型评估等。试验还包含丰富的输入(例如,算法、参数、数据集)和输出(例如,模型、检查点、指标)元数据。
  • 实验就是一系列的试验,即一组相关训练作业。

SageMaker Experiments 的目标是尽可能简单地创建实验、用试验填充实验,并在试验与实验间运行分析。为此,我们推出了包含日志记录和分析 API 的新 Python 开发工具包。

SageMaker SageMaker Autopilot 上运行您的训练作业,您只需要将额外参数传递到 Estimator 中,以此定义此试验应附加到的实验的名称。所有的输入和输出都将自动记录。

当您运行您的训练作业后, SageMaker Experiments 开发工具包可让您以常见的 pandas DataFrame 格式加载实验和试验数据。 Pandas 无疑是 ML 从业者的瑞士军刀,您将能够执行您所需的任何分析。通过使用 matplotlib 构建很酷的可视化向前进一步,您将能够顺利地驯服大量训练作业!

正如您期望的那样, SageMaker Experiments 完美集成在 Amazon SageMaker Studio 中。您可以运行复杂的查询,以快速找到您要找的过去的试验。您还可以对实时模型排行榜和指标图表进行可视化。

来个简短的演示如何?

** 使用 Amazon SageMaker Experiments 记录训练信息
** 我们从 PyTorch 脚本开始,使用一个简单的双层卷积神经网络 (CNN) 从 MNIST 数据集中分类图像。如果我想要在 SageMaker 上运行单个作业,我可以像下面这样使用 PyTorch estimator

Python

复制代码
estimator = PyTorch(
entry_point='mnist.py',
role=role,
sagemaker_session=sess
framework_version='1.1.0',
train_instance_count=1,
train_instance_type='ml.p3.2xlarge')
estimator.fit(inputs={'training': inputs})

反过来,假设我想要运行同一个脚本的多个版本,只更改超参数(两个卷积层使用的卷积筛选器数量,又名隐藏通道数)中的一个来测量它对模型准确度的影响。当然,我们可以运行这些作业、获取训练日志、使用精心设计的文本筛选提取指标等。或者,我们可以使用 SageMaker Experiments

而我只需要:

  • 设置实验,
  • 使用跟踪器记录实验元数据,
  • 为我想运行的每个训练作业创建试验,
  • 运行每个训练作业,以传递实验名称和试验名称的参数。

首先,我们来进行实验吧。

Python

复制代码
from smexperiments.experiment import Experiment
mnist_experiment = Experiment.create(
experiment_name="mnist-hand-written-digits-classification",
description="Classification of mnist hand-written digits",
sagemaker_boto_client=sm)

然后,我们来添加几个想要跟踪的项目,如数据集位置和我们对其应用的规范化值。

Python

复制代码
from smexperiments.tracker import Tracker
with Tracker.create(display_name="Preprocessing", sagemaker_boto_client=sm) as tracker:
tracker.log_input(name="mnist-dataset", media_type="s3/uri", value=inputs)
tracker.log_parameters({
"normalization_mean": 0.1307,
"normalization_std": 0.3081,
})

现在,我们来运行几个作业。我只是循环处理我想要尝试的几个不同值,为每个训练作业创建一个新试验并在其中添加跟踪器信息。

Python

复制代码
for i, num_hidden_channel in enumerate([2, 5, 10, 20, 32]):
trial_name = f"cnn-training-job-{num_hidden_channel}-hidden-channels-{int(time.time())}"
cnn_trial = Trial.create(
trial_name=trial_name,
experiment_name=mnist_experiment.experiment_name,
sagemaker_boto_client=sm,
)
cnn_trial.add_trial_component(tracker.trial_component)

然后,我配置估算器,从而传递我感兴趣的超参数的值,并让其他值保持原样。我还会传递正则表达式,以从训练日志中提取指标。所有这些都会推送存储在试验中:事实上,所有参数(传递或默认参数)都会是。

Python

复制代码
estimator = PyTorch(
entry_point='mnist.py',
role=role,
sagemaker_session=sess,
framework_version='1.1.0',
train_instance_count=1,
train_instance_type='ml.p3.2xlarge',
hyperparameters={
'hidden_channels': num_hidden_channels
},
metric_definitions=[
{'Name':'train:loss', 'Regex':'Train Loss: (.*?);'},
{'Name':'test:loss', 'Regex':'Test Average loss: (.*?),'},
{'Name':'test:accuracy', 'Regex':'Test Accuracy: (.*?)%;'}
]
)

最后,我运行训练作业,将该作业与实验和试验关联。

Python

复制代码
cnn_training_job_name = "cnn-training-job-{}".format(int(time.time()))
estimator.fit(
inputs={'training': inputs},
job_name=cnn_training_job_name,
experiment_config={
"ExperimentName": mnist_experiment.experiment_name,
"TrialName": cnn_trial.trial_name,
"TrialComponentDisplayName": "Training",
}
)
# end of loop

当所有作业完成时,我可以运行分析。接下来看看我们是怎么做的。

使用 Amazon SageMaker Experiments 进行分析
有关实验的所有信息可以轻松导出至 Pandas DataFrame 中。

Python

复制代码
from sagemaker.analytics import ExperimentAnalytics
trial_component_analytics = ExperimentAnalytics(
sagemaker_session=sess,
experiment_name=mnist_experiment.experiment_name
)
analytic_table = trial_component_analytics.dataframe()

如果我想要深入了解,我可以指定其他参数,例如:

Python

复制代码
trial_component_analytics = ExperimentAnalytics(
sagemaker_session=sess,
experiment_name=mnist_experiment.experiment_name,
sort_by="metrics.test:accuracy.max",
sort_order="Descending",
metric_names=['test:accuracy'],
parameter_names=['hidden_channels', 'epochs', 'dropout', 'optimizer']
)
analytic_table = trial_component_analytics.dataframe()

这将构建一个 DataFrame,试验会在其中按测试准确度降序进行排序,并且只会显示每个试验的一些超参数。

Python

复制代码
for col in analytic_table.columns:
print(col)
TrialComponentName
DisplayName
SourceArn
dropout
epochs
hidden_channels
optimizer
test:accuracy - Min
test:accuracy - Max
test:accuracy - Avg
test:accuracy - StdDev
test:accuracy - Last
test:accuracy - Count

从现在开始,有些事情超乎你的想象。 Pandas 是数据分析的瑞士军刀,您将能够以各种可能的方式比较试验和实验。

最后,得益于与 Amazon SageMaker Studio 的集成,您将能够使用预定义的小部件实时可视化所有这些信息。要了解有关 Amazon SageMaker Studio 的更多信息,请访问此博文

现已推出!
我只是介绍了 Amazon SageMaker Experiments 能执行操作的皮毛,我相信它能帮助您处理您每天必须要处理的大量作业。

此服务现已在提供 Amazon SageMaker 的所有 AWS 商业区域中推出。

请试一试,并通过 Amazon SageMaker 的 AWS 论坛或您常用的 AWS 联系方式向我们发送反馈。

本文转载自 AWS 技术博客。

原文链接: https://amazonaws-china.com/cn/blogs/china/amazon-sagemaker-experiments-organize-track-and-compare-your-machine-learning-trainings/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布