【发布时间】:2013-07-03 19:07:12
【问题描述】:
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 的使用和破坏/破坏。由于err_func_gradient 有可能被调用数万次,这会导致速度变慢或在某处泄漏?
【问题讨论】:
-
我看过,但 scipy 似乎没有并行的非线性优化器。如果我错了,我会把它作为一个答案。
-
您不能创建一次
multiprocessing.Pool,然后将其作为附加参数传递给f和fprime吗?这样,您或许可以避免在每次迭代中构建/销毁池所涉及的开销。
标签: python parallel-processing scipy multiprocessing