【问题标题】:cv.glmnet parallel and memory issuecv.glmnet 并行和内存问题
【发布时间】:2017-01-13 01:38:15
【问题描述】:

这是我第一次使用并行处理。问题主要是我的语法不好。

我希望在捕获大量 cv.glmnet 迭代的输出方面得到一些帮助,因为我相信我构建的 cv_loop_run 效率非常低。这与 10k 的 lambda 数量一起导致了一个巨大的矩阵,它占用了我所有的内存并导致崩溃。本质上,我需要的是每次运行的 minimum1se lambda(其中 1000 个,而不是全部 10,000 个)。因此,我不会为 cv_loop_run 捕获一个 1kx10k 的列表,而是得到一个 1k 长的列表。

  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

【问题讨论】:

  • 如果你看cv.glmnet的代码,当parallel = TRUE时,已经有一个foreach%dopar%循环。因此,(我可能是错的,但是)我不相信将 cv.glmnet 函数包装在另一个 foreach %dopar 循环中会提高性能。这就像有两个嵌套的并行 foreach 循环,您的内部循环已经使用了所有内核。
  • @jav 内部循环,我已经为其设置了 parallel = TRUE 循环通过 1,000 个 lambda。外部 %dopar% 循环正在循环 10,000 次 cv.glmnet 运行。

标签: r cross-validation glmnet parallel-foreach doparallel


【解决方案1】:

好的,所以我自己找到了。我所要做的就是限制每个 cv.glmnet 运行的输出。这样,每次运行只会获取最小值和 1se lambda。这意味着:

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

变成这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2011-08-11
    • 1970-01-01
    • 2011-03-22
    • 2012-11-06
    相关资源
    最近更新 更多