机器学习 | 数据大爆炸有大数据,ML 模型大爆炸怎么办?

专属图1.png

遥想当年,当企业须要从不一样来源的多种系统中对海量数据进行分析时,大数据技术应运而生了,帮助企业更快速、灵活地从数据中得到宝贵的看法。而机器学习技术发展到今天,也产生了相似的需求。html

实践过就会知道,机器学习(ML)是一种高度迭代的过程。在单个项目的过程当中,数据科学家和 ML 工程师一般会训练数千个不一样模型,以寻求最大准确度。而在这过程当中,所涉及到的算法、数据集和训练参数(又称为超参数)的组合数量是无限的……你们就如同大海捞针那样须要从中找出最优解。git

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

固然,也能够经过构建、管理和扩展定制工具来解决此问题。然而这样作会浪费实际 ML 工做所需的宝贵时间和资源。本着帮助客户专一于 ML 的精神,咱们须要另辟蹊径来解决这个问题。算法

隆重推荐:Amazon SageMaker Experiments

近日,Amazon SageMaker Experiments 已经正式发布!它是 Amazon SageMaker 的一项新功能,可帮助用户组织、跟踪、比较和评估机器学习实验和模型版本。网络

首先咱们来定义几个核心概念:session

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

SageMaker Experiments 的目标是尽量简单地建立实验,用试验填充实验,并在试验与实验间运行分析。为此,咱们推出了包含日志记录和分析 API 的新 Python 开发工具包。机器学习

SageMakerSageMaker Autopilot 上运行训练做业,只须要将额外参数传递到 Estimator 中,以此定义试验应附加到的实验的名称。全部的输入和输出都将自动记录。工具

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

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

演示:使用 Amazon SageMaker Experiments 记录训练信息

咱们将从 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

当全部做业完成时,便可运行分析。接下来看看是怎么作的。

演示:使用 Amazon SageMaker Experiments 进行分析

有关实验的全部信息能够轻松导出至 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 商业区域中推出,欢迎体验!

底图2.png

相关文章
相关标签/搜索