Hoo*_*ked 3 python parallel-processing multiprocessing scipy
该功能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)
Run Code Online (Sandbox Code Playgroud)
简而言之,我正在使用多处理来计算渐变的每个方向.如果目标函数err_func很昂贵,这似乎可以获得大幅加速.然而,我的问题是关于所有的使用和控制/破坏multiprocessing.Pools.因为有可能err_func_gradient被称为成千上万次,这会导致某个地方的减速或泄漏吗?
您可以使用mystic,它提供一些scipy.optimize算法的并行版本,包括fmin和朋友.
试图做一个天真的调用,让每个单独的并行评估通常会减慢你的速度,除非你有一些非常昂贵的目标函数来计算.但是,如果你改为调用几个实例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
| 归档时间: |
|
| 查看次数: |
1825 次 |
| 最近记录: |