gpt4 book ai didi

python - IPython 并行计算命名空间问题

转载 作者:太空狗 更新时间:2023-10-30 02:22:08 24 4
gpt4 key购买 nike

我一直在阅读和重新阅读 IPython 文档/教程,但我无法找出这段特定代码的问题。似乎函数 dimensionless_run 对交付给每个引擎的命名空间不可见,但我很困惑,因为该函数定义在 __main__ 中,并且很明显作为全局命名空间的一部分可见。

wrapper.py:

import math, os

def dimensionless_run(inputs):
output_file = open(inputs['fn'],'w')
...
return output_stats

def parallel_run(inputs):
import math, os ## Removing this line causes a NameError: global name 'math'
## is not defined.
folder = inputs['folder']
zfill_amt = int(math.floor(math.log10(inputs['num_iters'])))
for i in range(inputs['num_iters']):
run_num_str = str(i).zfill(zfill_amt)
if not os.path.exists(folder + '/'):
os.mkdir(folder)
dimensionless_run(inputs)
return

if __name__ == "__main__":
inputs = [input1,input2,...]
client = Client()
lbview = client.load_balanced_view()
lbview.block = True
for x in sorted(globals().items()):
print x
lbview.map(parallel_run,inputs)

ipcluster start --n=6 之后执行这段代码会生成排序后的全局字典,包括 mathos 模块,以及parallel_rundimensionless_run 函数。这之后是一个 IPython.parallel.error.CompositeError: one or more exceptions from call to method: parallel_run,它由大量的 [n:apply]: NameError: global name 'dimensionless_run' is not已定义,其中 n 从 0-5 运行。

有两件事我不明白,但它们之间有明显的联系。

  1. 为什么代码不识别全局命名空间中的dimensionless_run
  2. 为什么 import math, os 是必要的 inside parallel_run 的定义?

已编辑: 结果证明这根本不是命名空间错误——我在一个没有命名空间的目录中执行 ipcluster start --n=6包含代码。要修复它,我需要做的就是在我的代码目录中执行启动命令。我还通过添加行来修复它:

    inputs = input_pairs
os.system("ipcluster start -n 6") #NEW
client = Client()
...
lbview.map(parallel_run,inputs)
os.system("ipcluster stop") #NEW

在正确的位置启动所需的集群。

最佳答案

这主要是 Python name space issues with IPython.parallel 的副本,其中有更详细的答案,但要点:

当客户端向引擎发送parallel_run 时,它只是发送该函数,而不是定义该函数的整个命名空间(__main__ 模块)。因此,当运行远程 parallel_run 时,对 mathosdimensionless_run 的查找将首先在 locals 中查找()(已经在函数中定义的内容,即您的函数内导入),然后在 globals() 中,即 __main__ 模块在引擎上

有多种方法可以确保名称在引擎上可用,但最简单的方法可能是明确定义/将它们发送到引擎(交互式命名空间 __main__在引擎上,就像在 IPython 中一样):

client[:].execute("import os, math")
client[:]['dimensionless_run'] = dimensionless_run

在运行之前,在这种情况下,一切都应该按预期进行。

这是交互式/在脚本中定义的模块特有的问题 - 如果此文件是模块而不是脚本,则不会出现,例如

from mymod import parallel_run
lbview.map(parallel_run, inputs)

在这种情况下,globals() 是模块全局变量,通常到处都是相同的。

关于python - IPython 并行计算命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304847/

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