Hyperopt概念

本文描述了使用分布式Hyperopt时需要了解的一些概念。

有关如何在Databricks中使用Hyperopt的示例,请参见使用Hyperopt进行超参数调优

fmin ()

你使用fmin ()来执行Hyperopt运行。的论点fmin ()表中所示;看到Hyperopt文档获取更多信息。有关如何使用每个参数的示例,请参见笔记本的例子

参数名称

描述

fn

目标函数。Hyperopt使用space参数中提供的超形参空间生成的值调用此函数。此函数可以以标量值或在字典中返回损失值(请参阅Hyperopt文档详情)。此函数通常包含用于模型训练和损失计算的代码。

空间

定义要搜索的超参数空间。Hyperopt在如何定义这个空间方面提供了很大的灵活性。您可以选择一个分类选项,如算法,或数值的概率分布,如均匀和对数。

算法

Hyperopt搜索算法用于搜索超参数空间。最常用的有hyperopt.rand.suggest用于随机搜索和hyperopt.tpe.suggest为TPE。

max_evals

要尝试的超参数设置数量(拟合的模型数量)。

max_queue_len

Hyperopt提前生成的超参数设置个数。由于Hyperopt TPE生成算法可能需要一些时间,因此将该值增加到默认值1之外会有所帮助,但通常不大于SparkTrials设置并行性

试用

一个试用SparkTrials对象。使用SparkTrials当您在目标函数中调用scikit-learn方法等单机算法时。使用试用当你在目标函数中调用分布式训练算法,如MLlib方法或Horovod时。

early_stop_fn

一个可选的早期停止函数来确定是否fmin应该停止max_evals是达到了。默认是没有一个.函数的输入签名为试用* args输出签名是保龄球* args.输出布尔值表示是否停止。* args是否有任何状态,输出到哪里调用early_stop_fn作为下一个调用的输入。试用可以是SparkTrials对象。当使用SparkTrials,早期停止函数不保证每次尝试后都运行,而是轮询。提前停止函数的例子

SparkTrials

SparkTrials是由Databricks开发的API,它允许您在不更改Hyperopt代码的情况下分发Hyperopt运行。SparkTrials通过将试验分发给Spark工人来加速单机调试。

请注意

SparkTrials设计用于并行计算单机ML模型,如scikit-learn。对于使用分布式ML算法(如MLlib或Horovod)创建的模型,不要使用SparkTrials.在这种情况下,模型构建过程在集群上自动并行化,您应该使用默认的Hyperopt类试用

本节描述如何配置传递给的参数SparkTrials以及执行方面SparkTrials

参数

SparkTrials接受两个可选参数:

  • 并行性:可同时评估的最大试验数。更高的数值可以让您扩展测试更多的超参数设置。因为Hyperopt基于过去的结果提出了新的试验,所以在并行性和适应性之间需要权衡。对于固定的max_evals,更高的并行度可以加快计算速度,但较低的并行度可能会导致更好的结果,因为每次迭代都可以访问更多的过去结果。

    默认值:可用的Spark executor数量。最大:128。如果该值大于集群配置允许的并发任务数,SparkTrials减少对该值的并行性。

  • 超时:最大秒数fmin ()电话可以接听。当超过这个数字时,所有运行都将终止fmin ()退出。关于已完成运行的信息将被保存。

实现

当定义目标函数时fn传递给fmin (),在选择集群设置时,了解如何进行将很有帮助SparkTrials分配调优任务。

在Hyperopt中,一个试验通常对应于在一个超参数设置上拟合一个模型。Hyperopt迭代地生成试验,评估它们,并重复。

SparkTrials,集群的驱动节点生成新的试验,工作节点评估这些试验。每个试验都由一个Spark作业生成,该Spark作业有一个任务,并在工作机器上的任务中进行评估。如果您的集群设置为每个worker运行多个任务,那么可以在该worker上同时评估多个试验。

SparkTrials和MLflow

Databricks Runtime ML支持从worker记录到MLflow。您可以在传递给Hyperopt的目标函数中添加自定义日志记录代码。

SparkTrials在嵌套MLflow运行时记录调优结果,如下所示:

  • 主运行或父运行:对fmin ()记录为主运行。如果有主动运行,SparkTrials记录到此活动运行,并且不会在时结束运行fmin ()的回报。如果没有活动运行,SparkTrials创建一个新的运行,记录到它,并在之前结束运行fmin ()的回报。

  • 子运行:测试的每个超参数设置(一个“试验”)被记录为主运行下的子运行。来自工作者的MLflow日志记录也存储在相应的子运行下。

当调用fmin (), Databricks推荐主动MLflow运行管理;即,将呼叫转到fmin ()在一个mlflow.start_run ():声明。这就确保了fmin ()调用被记录到单独的MLflow主运行中,并使记录额外的标记、参数或指标更容易。

请注意

当你打电话时fmin ()在同一个活动MLflow运行中,MLflow会多次将这些调用记录到同一个主运行中。为了解决已记录参数和标记的名称冲突,MLflow将UUID附加到有冲突的名称上。

当从工作者记录日志时,您不需要显式地管理目标函数中的运行。调用mlflow.log_param(“param_from_worker”,x)在目标函数中记录参数到子运行。您可以在目标函数中记录参数、度量、标记和工件。