R中的doParallel错误:序列化中的错误(数据,节点$ con):写入连接时出错

wol*_*oor 19 parallel-processing r

这是我的代码.循环中的东西是有道理的.

        library(foreach)
        library(doParallel)
        cl <- makeCluster(7)
        registerDoParallel(cl) 

        elasticitylist = foreach(i=1:nhousehold) %dopar% {

            pricedraws = out$betadraw[i,12,] 
            elasticitydraws[,,i]= probarray[,,i] %*% diag(pricedraws)
            elasticitydraws[,,i] = elasticitydraws[,,i] * as.vector(medianpricemat)

        } 
Run Code Online (Sandbox Code Playgroud)

我一直收到这个错误:

Error in serialize(data, node$con) : error writing to connection
Run Code Online (Sandbox Code Playgroud)

我知道我有足够的核心(有20个).有人能帮忙吗?似乎答案无处可在文档中找到!

当我ps -ef| grep user在我的unix服务器上运行时,我得到:

/apps/R.3.1.2/lib64/R/bin/exec/R --slave --no-restore -e parallel:::.slaveRSOCK() --args MASTER=localhost PORT=11025 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
Run Code Online (Sandbox Code Playgroud)

Ste*_*ton 13

的功能serializeunserialize由主处理称为使用套接字群集时与工人进行通信.如果从这些功能中的任何一个中获得错误,通常意味着至少有一名工人已经死亡.在Linux机器上,它可能已经死亡,因为机器几乎没有内存,因此内存不足的杀手决定杀死它,但还有许多其他可能性.

我建议您outfile=""在创建集群对象时使用makeCluster 选项,以便显示worker的输出.如果你很幸运,你会在工作人员死亡之前收到一条错误信息,以帮助你解决问题.

  • 我的朋友说这是因为当你试图让输出的内存太高时,它的错误通常与你拥有多少RAM无关.你知道这个方法吗? (5认同)

Ody*_*aca 8

当我尝试使用机器的所有 8 个内核时,我遇到了同样的问题。当我打开一个时,问题就消失了。我相信系统需要 1 个核心来处理保持打开的服务任务,否则您会收到错误消息:

library(doParallel)
#Find out how many cores are available (if you don't already know)
cores<-detectCores()
#Create cluster with desired number of cores, leave one open for the machine         
#core processes
cl <- makeCluster(cores[1]-1)
#Register cluster
registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)

  • 我不认为导致错误的原因是核心数量。我注意到,当我处理大文件 (4+Gb) 并使用“doParallel”时,我需要减少使用的内核数量,否则我的内存不足。所以问题可能是太多的内核使用了太多的内存而引发错误。任何有更多知识的人都可以确认/反驳/解释这一点吗? (6认同)
  • `doParallel` 很可能将所有数据从 master 复制到 slave。因此,内存需求将随内核数量线性增长。master 和 slaves 都来自同一个内存池,所以突破内存限制并不难。 (2认同)

Abd*_*han 6

您分配的每个核心都会消耗内存。因此,核心越多意味着需要更多内存,一旦用完内存,您就会收到此错误。所以我的建议是减少并行化的核心数量。

我自己有 8 个核心和 32 GB 可用内存,我自己尝试使用 7 个核心,然后是 6 个核心,但遇到了类似的错误。之后我决定只使用 4 个核心,因为它消耗了大约 70% 的内存:-

在此输入图像描述

多 1 个核心可能就可以了。

PS: 不要介意画质。


Ann*_*nna 5

我从下面收到了类似的错误,我提前终止了模型训练,然后尝试再次运行它。这是一个例子,我正在使用caret包来训练模型,但我认为它适用于涉及并行处理的任何应用程序。

> cluster <- makeCluster(10)
> registerDoParallel(cluster)
> train(... , trControl = trainControl(allowParallel = T)
# Terminated before complete
> train(... , trControl = trainControl(allowParallel = T)
Error in serialize(data, node$con) : error writing to connection
Run Code Online (Sandbox Code Playgroud)

我关闭了集群并重新启动它:

stopCluster(cluster)
registerDoSEQ()
cluster <- makeCluster(10)
registerDoParallel(cluster)
Run Code Online (Sandbox Code Playgroud)

再次运行模型时没有看到错误。有时将其关闭然后重新打开确实可能是解决方案。