iPython并行推送每个对象都很混乱

时间:2016-03-16 01:40:56

标签: python parallel-processing ipython ipython-parallel

我喜欢iPython笔记本,但是在使用ipyparallel进行并行处理时,使用dview.push(dict(...))将每个本地对象推送到引擎中似乎不是有效的方法。你有任何有效的替代方案吗?

我通常喜欢:

from IPython import parallel

rc = parallel.Client()
dview = rc[:]
dview.push(dict(x1=x1, x2=x2, ...., x100=x100)) # => I'd like to avoid this!!
res = dview.map_async(run_once, range(5))
map_result = res.get()
rc.close()

1 个答案:

答案 0 :(得分:2)

默认情况下,IPython Parallel在发送函数之前不会解析闭包。这意味着当您向引擎发送run_once并且run_once的正文查找x1时,它会在引擎上查找x1,而不是随身携带它是您客户端上x1的副本。这可能很有用,因为它可以让您通过更改x1在每个引擎上的含义来执行SPMD操作。例如,此代码段依赖rank在每个引擎上具有不同的值,以便正常工作:

dview.scatter('rank', rc.ids, flatten=True)

def mul_by_rank(x):
    return x * rank

dview.map_sync(mul_by_rank, range(len(rc)))

如果您确实希望在发送函数时解析闭包(即隐式发送x1,x2和run_once),则可以使用其他序列化库来执行此操作。其中一个版本是cloudpickle,您可以使用dview.use_cloudpickle()启用它(您必须先安装cloudpickle)。如果您这样做,那么run_once所依赖的局部变量应与run_once一起发送:

dview.use_cloudpickle()
dview.map_sync(run_once, range(5))