2016-11-11 2 views
0

Dans le code ci-dessous, j'essaie d'entraîner deux modèles auto.arima différents en parallèle sur différents cœurs. Je reçois l'erreur ci-dessous lorsque j'essaie d'exécuter le code. Je ne suis pas sûr si mon problème est avec do.call ou parLapply, aussi je suis assez nouveau pour le traitement parallèle donc tous les conseils sont très utiles.Formation de plusieurs modèles Auto.Arima en parallèle

Code: 
library("forecast") 
library("parallel") 

TList2<-list(x=tsd1, lambda = Tlambda, stepwise=TRUE, approximation = TRUE) 
DList2<-list(x=tsd2, lambda = Rlambda, stepwise=TRUE, approximation = TRUE) 

##Parallelizing ARIMA Model Training 

# Calculate the number of cores 
no_cores <- 1 

# Initiate cluster 
cl <- makeCluster(no_cores) 

ARIMA_List<-list(TList2,DList2) 

ARIMA_Models<-parLapply(cl, ARIMA_List, 
        function(x){do.call(auto.arima, args=x)}) 

stopCluster(cl) 


Error: 
Error in checkForRemoteErrors(val) : 
    one node produced an error: object 'auto.arima' not found 

Data: 

dput(TList2) 
structure(list(x = c(6, 15.5, 22, 16, NA, NA, 13, 13.5, 10, 6, 
14.5, 16, NA, 8, 11, NA, 2, 2, 10, NA, 9, NA, 11, 16, NA, 4, 
17, 7, 11.5, 22, 20.5, 10, 22, NA, 13, 17, 22, 9, 13, 19, 8, 
16, 18, 22, 21, 14, 7, 20, 21.5, 17), lambda = 0.999958829041611, 
    stepwise = TRUE, approximation = TRUE), .Names = c("x", "lambda", 
"stepwise", "approximation")) 

dput(DList2) 
structure(list(x = c(11, 4, 8, 11, 11, NA, 3, 2.5, 6, 11, 7, 
1, NA, 6, 6, NA, 6, 11, 3, NA, 11, NA, 10, 10, NA, NA, 9, 3, 
3, 11, 8, 10, NA, NA, 11, 10, 9, 3, 7, NA, 2, 4, 11, 2.5, 3, 
NA, 4, 7, 1, 5), lambda = 0.170065851742339, stepwise = TRUE, 
    approximation = TRUE), .Names = c("x", "lambda", "stepwise", 
"approximation")) 

Répondre

0

Je pense que forecast::auto.arima devrait être disponible sur les clusters, aussi, essayez donc par exemple en utilisant clusterEvalQ comme ceci:

TList2 <- structure(list(x = c(6, 15.5, 22, 16, NA, NA, 13, 13.5, 10, 6, 
14.5, 16, NA, 8, 11, NA, 2, 2, 10, NA, 9, NA, 11, 16, NA, 4, 
17, 7, 11.5, 22, 20.5, 10, 22, NA, 13, 17, 22, 9, 13, 19, 8, 
16, 18, 22, 21, 14, 7, 20, 21.5, 17), lambda = 0.999958829041611, 
    stepwise = TRUE, approximation = TRUE), .Names = c("x", "lambda", 
"stepwise", "approximation")) 

DList2<- structure(list(x = c(11, 4, 8, 11, 11, NA, 3, 2.5, 6, 11, 7, 
1, NA, 6, 6, NA, 6, 11, 3, NA, 11, NA, 10, 10, NA, NA, 9, 3, 
3, 11, 8, 10, NA, NA, 11, 10, 9, 3, 7, NA, 2, 4, 11, 2.5, 3, 
NA, 4, 7, 1, 5), lambda = 0.170065851742339, stepwise = TRUE, 
    approximation = TRUE), .Names = c("x", "lambda", "stepwise", 
"approximation")) 

library("forecast") 
library("parallel") 
cl <- makeCluster(no_cores) 
clusterEvalQ(cl, library(forecast)) 
ARIMA_List<-list(TList2,DList2) 
ARIMA_Models<-parLapply(cl, ARIMA_List, 
        function(x){do.call(auto.arima, args=x)}) 
stopCluster(cl) 
+0

Merci, qui a fait l'affaire! Je suis assez nouveau dans le traitement parallèle, est-ce que le code entraîne deux modèles simultanément sur 2 cœurs différents? Qu'a fait l'ajout de clusterEvalQ (cl, library (forecast))? – user6183069

+0

Je suis plutôt novice en informatique parallèle. Et j'ai mis en signet [this] (http://stackoverflow.com/questions/18357788/parallel-parlapply-setup) post, qui est plus ou moins une copie de la vôtre. Intuitivement, je dirais que si vous n'utilisez qu'un seul noyau, cela ne fait pas de différence. Mais si vous enregistrez plus, il devrait faire ce que vous attendez - lancer Arima en parallèle. – lukeA