簡體   English   中英

scipy.optimize.fmin的朴素並行化

[英]Naive parallelization of scipy.optimize.fmin

函數scipy.optimize.fmin_bfgs允許用戶輸入目標函數和漸變。 由於我的桌面上有一台8核機器,我想我可以通過運行來並行化解算器

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的使用和con /破壞。 因為err_func_gradient可能會被調用數萬次, 這會導致某個地方的速度減慢或泄漏嗎?

你可以使用mystic ,它提供了一些scipy.optimize算法的並行版本,包括fmin和friends。

試圖做一個天真的調用,讓每個單獨的並行評估通常會減慢你的速度,除非你有一些非常昂貴的目標函數來計算。 但是,如果你改為調用fmin幾個實例,你實際上可以以最速下降的速度獲得pseduo-GLOBAL優化。 以下示例演示了一個已在多個pub中使用的算法(見下文): 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

Pub引用(略有過時): 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

對於初學者,您可以將漸變計算為

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

然后對所有偏導數計算一次f(x)。 這應該可以節省你一半的工作量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM