Ошибка в 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 процессорах.
У меня заканчиваются идеи. Может ли кто-нибудь предложить способ достичь моей цели запуска функции пакетного пакетного пакета на параллельных процессорах?
Ответы
Ответ 1
Ошибка:
Error in unserialize(socklist[[n]]) : error reading from connection
означает, что мастер-процесс получил ошибку при вызове unserialize для чтения из подключения сокета к одному из рабочих. Вероятно, это означает, что соответствующий работник умер, таким образом, сбросив конец соединения сокета. К сожалению, он, возможно, умер по ряду причин, многие из которых очень специфичны для системы.
Обычно вы можете выяснить, почему работник умер, используя опцию makefile "outfile", чтобы сообщение об ошибке, сгенерированное рабочим, не выбрасывалось. Обычно я рекомендую использовать outfile=""
, как описано в этом ответе. Обратите внимание, что опция "outfile" работает одинаково как в снежном, так и в параллельном пакетах.
Вы также можете убедиться, что ваш цикл foreach работает правильно, когда выполняется последовательно, зарегистрировав последовательный бэкэнд:
registerDoSEQ()
Если вам повезет, цикл foreach не будет выполняться последовательно, поскольку обычно легче понять, что происходит не так.