web-dev-qa-db-fra.com

erreur doParallel dans R: erreur de sérialisation (data, noeud $ con): erreur lors de l'écriture de la connexion

Ceci est mon code. Le contenu de la boucle est logique. 

        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)

        } 

Je continue à avoir cette erreur:

Error in serialize(data, node$con) : error writing to connection

Je sais que j'ai assez de noyaux (il y en a 20). Quelqu'un peut-il aider avec ça? Il semble que la réponse ne se trouve nulle part dans la documentation!

Lorsque je lance ps -ef| grep user sur mon serveur unix, je reçois:

/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
13
wolfsatthedoor

Les fonctions serialize et unserialize sont appelées par le processus maître pour communiquer avec les opérateurs lors de l'utilisation d'un cluster de sockets. Si vous obtenez une erreur de l'une de ces fonctions, cela signifie généralement qu'au moins un des travailleurs est décédé. Sur une machine Linux, elle est peut-être morte parce que la machine manquait presque de mémoire. Le tueur à court de mémoire a donc décidé de la tuer, mais il existe de nombreuses autres possibilités.

Je vous suggère d'utiliser l'option makeCluster outfile="" lors de la création de l'objet cluster afin que la sortie des ouvriers soit affichée. Si vous êtes chanceux, vous recevrez un message d'erreur d'un travailleur avant sa mort qui vous aidera à résoudre le problème.

10
Steve Weston

J'ai eu le même problème lorsque j'ai essayé d'utiliser les 8 cœurs de ma machine. Quand j'en ai laissé un ouvert, le problème a disparu. Je crois que le système nécessite 1 cœur pour les tâches de service laissées ouvertes, sinon vous obtiendrez une erreur: 

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)
4
Odysseus Ithaca

J'ai reçu une erreur similaire de ce qui suit, où je me suis arrêté plus tôt par la formation de modèle, puis j'ai essayé de l'exécuter à nouveau. Voici un exemple. J'utilise le package caret pour former un modèle, mais je pense qu'il est applicable à toute application dans laquelle un traitement en parallèle est impliqué.

> 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

J'ai fermé le cluster et l'ai réinitialisé:

stopCluster(cluster)
registerDoSEQ()
cluster <- makeCluster(10)
registerDoParallel(cluster)

N'a pas vu l'erreur lors de l'exécution du modèle à nouveau. Parfois, l'éteindre et le rallumer peut vraiment être la solution.

0
Anna

Après avoir reçu ce message d'erreur, j'ai changé mon code en boucle non parallèle. Ensuite, j'ai reçu un message d'erreur "Impossible d'attribuer un vecteur de taille *** Gb". Je suppose que les échecs parallèles peuvent être causés par la même raison, simplement un message d'erreur différent.

0
Jfly