将局部变量传递给 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,
))
如果您要以这种方式推送多个名称,可能是时候考虑在模块中定义这些函数,然后分发它们了。
我运行在 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,
))
如果您要以这种方式推送多个名称,可能是时候考虑在模块中定义这些函数,然后分发它们了。