foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?

Posted

技术标签:

【中文标题】foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?【英文标题】:foreach %dopar% uses sequential worker setup with PSock cluster? 【发布时间】:2012-12-21 09:32:12 【问题描述】:

问题

我注意到 foreach/%dopar% 在并行执行任务之前执行顺序,而不是并行设置集群。如果每个工作人员都需要一个数据集,并且将数据集传输给工作人员需要 N 秒,那么 foreach/%dopar% 将花费#workers * N seconds of setup 时间。这对于大量工作人员或大量 N(要传输的大型数据集)来说可能很重要。

我的问题是这是设计使然,还是我在 foreach 或集群生成中缺少某些参数/设置?

设置

R 2.15.2 截至今天(2013 年 1 月 7 日)的 foreach/parallel/doParallel 的最新版本 Windows 7 x64

示例

library( foreach )
library( parallel )
library( doParallel )

# lots of data
data = eval( rnorm( 100000000 ) )

# make cluster/register - creates 6 nodes fairly quickly
cluster = makePSOCKcluster( 6 , outfile = "" )
registerDoParallel( cluster  )

# fire up Task Manager.  Observer that each node recieves data sequentially.
# When last node gets data, then all nodes process at the same time
results = foreach( i = 1 : 500 )  %dopar%

    print( data[ i ] )
    return( data[ i ] )

【问题讨论】:

“顺序设置”是我在不使用共享内存集群的情况下遇到的唯一一种行为。如果有一种方法可以在没有共享内存的情况下加快速度,我也会非常感兴趣。但是,由于clusterExport()(通过clusterCall())是按顺序执行的,我想在那之前我不会屏住呼吸。 Ben - 你能详细说明一下吗?请原谅我对与操作系统/内存相关的事情的无知……在示例中,有 6 个子进程,我认为有机会并行向它们发送数据。是不是父进程只能按顺序访问该内部数据? 这已经接近我对集群通信知识的局限了,但是在类似unix的系统上,可以fork一个进程,允许子进程访问父进程中加载​​的对象,只能复制那些被修改的。 Windows 机器不具备这种特殊功能,并且对于我使用过的所有集群类型(不是全部),集群设置都是按顺序进行的。 本 - 谢谢!希望有人插话并行执行此操作的可能性。或者您观察到这一直是连续的,也许是因为没有其他方法可以做到这一点。 【参考方案1】:

感谢Revolution Computing 的Rich 提供帮助......

clusterCall 使用 for 循环向每个工作人员发送数据。因为 R 不是多线程的,所以 for 循环必须是顺序的。

有一些解决方案(需要有人编写代码)。 R 可以调用 C/C++ 来线程化 worker 设置。或者工作人员可以从磁盘上的文件中提取数据。或者,worker 可以在同一个套接字上侦听,master 可以只向套接字写入一次,然后将数据广播给所有 worker。

【讨论】:

感谢您发布回复!

以上是关于foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

R:在 foreach %dopar% 中显示错误和警告消息

使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””

如何在 R 中将“foreach”和“%dopar%”与“R6”类一起使用?

如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?

R:如何在 foreach %dopar% 中拆分数据帧