在 R 中并行化自己的包

parallelize Own Package in R

按照其他帖子中的建议,我在 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

我做错了什么?

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

clusterExport(cl,'_EffES_profileLLcpp')

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

希望对您有所帮助

编辑:问题已在 optimParallel 版本 0.7-4 中解决

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


旧版本:

中详述 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() 代码的建议。我开了一个对应的问题.