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