gpt4 book ai didi

python - scipy.optimize.fmin 的简单并行化

转载 作者:行者123 更新时间:2023-11-28 17:46:31 25 4
gpt4 key购买 nike

函数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 有可能被调用数万次,这会导致速度变慢或泄漏吗

最佳答案

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

尝试进行简单的调用以并行计算每个单纯形通常会减慢你的速度,除非你有一些非常非常昂贵的目标函数要计算。但是,如果您改为调用 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

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

关于python - scipy.optimize.fmin 的简单并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com