【问题标题】:weird behavior of multiprocessing scipy optimization inside of a function函数内部多处理 scipy 优化的奇怪行为
【发布时间】:2017-02-08 04:37:13
【问题描述】:

这是一个运行良好的简单代码。即使函数 minimize 包装了 scipy.optimize.minimize 它也不会抱怨酸洗

import numpy as np
from scipy import optimize
from multiprocessing import Pool

def square(x):
    return np.sum(x**2+ 2*x)

def minimize(args):
    f,x = args
    res = optimize.minimize(f, x, method = 'L-BFGS-B')
    return res.x

x = np.random.rand(8,10)

args = [(square,x[i]) for i in range(8)]
p = Pool(8)
p.map(minimize,args)

但是,如果尝试以下操作会失败并出现酸洗错误

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

def run():
    def square(x):
        return np.sum(x**2+ 2*x)

    def minimize(args):
        f,x = args
        res = optimize.minimize(f, x, method = 'L-BFGS-B')
        return res.x

    x = np.random.rand(8,10)

    args = [(square,x[i]) for i in range(8)]
    p = Pool(8)
    p.map(minimize,args)

run()

我想制作一个模块以与许多初始猜测同时使用 scipy 最小化。但是,如示例所示,当我将其设为模块时,它会失败。

【问题讨论】:

  • pickle 模块只能选择顶级函数。在您的第二个示例中,square 不是顶级函数,因此无法腌制它。
  • 谢谢@dano。但是如果我开箱即用,也会出现同样的错误。我的意思是在 run() 的定义之前。它不是让它成为顶级的吗?
  • 您必须与minimize 相同,因为您也将其传递给map。抱歉,一开始就应该注意到这一点。
  • 哦,太好了。谢谢@dano

标签: python optimization parallel-processing scipy multiprocessing


【解决方案1】:

问题是 Python 无法腌制嵌套函数,在第二个示例中,您试图将嵌套的 minimizesquare 函数传递给需要腌制的子进程。

如果没有理由必须嵌套这两个函数,将它们移到模块的顶层将解决问题。您还可以查看 this question 了解腌制嵌套函数的技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2012-08-17
    • 2017-11-25
    • 2012-11-27
    • 2017-11-29
    相关资源
    最近更新 更多