2013-07-03 19 views
3

函數scipy.optimize.fmin_bfgs允許用戶輸入目標函數和漸變。因爲我有一個8芯機我的桌面上,我想我可以並行求解器運行scipy.optimize.fmin的天真並行化

from scipy import optimize 
import itertools 
import numpy as np 

def single_grad_point((idx,px)): 
    p = px.copy() 
    epsilon = 10**(-6.0) 
    p[idx] += epsilon 
    d1 = err_func(p) 
    p[idx] -= 2*epsilon 
    d2 = err_func(p) 
    return (d1-d2)/(2*epsilon) 

def err_func_gradient(p): 
    P = multiprocessing.Pool() 
    input_args = zip(*(xrange(len(p)), itertools.cycle((p,)))) 
    sol = P.imap(single_grad_point, input_args) 
    return np.array(list(sol)) 

optimize.fmin_bfgs(err_func, p0, fprime=err_func_gradient) 

概括地說,我使用的多計算梯度的每個方向。如果目標功能err_func很貴,這似乎可以大大加快速度。然而,我的問題是關於所有multiprocessing.Pools的使用和銷燬。由於err_func_gradient可能會被稱爲幾萬次,因此會導致放緩或泄漏

+0

我已經看了,但SciPy的似乎並不具有平行的非線性優化。如果我錯了,我會把它當作答案來代替。 – Hooked

+0

你能不能創建'multiprocessing.Pool'一次,然後把它作爲一個額外的參數'F'和'fprime'?這樣,您可以避免在每次迭代中構建/銷燬池所涉及的開銷。 –

回答

5

您可以使用mystic,它提供了幾個scipy.optimize算法的並行版本,包括fmin和朋友。

試圖做一個天真的通話讓每個並行計算單純的通常是要你慢下來,除非你有一些非常非常昂貴的目標函數來計算。但是,如果您調用fmin的多個實例,則實際上可以以最陡下降的速度獲得pseduo-GLOBAL優化。下面的例子表明,已經在幾個酒吧被使用的算法(見下文): https://github.com/uqfoundation/mystic/blob/master/examples/buckshot_example06.py

或者類似地,看這裏的例子:使用的multiprocessing叉子:https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_mpmap.py

parallelpython叉子(分佈式並行計算): https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_ppmap.py

或使用的mpi4py擴展: https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_mpimap.py

獲取mystic(解算器框架)和pathos(並行計算架構)位置: https://github.com/uqfoundation

酒吧引用(均略顯過時): http://conference.scipy.org/proceedings/scipy2011/mckerns.html http://trac.mystic.cacr.caltech.edu/project/mystic/wiki/Publications

但是,如果你想做的事fmin的更天真的版本,最好的方法是隻初始化並加載一次pool。這就是pathos已經爲您提供的內容,但是如果您想自己編寫代碼,只需將pool的實例保存爲單例。 https://github.com/uqfoundation/pathos/blob/master/pathos/multiprocessing.py

+0

我找不到關於並行版本上'mystic'任何參考:http://pydoc.net/Python/mystic/0.2a1/mystic.scipy_optimize/。只是使用'scipy_optimize.fmin'並不會立即導致求解器中的多個進程。 – FooBar

+0

github存儲庫中存在幾個示例,具體來說就是這個:https://github.com/uqfoundation/mystic/blob/master/examples/buckshot_example06.py請注意,所有需要的是使用'solver.SetMapper'。或者如果您使用的是基於總體的求解器,那麼可以並行化每一代 - 但後者通常只在目標非常昂貴時才能正常工作。 –

+0

這些都不適合我,可能是因爲我沒有正確安裝mystic。我不想破壞這個答案,但也許你可以看看這裏:http://stackoverflow.com/questions/37455709/mystic-version-lacks-many-features-from-the-git-repository – FooBar

-3

對於初學者來說,可以calc下的梯度作爲

(F(X)-f(X + EPS))/ EPS

然後,計算的F(X)一次所有偏微分。這應該可以爲您節省一半的工作量