通过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 mathfrom hyperopt import fmin, tpe, hpfrom hyperopt.mongoexp import MongoTrialstrials = 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

hyperopt中文文档:Parallelizing-Evaluations-During-Search-via-MongoDB相关推荐

  1. Hyperopt中文文档导读

    在2017年的圣诞节前,我翻译了有关HyperOpt的中文文档,这也时填补了空白,以此作为献给所有中国程序员,以及所有其他机器学习相关行业人员的圣诞礼物.圣诞快乐,各位. HyperOpt中文文档导读 ...

  2. Hyperopt中文文档:Cite引用

    引用 Font Tian translated this article on 22 December 2017 如果你想使用这个软件进行研究,请在论文中引用以下内容: Bergstra, J., Y ...

  3. Hyperopt中文文档:FMin

    FMin Font Tian translated this article on 22 December 2017 这一页是关于 hyperopt.fmin() 的基础教程. 主要写了如何写一个可以 ...

  4. Hyperopt中文文档:Home

    主页 Font Tian translated this article on 22 December 2017 Hyperopt:分布式异步算法组态/超参数优化(主页,但这不是维基的主页). 加入h ...

  5. hyperopt中文文档:Scipy2013

    Scipy2013 Font Tian translated this article on 23 December 2017 SciPy2013摘要提交 标题 Hyperopt:用于优化机器学习算法 ...

  6. hyperopt中文文档:RelatedWork

    相关工作 Font Tian translated this article on 23 December 2017 与Hyperopt相关的软件链接,以及常用的贝叶斯优化工具. 使用Hyperopt ...

  7. hyperopt中文文档:Interfacing-With-Other-Languages(在其他语言中使用hyperopt)

    其他语言接口 Font Tian translated this article on 23 December 2017 两种接口策略 基本上有两种方法将 hyperopt 与其他语言进行连接: 你可 ...

  8. hyperopt中文文档:Installation-Notes安装说明

    安装说明 hyperopt安装说明 Font Tian translated this article on 23 December 2017 有关MongoDB的部分 Hyperopt要求mongo ...

  9. hyperopt中文文档:Recipes

    食谱(Recipes) Font Tian translated this article on 23 December 2017 如何对一些给定值的配置空间内的一些值进行采样ampling%2520 ...

最新文章

  1. Zbrush制作手榴弹案例讲解学习教程
  2. echarts python源码_基于Echarts的微代码开发平台SmartChart, 免费开源使用
  3. Xamarin Android教程Android基本知识版本介绍与系统介绍
  4. mac上投屏android_全平台Win/Mac全设备Android/iOS 免费无线投屏神器
  5. 如何获取握手包_白话详解TCP的三次握手到底做了些什么
  6. CMDB收集资产脚本
  7. @Scheduled
  8. 关于自动装箱和自动拆箱
  9. eoe·Android 开发门户 - android开发者的必备网站
  10. ros之旋转加平移公式
  11. Atitit 软件开发方法论 attilax著 艾龙 著 1. 1.3 软件工程方法 软件工程方法论分为软件开发方法论和软件组织方法论两个部分。 1 2. 软件开发方法的演进  SP DOP PAM
  12. 使用ActivityGroup类显示多个Activity
  13. 庞皓计量经济学第四版_庞皓计量经济学第4版笔记和课后答案
  14. UE4多人聊天框实现
  15. 按键精灵手机助手基本教程以及命令-1
  16. js【点击 div 2s 后颜色变成『粉色」】
  17. POJ-1144 Network——Trajan+割点
  18. 首次使用计算机 鼠标没反应,电脑鼠标没反应是怎么回事
  19. 参加第八届中国软件杯大学生软件设计大赛如何准备?以课工场为例!
  20. python最小二乘法_最小二乘法(least sqaure method)

热门文章

  1. Android - N级树形结构实现
  2. 爆款互联网人, 28岁的财富自由?
  3. 阿里面试题:如何检测并避免 Java 中的死锁?
  4. 记一次被DDoS敲诈的历程
  5. 从 0 开始手写一个 Mybatis 框架,三步搞定!
  6. 26 款阿里超神 Java 开源项目,看看你用过几个?
  7. 比学习新技术更重要的是思维的改变
  8. Spring 事务用法示例与实现原理
  9. 如何实现一个Java Class解析器
  10. Go语言TCP网络编程(详细)