【问题标题】:parallelize Own Package in R在 R 中并行化自己的包
【发布时间】:2018-09-25 16:30:07
【问题描述】:

按照其他帖子中的建议,我在 R 中编写了自己的包,以并行化我使用 Rcpp 编写的函数。我可以加载包并且一切正常,但是当我使用 optimParallel 时,我收到消息:

checkForRemoteErrors(val) 中的错误: 3个节点产生错误;第一个错误:找不到对象“_EffES_profileLLcpp”

这是我正在做的事情:

library(optimParallel)
library(EffES) # EffES is my own package

cl <- makeCluster(detectCores()-1)
clusterEvalQ(cl, library(EffES))
clusterEvalQ(cl, library(optimParallel))
setDefaultCluster(cl = cl)

w.es <- optimParallel(par=rep(0.001,3), profileLLcpp, y=y.test, x=x.test, lower = rep(0.001,3), method = "L-BFGS-B")$par

Error in checkForRemoteErrors(val) : 
  3 nodes produced errors; first error: object '_EffES_profileLLcpp' not found

我做错了什么?

【问题讨论】:

  • 登录工作节点,尝试加载它,看看会发生什么。也许.libPaths() 是不同的。也许您忘记在一个或多个节点上安装EffES。我们不知道。
  • 你的电脑有几个核心?您使用哪些工具进行包开发?
  • 它不在 GitHub 存储库中,但也许这有帮助:src
  • codebunk 链接没有多大帮助,因为它只包含您的“业务逻辑”。在这里,该文件周围的所有胶水都很有趣。例如,我认为没有必要使用tools::package_native_routine_registration_skeleton(),因为Rcpp::compileAttributes() 已经这样做了。
  • 同理,如果“复杂”或“非标准”包失败,请尝试更简单的包。我对分布式工作的第一个测试总是报告进程 ID,或硬件 IP 地址,或者……返回。

标签: r parallel-processing rcpp


【解决方案1】:

编辑:问题在 optimParallel 0.7-4 版中得到解决

该版本在 CRAN 上可用:https://CRAN.R-project.org/package=optimParallel


对于旧版本:

this post 中所述,optimParallel() 需要进行一些技巧,以便对可以通过 ... 参数传递的参数名称没有限制。目前,这意味着传递给optimParallel() 的函数必须在.GlobalEnv 中定义才能正确找到编译后的代码。

因此,一种解决方法是在.GlobalEnv 中定义函数:

library(optimParallel)
library(EffES)                          # EffES is your own package
cl <- makeCluster(detectCores()-1)
clusterEvalQ(cl, library(EffES))
setDefaultCluster(cl=cl)

f <- function(par, y, x) {
    profileLLcpp(par=par, x=x, y=y)
}
optimParallel(par=rep(0.001,3), f=f, y=y.test, x=x.test, 
              lower = rep(0.001,3), method = "L-BFGS-B")$par

欢迎提出改进 optimParallel() 代码的建议。我开了一个对应的问题here

【讨论】:

    【解决方案2】:

    您必须将对象 '_EffES_profileLLcpp' 传播到集群的每个核心。您可以使用clusterExport 执行此操作,在您的情况下:

    clusterExport(cl,'_EffES_profileLLcpp')
    

    对需要并行使用的每个对象重复此步骤(或仅检查错误日志中显示的对象并使用clusterExport 展开)。

    希望对你有帮助

    【讨论】:

    • 一个不需要多行。 clusterExportvarlist 参数,因此可以在一行代码中指定多个导出
    • 是的,尽管您可能不知道首先需要传播哪些对象(或者至少这是发生在我身上的事情,因为我试图运行一些冗长而复杂的代码)和错误指示需要传播哪些对象。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2016-03-14
    • 2019-05-07
    • 2016-03-06
    • 2019-03-08
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多