【问题标题】:Use parLapply for nlminb对 nlminb 使用 parLapply
【发布时间】:2018-08-25 10:48:03
【问题描述】:

虽然有几个问题需要parLapply,但我找不到当前任务的答案...

我尝试在 B 引导样本矩阵列表上使用 parLapply。根据选择的转换(内差或一阶差),我使用 nlminb( ) 来最大化对数似然度。

问题如果我运行代码,核心找不到 SFM.within 或 SFM.firstDiff。 SFM.within 和 SFM.firstDiff 是我的 fepsfrontieR 包中的复杂函数。

问题:如何为集群提供我的功能?

请在下面找到代码。请原谅缺少的示例数据,因为我相信有经验的 parLapply 用户可以轻松回答这个问题......

no_of_cores = detectCores()
cl = makeCluster(no_of_cores, type="PSOCK")


clusterExport(cl, c("myPar", "lowerInt", "Time", "N", "bootListMat", "mu", "optim", "K", "R", "method", "cumTime"))

if (method == "within"){
    bootEstimates <- parLapply (cl = cl, bootListMat, function(x) nlminb(lower = lowerInt,
                                                      start = myPar,
                                                      Time = Time,
                                                      N = N,
                                                      xv = as.matrix (x[, 2:(2+K-1)]),
                                                      y = as.matrix (x[, 1]),
                                                      z = as.matrix (x[, (2+K):cols]),
                                                      mu = mu,
                                                      optim = optim,
                                                      K = K, R = R,
                                                      objective = SFM.within,
                                                      cumTime = cumTime
                                                      )$par)  # we want only the estimates   } else {
    bootEstimates <- parLapply (cl = cl, bootListMat, function(x) nlminb(lower = lowerInt,
                                                             start = myPar,  # TBD by Rouven
                                                             Time = Time,
                                                             N = N,
                                                             xv = as.matrix (x[, 2:(2+K-1)]),
                                                             y = as.matrix (x[, 1]),
                                                             z = as.matrix (x[, (2+K):cols]),
                                                             mu = mu,
                                                             optim = optim,
                                                             K = K, R = R,
                                                             objective = SFM.firstDiff,
                                                             cumTime = cumTime
                                                             )$par)  # we want only the estimates
}
stopCluster(cl)

【问题讨论】:

    标签: r parallel-processing


    【解决方案1】:

    如果集群中的“工作人员”评估的代码(后台 R 会话)取决于您的包 fepsfrontieR,那么您需要将该包附加到每个工作人员中(就像您在主 R 会话中所做的那样) .所以,试试:

    clusterEvalQ(cl, library(fepsfrontieR))
    

    【讨论】:

    • 感谢 HenrikB。工作。但我必须添加 clusterExport(..., envir = environment() ) 以使其最终运行:-)
    • 必须导出完整的封闭环境听起来像是一种黑客行为,并且您可能会导出超出您需要的方式(这可能会很昂贵)。我会尝试识别您需要导出的每个全局变量(例如,从错误消息中)并手动导出它们。
    • 另一种方法是使用bootEstimates &lt;- future.apply::future_lapply(bootListMat, FUN = ...) 进行并行化 - 优点是它会自动处理全局变量。 (免责声明:我是未来框架的作者)。
    • 我会试试的 :-)
    【解决方案2】:

    我认为您还必须将功能导出到集群

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多