hyperopt中文文档:Parallelizing-Evaluations-During-Search-via-MongoDB
通過(guò)MongoDB在搜索時(shí)進(jìn)行并行計(jì)算
Font Tian translated this article on 23 December 2017
Hyperopt旨在支持不同類(lèi)型的試用數(shù)據(jù)庫(kù)(Trials)。默認(rèn)試用數(shù)據(jù)庫(kù)(Trials)是用Python列表和字典實(shí)現(xiàn)的。但是雖然默認(rèn)實(shí)現(xiàn)很容易處理,卻不支持并行評(píng)估試驗(yàn)所需的異步更新。不過(guò)沒(méi)關(guān)系,對(duì)于并行搜索,hyperopt還包含一個(gè) MongoTrials 來(lái)支持異步更新。
因此想要進(jìn)行并行搜索,您需要執(zhí)行以下操作(在安裝 mongodb 之后):
在程序運(yùn)行的計(jì)算機(jī)可以鏈接的的地方啟動(dòng)一個(gè)mongod進(jìn)程,本地,遠(yuǎn)程都可以。
修改您的調(diào)用以 hyperopt.fmin 連接到該 mongod 進(jìn)程的 MongoTrials 模塊。
啟動(dòng)一個(gè)或多個(gè) hyperopt-mongo-worker 連接到 mongod 進(jìn)程的進(jìn)程,并在 fminblocks(塊) 進(jìn)行搜索。
1.啟動(dòng)一個(gè)mongod進(jìn)程
安裝mongodb 后啟動(dòng)一個(gè)數(shù)據(jù)庫(kù)進(jìn)程(mongod)十分簡(jiǎn)單,命令如下。(當(dāng)然,你也可以參考其他文檔,譯者注)
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 --nohttpinterfaceMongo會(huì)預(yù)先分配幾GB空間(你可以用 --noprealloc 來(lái)禁用這個(gè)空間)以獲得更好的性能,所以當(dāng)你想創(chuàng)建這個(gè)數(shù)據(jù)庫(kù)的位置請(qǐng)思考一下這個(gè)問(wèn)題。在遠(yuǎn)程創(chuàng)建數(shù)據(jù)庫(kù)不僅可能會(huì)給您的數(shù)據(jù)庫(kù)帶來(lái)糟糕的性能體驗(yàn),還會(huì)給網(wǎng)絡(luò)上的其他人帶來(lái)不好的體驗(yàn),請(qǐng)小心。
另外,如果你的機(jī)器可以連接互聯(lián)網(wǎng),那么也就可以綁定到 loopback 接口并通過(guò)ssh連接,或者讀取有關(guān)密碼保護(hù)的 mongodb 文檔。
本教程的其余部分則是基于運(yùn)行 mongo 端口1234的的本地主機(jī)。
2.使用 MongoTrials
為了演示程序本處使用math.sin函數(shù),然后通過(guò) hyperopt 來(lái)最小化該函數(shù)。示例如下:
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 的第一個(gè)參數(shù)是使用哪個(gè) mongod進(jìn)程,以及該進(jìn)程中的哪個(gè)數(shù)據(jù)庫(kù) (這里是 'foo_db' ) 。第二個(gè)參數(shù) (exp_key='exp_1') 用于某次實(shí)驗(yàn)的標(biāo)記(這樣可以在一個(gè)數(shù)據(jù)庫(kù)中保存多次試驗(yàn)),該參數(shù)是可選的。
注意目前有一個(gè)使用要求,數(shù)據(jù)庫(kù)名稱(chēng)后必須加上 “/ jobs” 字段。
無(wú)論是把你的試驗(yàn)放在一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)中,還是使用 exp_key 機(jī)制來(lái)區(qū)分它們都取決于你的代碼,都是可行的。單獨(dú)使用數(shù)據(jù)庫(kù)的好處在于可以從shell中操作它們(它們顯示為不同的文件),并確保實(shí)驗(yàn)擁有更好的獨(dú)立性/隔離性。使用exp_key的好處:hyperopt-mongo-worker進(jìn)程(請(qǐng)參閱下文)在數(shù)據(jù)庫(kù)級(jí)別進(jìn)行輪詢(xún),這樣可以在同一個(gè)數(shù)據(jù)庫(kù)中進(jìn)行多次試驗(yàn)。
3.運(yùn)行 hyperopt-mongo-worker
如果你運(yùn)行上面的代碼片段,你會(huì)發(fā)現(xiàn)它在調(diào)用 fmin 時(shí)阻塞(掛起) 。 在MongoTrials 內(nèi)部中- fmin 作為異步 trials 對(duì)象(an asynchronous trials object),所以 fmin 在建議新的搜索點(diǎn)時(shí)實(shí)際上并?不會(huì)評(píng)估度量函數(shù)。相反,它只是坐在那里,耐心等待另一個(gè)進(jìn)程做這個(gè)工作,然后更新MongoDB的結(jié)果。 包含在 bin 目錄中的hyperopt-mongo-worker 腳本就是為這個(gè)目的編寫(xiě)的。在你安裝hyperopt的時(shí)候,請(qǐng)確保它應(yīng)該加入你的 $PATH (環(huán)境變量)中。
你也可以在上面腳本中的調(diào)用 fmin 并被阻塞的同時(shí),打開(kāi)一個(gè)新的 shell 并輸入
hyperopt-mongo-worker --mongo=localhost:1234/foo_db --poll-interval=0.1它會(huì)從MongoDB中取出一個(gè)工作項(xiàng),同時(shí)評(píng)估 math.sin 函數(shù),并將結(jié)果存回?cái)?shù)據(jù)庫(kù)。在 fmin 函數(shù)傳入的運(yùn)行次數(shù)全部運(yùn)行完畢之后,它終止腳本并返回計(jì)算結(jié)果。然后 hyperopt-mongo-worker腳本會(huì)等待幾分鐘,等待更多的工作出現(xiàn),最后終止。
在這種情況下,我們最好還是顯式地設(shè)置適合我們程序的輪詢(xún)間隔,而默認(rèn)的時(shí)間設(shè)置是為了至少需要一兩分鐘完成的作業(yè)(搜索點(diǎn)評(píng)估)設(shè)置的。
MongoTrials 是一個(gè)持久對(duì)象
如果你再次運(yùn)行這個(gè)例子,
best = fmin(math.sin, hp.uniform('x', -2, 2), trials=trials, algo=tpe.suggest, max_evals=10)你會(huì)看到它立即返回,似乎沒(méi)有進(jìn)行任何計(jì)算。那是因?yàn)槟氵B接的數(shù)據(jù)庫(kù)之前已經(jīng)有足夠的嘗試(trials),程序默認(rèn)會(huì)直接調(diào)取原來(lái)的結(jié)果; 實(shí)際上在你運(yùn)行第一個(gè)實(shí)驗(yàn)時(shí)已經(jīng)計(jì)算了它們。而如果你想進(jìn)行一次新的搜索,你可以改變數(shù)據(jù)庫(kù)名稱(chēng)或者exp_key。如果你想擴(kuò)展本次搜索,那么你可以為了 max_evals 設(shè)置一個(gè)擁有更高數(shù)字的 fmin 。
又或者,您可以啟動(dòng)其他專(zhuān)門(mén)創(chuàng)建 MongoTrials 的進(jìn)程來(lái)分析數(shù)據(jù)庫(kù)中已用結(jié)果。而那些其他進(jìn)程根本不需要調(diào)用 fmin。
總結(jié)
以上是生活随笔為你收集整理的hyperopt中文文档:Parallelizing-Evaluations-During-Search-via-MongoDB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hyperopt中文文档:Interfa
- 下一篇: hyperopt中文文档:Recipes