2016-09-05 1 views
0

C'est la première fois que j'utilise le traitement parallèle en général. La question concerne principalement ma mauvaise syntaxe. Je voudrais un peu d'aide pour capturer la sortie pour un grand nombre d'itérations de cv.glmnet, car je crois que j'ai construit cv_loop_run pour être très inefficace. Ceci, avec le nombre de lambdas étant 10k conduit à une matrice massive qui prend toute ma mémoire et provoque un accident. En substance, ce dont j'ai besoin est le minimum et le 1se lambda par chaque série (1000 d'entre eux, pas tous les 10.000). Donc, au lieu d'avoir une liste de 1kx10k capturée pour cv_loop_run, j'aurais une liste longue de 1k.cv.glmnet parallèle et problème de mémoire

registerDoParallel(cl=8,cores=4) 
    cv_loop_run<- rbind(foreach(r = 1:1000, 
           .packages="glmnet", 
           .combine=rbind, 
           .inorder =F) %dopar% { 

         cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld, 
              nlambda = 10000, 
              alpha = 1, #FOR LASSO 
              grouped = FALSE, 
              parallel= TRUE 
             ) 

                } 
        ) 
    l_min<- as.matrix(unlist(as.matrix(cv_loop_run[,9 ,drop=FALSE]))) # matrix #9 is lamda.min 

    l_1se<- as.matrix(unlist(as.matrix(cv_loop_run[,10 ,drop=FALSE]))) # matrix #10 is lamda.1se 
+0

Si vous regardez le code de 'cv.glmnet', quand' parallèle = TRUE', il existe déjà un '' foreach'% dopar% 'boucle. Par conséquent, (je peux me tromper mais) je ne crois pas que vous obtiendrez des performances accrues de l'encapsulation de la fonction cv.glmnet dans une autre boucle 'foreach''% dopar'. C'est comme avoir deux boucles 'foreach' parallèles imbriquées, où votre boucle interne utilise déjà tous les cœurs. – jav

+0

@jav La boucle interne, pour laquelle j'ai déjà défini les boucles parallel = TRUE à travers les 1000 lambdas. La boucle externe% dopar% parcourt 10 000 cycles cv.glmnet. –

Répondre

0

Ok, donc je l'ai trouvé moi-même. Tout ce que j'ai à faire est de restreindre la sortie de chaque exécution de cv.glmnet. De cette façon, seulement le minimum et le 1se lambdas sont récupérés à chaque course. Cela signifie que ceci:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld, 
             nlambda = 10000, 
             alpha = 1, #FOR LASSO 
             grouped = FALSE, 
             parallel= TRUE 
            ) 

devient ceci:

cv_run <-cv.glmnet(X_predictors,Y_dependent,nfolds=fld, 
             nlambda = 10000, 
             alpha = 1, #FOR LASSO 
             grouped = FALSE, 
             parallel= TRUE 
            )[9:10]