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))
我喜欢 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))