在 foreach 循环中使用 mclapply 出现 R 错误

Posted

技术标签:

【中文标题】在 foreach 循环中使用 mclapply 出现 R 错误【英文标题】:R error with mclapply in a foreach loop 【发布时间】:2016-05-31 04:23:04 【问题描述】:

基于this post here,我尝试写了一个脚本,看到这里:

library(parallel)
library(doParallel)

cl<-makeCluster(2,outfile='')
registerDoParallel(cl)

foreach(i=1:5, .packages='parallel') %dopar% 
    system.time(mclapply(1:10, function(x)rnorm(1e5),mc.cores=2))


stopCluster(cl)

它最初工作,但现在抛出错误代码:

Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(socklist[[n]]) : error reading from connection
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

知道发生了什么吗?甚至可以将 mclapply 放在 foreach 循环中吗?

编辑:我还想说这是在单个 8 核机器上,而不是集群上。

【问题讨论】:

【参考方案1】:

我能够仅使用 R 3.2.3 中的“并行”包在我的 Linux 机器上重现您的问题:

library(parallel)
cl <- makeCluster(2)
clusterEvalQ(cl, library(parallel))
fun <- function(i) 
  mclapply(1:10, function(x) rnorm(1e5), mc.cores=2)
  0

clusterApplyLB(cl, 1:5, fun)

从我的调试会话看来,主服务器和工作人员之间的套接字连接可能会损坏,这可能会导致工作人员在尝试从损坏的套接字连接“反序列化”数据时出错。

有趣的是,我可以通过使用“multicore”包而不是“parallel”来让这个示例工作。我使用以下命令从 RForge.net 安装了多核 0.1-8:

> install.packages('multicore',,'http://www.rforge.net/')  

然后,我在 worker 上加载了“多核”而不是“并行”:

clusterEvalQ(cl, library(multicore))

然后示例运行良好。您可以更改您的 foreach 循环以使用 .packages='multicore' 选项。

据我所知,这就是它。我的猜测是“并行”中由“mclapply”分叉的子进程以某种方式破坏了它们继承的套接字连接,但我没有查看代码来查看该理论是否合理。

我猜你的选择是:

    不要在“doParallel”foreach 循环中使用“mclapply” 使用“multicore 0.1-8”中的“mclapply”而不是“parallel” 将此问题报告给 R-Core

您必须做额外的工作才能将此报告给 R-Core,但希望我的示例会有所帮助。

【讨论】:

【参考方案2】:

我在使用 mclapply 进行并行计算时遇到了类似的错误。它以非常随机的方式偶尔发生。您可以按照其他答案的建议进行操作,但我所做的一个快速修复是让算法捕获此错误并重新运行命令。大多数情况下,如果您再次运行它,它将起作用。

【讨论】:

以上是关于在 foreach 循环中使用 mclapply 出现 R 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中绘图时用点进行 mclapply

mclapply 使用所有内核但不是所有线程

parallel::mclapply() 添加或删除对全局环境的绑定。哪个?

使用 mclapply 分割雪茄矢量的有效方法

使用 mclapply 或 %dopar% 从对角线切片组装矩阵,例如 Matrix::bandSparse

在 r 中使用 foreach 循环返回 NA