使用多种工具组合进行分布式超参数优化

编译:yxy

出品:ATYUN订阅号

在这篇文章中,我介绍如何使用工具组合来加速超参数优化任务。这里提供了Ubuntu的说明,但可以合理地应用于任何*nix系统。

什么是超参数优化?

超参数优化(HO)是一种为机器学习任务选择最佳参数的方法。这些参数包括:

层数

学习率

批量大小

层的类型

Dropout

优化算法(SGD,Adam,rmsprop等)

对于任何给定的问题,什么样的网络配置最适合于给定的任务可能不那么明显,因此我们可以使用超参数优化,通过智能地迭代你想要优化的参数的搜索空间来为我们决定。Hyperopt使用Tree-Structure Parzen估计器,非常擅长快速确定最佳参数集。它的工作原理是运行和评估模型,返回损失分数,然后运行另一个参数略有不同的模型,旨在最大限度地减少误差分数。对你来说困难的部分是为你的问题设计一个搜索空间,这可能非常大。为了节省时间,我们可以在任意数量的机器上同时运行这些模型,甚至让每台机器运行多个模型(前提是它有足够的内核)。

幸运的是,有些python库可以帮助我们完成所有这些工作!

要求

你会需要:

安装了以下Python包

theano,tensorflow或tensorflow-gpu

hyperopt

hyperas

pymongo

PSSH

安装了以上所有的几台机器

一个带有jobs数据库的Mongodb实例

我强烈建议使用pyenv来使用最新版本的python,并防止我们安装的包与系统包冲突。如果你可以访问所有计算机可用的网络驱动器,请设置$PYENV_ROOT为这些计算机所有文件都可见(或至少在所有计算机上都有一个公共路径)。安装所用的库(你可以使用你想要使用的任何keras后端交换tensorflow,如theano tensorflow-gpu tensorflow cntk):

你现在将拥有一个自包含的python安装在$HOME/.pyenv/versions/3.6.5。请记住,它需要构建一个python安装,因此可能需要一段时间。你可以将~/.pyenv文件夹复制到要运行的任何计算机上。只需记住将你的~/.bash_profile(或其他与此相同的)复制到你想要作为“工作者”的每台机器上。

代码

我们还需要选择一项优化任务!Hyperas使用模板生成hyperopt可以使用的代码,因此你需要严格遵循这个模板。创建一个名为optimise_task.py的文件。我们将找到单层稠密网络的最佳的层数和dropout参数(在搜索空间内,参见l1_size和l1_dropout变量)来解决MNIST任务。不同参数分布的文档在这里:

https://github.com/hyperopt/hyperopt/wiki/FMin#21-parameter-expressions

为达到我们的目的:

quniform是具有给定间隔和步长的离散值的正态分布。在我们的示例中,它将返回范围[12,256]中的浮点数,step=4

uniform是连续值的正态分布

Hyperas.distributions中提供了更多可用的分布:https://github.com/maxpumperla/hyperas/blob/master/hyperas/distributions.py

请注意实验密钥的名称:mnist_test,这将是mongodb中jobs数据库的jobs集合的密钥。每个模型完成后,它将存储在mongodb中。可以将权重存储在输出文档中(输出model.get_weights(),但是mongodb每个文档的限制为4MB。为了解决这个问题,GridFS用于在模型本身的数据库中临时存储blob。

我也将持续时间存储在result对象中,因为你可能会发现两个损失非常相似的模型,但损失稍微好一些的模型可能会有更高的运行时间。

运行

运行它有两个部分:

试验控制器,它决定每个模型运行时将使用的参数

实际运行单个模型的工作者

调节器

从计算机运行它(它必须在所有jobs运行时处于活动状态):

你应该得到一个调用的输出文件temp_model.py(如果你没有,请确保你已经更新到github的最新hyperas代码)。确保该文件对工作者可见。

工作者

工作者是你的所有其他机器(也可能包括控制器机器)。确保你安装了pyenv,只需压缩.pyenv文件夹并将其复制到工作机器上的主目录并解压即可。这样你就不会错过任何依赖。

运行以下命令:

将temp_model.py文件复制到hyperopt_job文件夹中( ~/hyperopt_job/job.sh):

现在你可以在你的工作机器上运行~/hyperopt_job/job.sh了!请记住,他们需要能够访问mongodb。工作者继续运行,直到你达到max_evals末尾定义的optimise_task.py。

如果.pyenv文件夹还不存在,您还可以让该脚本从URL中获取压缩版本的.pyenv文件夹,方法是在脚本前加上如下内容:

如果工作者计算机上的主驱动器空间有限,请考虑解压缩到tmp目录并设置相应地PYENV_ROOT环境变量。

你可能需要:

通过ssh或常规登录登录计算机

开始屏幕

启动脚本

我们可以通过使用pssh对给定主机列表自动执行上述操作来做得更好。

结果

完成所有工作后,你可以使用mongodb浏览器(如Robo3T)查看结果。下面一个小脚本,用于从数据库中获取具有最低损失分数的模型并反序列化你的模型:

你可以使用以下代码将搜索空间子集的结果可视化(具有2个以上参数的典型搜索空间,因此可能并不清楚哪一个(或哪个组合)对你的模型性能影响最大):

下面是我的一个实验的输出,正如你所看到的,优化器可以快速找到聚集在给定搜索空间的最小可实现错误评分附近的模型:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180831B1FUM200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券