在R中并行化自己的程序包

时间:2018-09-25 16:30:07

标签: r parallel-processing rcpp

按照其他文章的建议,我在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

我在做什么错?

2 个答案:

答案 0 :(得分:0)

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

clusterExport(cl,'_EffES_profileLLcpp')

对每个需要并行使用的对象重复此步骤(或者只是检查哪个对象出现在错误日志中,并使用clusterExport对其进行准备)。

希望这会有所帮助

答案 1 :(得分:0)

编辑:问题已在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