函数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/destruction。既然err_func_gradient可能被称为数万次,这会导致某个地方的减速或泄漏吗?

最佳答案

您可以使用mystic,它提供了几个scipy.optimize算法的并行版本,包括fmin和friends。
尝试做一个简单的调用来并行计算每个单纯形通常会减慢速度,除非你有一些非常昂贵的目标函数要计算。然而,如果您调用几个fmin实例,实际上可以在最快下降速度下获得psedoo全局优化。下面的示例演示了在多个酒吧中使用的算法(请参见下文):
https://github.com/uqfoundation/mystic/blob/master/examples/buckshot_example06.py
或者类似地,看看这里的示例:使用multiprocessinghttps://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_mpmap.py的fork
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

10-05 18:29