遥想当年,当企业需要从不同来源的多种系统中对海量数据进行分析时,大数据技术应运而生了,帮助企业更快速、灵活地从数据中获得宝贵的见解。而机器学习技术发展到今天,也产生了类似的需求。
实践过就会知道,机器学习(ML)是一种高度迭代的过程。在单个项目的过程中,数据科学家和 ML 工程师通常会训练数千个不同模型,以寻求最大准确度。而在这过程中,所涉及到的算法、数据集和训练参数(又称为超参数)的组合数量是无限的……大家就如同大海捞针那样需要从中找出最优解。
虽然业界已经提出了不少解决方法,例如自动模型调整和 Amazon SageMaker Autopilot 之类的工具可帮助 ML 从业者自动探索大量组合,并快速放大高性能模型。然而它们会进一步加大训练作业的爆炸式增长。随着时间推移,这给 ML 团队带来了新困难,因为要高效处理成千上万个作业几乎是不可能的:跟踪指标、按实验对作业分组、在同一个实验中或各实验间比较作业、查询过去的作业等。
当然,也可以通过构建、管理和扩展定制工具来解决此问题。然而这样做会浪费实际 ML 工作所需的宝贵时间和资源。本着帮助客户专注于 ML 的精神,我们需要另辟蹊径来解决这个问题。
近日,Amazon SageMaker Experiments 已经正式发布!它是 Amazon SageMaker 的一项新功能,可帮助用户组织、跟踪、比较和评估机器学习实验和模型版本。
首先我们来定义几个核心概念:
SageMaker Experiments 的目标是尽可能简单地创建实验,用试验填充实验,并在试验与实验间运行分析。为此,我们推出了包含日志记录和分析 API 的新 Python 开发工具包。
在 SageMaker 或 SageMaker Autopilot 上运行训练作业,只需要将额外参数传递到 Estimator 中,以此定义试验应附加到的实验的名称。所有的输入和输出都将自动记录。
在运行训练作业后,SageMaker Experiments 开发工具包可让我们以常见的 pandas DataFrame 格式加载实验和试验数据。Pandas 无疑是 ML 从业者的瑞士军刀,我们可以借此执行所需的任何分析。通过使用 matplotlib 构建很酷的可视化向前进一步,将能够顺利地驯服大量训练作业!
正如您期望的那样,SageMaker Experiments 完美集成在 Amazon SageMaker Studio 中。我们可以运行复杂的查询,以快速找到要找的过去的试验,还可以对实时模型排行榜和指标图表进行可视化。
我们将从 PyTorch 脚本开始,使用一个简单的双层卷积神经网络(CNN)从 MNIST 数据集中分类图像。如果想要在 SageMaker 上运行单个作业,可以像下面这样使用 PyTorch estimator:
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!
此时只需要:
首先,我们来进行实验吧:
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)
然后添加几个想要跟踪的项目,如数据集位置和我们对其应用的规范化值:
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, })
现在来运行几个作业。此处只是循环处理想要尝试的几个不同值,为每个训练作业创建一个新试验并在其中添加跟踪器信息:
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)
然后配置估算器,从而传递感兴趣的超参数值,并让其他值保持原样。这里还会传递正则表达式,以从训练日志中提取指标。所有这些都会推送存储在试验中:事实上,所有参数(传递或默认参数)都是如此。
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: (.*?)%;'} ] )
最后运行训练作业,将该作业与实验和试验关联:
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
当所有作业完成时,即可运行分析。接下来看看是怎么做的。
有关实验的所有信息可以轻松导出至 Pandas DataFrame 中。
from sagemaker.analytics import ExperimentAnalytics trial_component_analytics = ExperimentAnalytics( sagemaker_session=sess, experiment_name=mnist_experiment.experiment_name ) analytic_table = trial_component_analytics.dataframe()
如果想要深入了解,可以指定其他参数,例如:
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,试验会在其中按测试准确度降序进行排序,并且只会显示每个试验的一些超参数。
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 商业区域中推出,欢迎体验!