是什么影响使用并行包创建集群的时间?

时间:2014-05-08 11:12:15

标签: r parallel-processing

使用parallel包创建群集时,我遇到了缓慢的问题。

这是一个只创建然后停止具有n个节点的PSOCK群集的函数。

library(parallel)
library(microbenchmark)
f <- function(n)
{
  cl <- makeCluster(n)
  on.exit(stopCluster(cl))
}
microbenchmark(f(2), f(4), times = 10)
## Unit: seconds
##  expr      min       lq   median       uq      max neval
##  f(2) 4.095315 4.103224 4.206586 5.080307 5.991463    10
##  f(4) 8.150088 8.179489 8.391088 8.822470 9.226745    10   

我的机器(运行Win 7 Pro的相当现代的4核工作站)创建一个双节点集群大约需要4秒钟,创建一个四节点集群需要8秒钟。这让我觉得太慢,所以我在同事的同一台机器上尝试了相同的分析,两次测试分别花了一两秒钟。

这表示我可能在我的机器上设置了一些奇怪的配置,或者存在其他一些问题。我阅读了?makeClustersocketConnection帮助页面,但没有看到任何与提高性能相关的内容。

在代码运行时,我查看了Windows任务管理器:没有明显的干扰反病毒或其他软件,只是一个Rscript进程运行在~17%(少于一个核心)。

我不知道在哪里找到问题的根源。在Windows下创建PSOCK群集是否有任何已知的缓慢原因?

创建4节点集群8秒实际上是否很慢(按2014标准),还是我的期望值太高?

1 个答案:

答案 0 :(得分:14)

为了监控发生的事情,我安装并打开了Process Monitor(HT @qethanm)。我也退出系统托盘中的大部分内容,如Dropbox,以减少噪音。 (虽然最后,这并没有什么不同。)

然后我直接从R GUI(而不是IDE)重新运行问题中的R代码的简化版本。

microbenchmark(f(4), times = 5)

经过一番挖掘后,我注意到R GUI为它创建的每个集群产生了一个Rscript进程(见图)。

the process tree shows an Rscript instance for each node in each cluster

在经历了许多死胡同和疯狂追逐之后,我发现也许这些Rscript实例不是香草R.我重命名了我的Rprofile.site文件以隐藏它并重复基准。

这一次,平均在不到一秒的时间内创建了一个4节点集群。

对于四节点群集,Rprofile.site文件(可能是个人启动文件,~/.Rprofile(如果存在)会被读取四次,这会大大减慢速度。将rscript_args = c("--no-init-file", "--no-site-file", "--no-environ")传递给makeCluster以避免此行为。