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

Best way to pass local variables to ipyparallel cluster

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

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

this related question 中有更多细节,但要点是:交互式定义的模块在交互式命名空间 (__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 并行时,早期步骤之一是为引擎的命名空间播种:

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

如果您要以这种方式推送多个名称,可能是时候考虑在模块中定义这些函数,然后分发它们了。