iPython 并行推送每个对象很乱

iPython parallel pushing every objects is messy

我喜欢 iPython notebook 但在使用 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()

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))