传递局部变量到ipyparallel集群的最佳方式



我在一个ipython笔记本中运行一个模拟,它由七个相互依赖的函数组成,需要13个不同的参数。有些函数在其他函数中调用,以允许一个函数运行整个模拟。模拟涉及操作两个参数,总共>20k次迭代。两个模拟可以异步运行。由于每次迭代大约需要1.5秒,所以我正在研究并行处理。

当我第一次尝试ipyparallel时,我得到一个全局名称未定义的错误。局部对象不能在worker中找到是有道理的。为了避免花费大量时间进入兔子洞,将一大堆对象传递给所有工人的最简单方法是什么?当以这种方式使用ipyparallel时,还有其他需要考虑的问题吗?

在这个相关的问题中有更多的细节,但要点是:交互定义的模块在交互命名空间(__main__)中解析,这在引擎和客户端上是不同的。您可以使用view.push(dict(func=func, func2=func2))将函数发送到引擎,在这种情况下,它们将被找到。另一种方法是在模块或包中定义函数,确保在所有引擎上都安装了该模块或包。

例如:

def bar(x):
    return x * x
def foo(y):
    return bar(y)
view.apply(foo, 5) # NameError on bar
view.push(dict(bar=bar)) # send bar
view.apply(foo, 5) # 25

通常在笔记本或更大的脚本中使用IPython parallel时,早期的步骤之一是播种引擎的命名空间:

rc[:].push(dict(
    f1=f1,
    f2=f2,
    const=const,
))

如果你有多个名字要这样推送,可能是时候考虑在模块中定义这些函数,并将其分发。

最新更新