hyperopt中文文档:Parallelizing-Evaluations-During-Search-via-MongoDB

通过MongoDB在搜索时进行并行计算

Font Tian translated this article on 23 December 2017

Hyperopt旨在支持不同类型的试用数据库(Trials)。默认试用数据库(Trials)是用Python列表和字典实现的。但是虽然默认实现很容易处理,却不支持并行评估试验所需的异步更新。不过没关系,对于并行搜索,hyperopt还包含一个 MongoTrials 来支持异步更新。

因此想要进行并行搜索,您需要执行以下操作(在安装 mongodb 之后):

  1. 在程序运行的计算机可以链接的的地方启动一个mongod进程,本地,远程都可以。

  2. 修改您的调用以 hyperopt.fmin 连接到该 mongod 进程的 MongoTrials 模块。

  3. 启动一个或多个 hyperopt-mongo-worker 连接到 mongod 进程的进程,并在 fminblocks(块) 进行搜索。

1.启动一个mongod进程

安装mongodb 后启动一个数据库进程(mongod)十分简单,命令如下。(当然,你也可以参考其他文档,译者注)

	mongod --dbpath . --port 1234
	# or storing each db its own directory is nice:
	mongod --dbpath . --port 1234 --directoryperdb --journal --nohttpinterface
	# or consider starting mongod as a daemon:
	mongod --dbpath . --port 1234 --directoryperdb --fork --journal --logpath log.log --nohttpinterface

Mongo会预先分配几GB空间(你可以用 --noprealloc 来禁用这个空间)以获得更好的性能,所以当你想创建这个数据库的位置请思考一下这个问题。在远程创建数据库不仅可能会给您的数据库带来糟糕的性能体验,还会给网络上的其他人带来不好的体验,请小心。

另外,如果你的机器可以连接互联网,那么也就可以绑定到 loopback 接口并通过ssh连接,或者读取有关密码保护的 mongodb 文档。

本教程的其余部分则是基于运行 mongo 端口1234的的本地主机

2.使用 MongoTrials

为了演示程序本处使用math.sin函数,然后通过 hyperopt 来最小化该函数。示例如下:

	import math
	from hyperopt import fmin, tpe, hp
	from hyperopt.mongoexp import MongoTrials

	trials = MongoTrials('mongo://localhost:1234/foo_db/jobs', exp_key='exp1')
	best = fmin(math.sin, hp.uniform('x', -2, 2), trials=trials, algo=tpe.suggest, max_evals=10)

MongoTrials 的第一个参数是使用哪个 mongod进程,以及该进程中的哪个数据库 (这里是 'foo_db' ) 。第二个参数 (exp_key='exp_1') 用于某次实验的标记(这样可以在一个数据库中保存多次试验),该参数是可选的。

注意目前有一个使用要求,数据库名称后必须加上 “/ jobs” 字段。

无论是把你的试验放在一个单独的数据库中,还是使用 exp_key 机制来区分它们都取决于你的代码,都是可行的。单独使用数据库的好处在于可以从shell中操作它们(它们显示为不同的文件),并确保实验拥有更好的独立性/隔离性。使用exp_key的好处:hyperopt-mongo-worker进程(请参阅下文)在数据库级别进行轮询,这样可以在同一个数据库中进行多次试验。

3.运行 hyperopt-mongo-worker

如果你运行上面的代码片段,你会发现它在调用 fmin 时阻塞(挂起) 。 在MongoTrials 内部中- fmin 作为异步 trials 对象(an asynchronous trials object),所以 fmin 在建议新的搜索点时实际上并​不会评估度量函数。相反,它只是坐在那里,耐心等待另一个进程做这个工作,然后更新MongoDB的结果。 包含在 bin 目录中的hyperopt-mongo-worker 脚本就是为这个目的编写的。在你安装hyperopt的时候,请确保它应该加入你的 $PATH (环境变量)中。

你也可以在上面脚本中的调用 fmin 并被阻塞的同时,打开一个新的 shell 并输入

	hyperopt-mongo-worker --mongo=localhost:1234/foo_db --poll-interval=0.1

它会从MongoDB中取出一个工作项,同时评估 math.sin 函数,并将结果存回数据库。在 fmin 函数传入的运行次数全部运行完毕之后,它终止脚本并返回计算结果。然后 hyperopt-mongo-worker脚本会等待几分钟,等待更多的工作出现,最后终止。

在这种情况下,我们最好还是显式地设置适合我们程序的轮询间隔,而默认的时间设置是为了至少需要一两分钟完成的作业(搜索点评估)设置的。

MongoTrials 是一个持久对象

如果你再次运行这个例子,

	best = fmin(math.sin, hp.uniform('x', -2, 2), trials=trials, algo=tpe.suggest, max_evals=10)

你会看到它立即返回,似乎没有进行任何计算。那是因为你连接的数据库之前已经有足够的尝试(trials),程序默认会直接调取原来的结果; 实际上在你运行第一个实验时已经计算了它们。而如果你想进行一次新的搜索,你可以改变数据库名称或者exp_key。如果你想扩展本次搜索,那么你可以为了 max_evals 设置一个拥有更高数字的 fmin

又或者,您可以启动其他专门创建 MongoTrials 的进程来分析数据库中已用结果。而那些其他进程根本不需要调用 fmin

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值