Подтвердить что ты не робот

Ошибка в unserialize (socklist [[n]]): ошибка чтения из соединения в Unix

Я попытался запустить следующий код на машине Unix с 20 CPU, используя пакеты R foreach, parallel, doParallel и party (моя цель состоит в том, чтобы функция party/varimp работала над несколько процессоров параллельно):

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

    w <- [email protected]
    perror <- matrix(0, nrow = nperm * length([email protected]), ncol = length(xnames))
    colnames(perror) <- xnames

    data = foreach(b = 1:length([email protected]), .packages = c("party","stats"), .combine = rbind) %dopar%
    {
        try({
            tree <- [email protected][[b]]
            oob <- [email protected][[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)
                      }
                      [email protected][[j]][which(oob)] <- [email protected][[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 процессорах.

У меня заканчиваются идеи. Может ли кто-нибудь предложить способ достичь моей цели запуска функции пакетного пакетного пакета на параллельных процессорах?

4b9b3361

Ответ 1

Ошибка:

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

означает, что мастер-процесс получил ошибку при вызове unserialize для чтения из подключения сокета к одному из рабочих. Вероятно, это означает, что соответствующий работник умер, таким образом, сбросив конец соединения сокета. К сожалению, он, возможно, умер по ряду причин, многие из которых очень специфичны для системы.

Обычно вы можете выяснить, почему работник умер, используя опцию makefile "outfile", чтобы сообщение об ошибке, сгенерированное рабочим, не выбрасывалось. Обычно я рекомендую использовать outfile="", как описано в этом ответе. Обратите внимание, что опция "outfile" работает одинаково как в снежном, так и в параллельном пакетах.

Вы также можете убедиться, что ваш цикл foreach работает правильно, когда выполняется последовательно, зарегистрировав последовательный бэкэнд:

registerDoSEQ()

Если вам повезет, цикл foreach не будет выполняться последовательно, поскольку обычно легче понять, что происходит не так.