web-dev-qa-db-ja.com

unserialize(socklist [[n]])のエラー:Unixの接続からの読み取りエラー

R foreachparalleldoParallel、およびpartyパッケージを使用して、20 CPUのUnixマシンで次のコードを実行してみました(私の目的はparty/varimp関数を複数のCPUで並行して動作させるには):

parallel_compute_varimp <- function (object, mincriterion = 0, conditional = FALSE, threshold = 0.2, 
    nperm = 1, OOB = TRUE, pre1.0_0 = conditional) 
{
    response <- object@responses
    input <- object@data@get("input")
    xnames <- colnames(input)
    inp <- initVariableFrame(input, trafo = NULL)
    y <- object@responses@variables[[1]]
    error <- function(x, oob) mean((levels(y)[sapply(x, which.max)] != y)[oob])

    w <- object@initweights
    perror <- matrix(0, nrow = nperm * length(object@ensemble), ncol = length(xnames))
    colnames(perror) <- xnames

    data = foreach(b = 1:length(object@ensemble), .packages = c("party","stats"), .combine = rbind) %dopar%
    {
        try({
            tree <- object@ensemble[[b]]
            oob <- object@weights[[b]] == 0

            p <- .Call("R_predict", tree, inp, mincriterion, -1L, PACKAGE = "party")

            eoob <- error(p, oob)

            for (j in unique(varIDs(tree))) {
                for (per in 1:nperm) {
                    if (conditional || pre1.0_0) {
                      tmp <- inp
                      ccl <- create_cond_list(conditional, threshold, xnames[j], input)
                      if (is.null(ccl)) {
                        perm <- sample(which(oob))
                      }
                      else {
                        perm <- conditional_perm(ccl, xnames, input, tree, oob)
                      }
                      tmp@variables[[j]][which(oob)] <- tmp@variables[[j]][perm]
                      p <- .Call("R_predict", tree, tmp, mincriterion, -1L, PACKAGE = "party")
                    }
                    else {
                      p <- .Call("R_predict", tree, inp, mincriterion, as.integer(j), PACKAGE = "party")
                    }
                    perror[b, j] <- (error(p, oob) - eoob)
                }
            }

            ########
            # return data to the %dopar% loop data variable
            perror[b, ]
            ########

        }) # END OF TRY
    } # END OF LOOP WITH PARALLEL COMPUTING

    perror = data
    perror <- as.data.frame(perror)
    return(MeanDecreaseAccuracy = colMeans(perror))
}

environment(parallel_compute_varimp) <- asNamespace('party')


cl <- makeCluster(detectCores())
registerDoParallel(cl, cores = detectCores())
<...>
system.time(data.cforest.varimp <- parallel_compute_varimp(data.cforest, conditional = TRUE))

しかし、エラーが発生します:

> system.time(data.cforest.varimp <- parallel_compute_varimp(data.cforest, conditional = TRUE))
Error in unserialize(socklist[[n]]) : error reading from connection
Timing stopped at: 58.302 13.197 709.307

コードは、4つのCPUでより小さなデータセットを処理していました。

アイデアが足りません。誰かが並列CPUでパーティーパッケージの変動関数を実行するという私の目標に到達する方法を提案できますか?

23
Timothée HENRY

エラー:

Error in unserialize(socklist[[n]]) : error reading from connection

これは、マスタープロセスがunserializeを呼び出してソケット接続からワーカーの1つに読み取るときにエラーが発生したことを意味します。これはおそらく、対応するワーカーが死亡したために、ソケット接続のその端が削除されたことを意味します。残念ながら、それはいくつかの理由で死んだ可能性があり、その多くはシステム固有のものです。

通常、ワーカーが生成したエラーメッセージが破棄されないように、makeClusterの「outfile」オプションを使用してワーカーが停止した理由を理解できます。私は通常、outfile=""説明どおり この回答では 。 「outfile」オプションは、snowパッケージとparallelパッケージの両方で同じように機能することに注意してください。

シーケンシャルバックエンドを登録することにより、シーケンシャルに実行されたときにforeachループが正しく機能することを確認することもできます。

registerDoSEQ()

運が良ければ、順次実行するとforeachループが失敗します。通常、何が問題になっているのかを理解するのが簡単だからです。

34
Steve Weston