按照其他文章的建议,我在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
我在做什么错?
答案 0 :(得分:0)
您必须将对象'_EffES_profileLLcpp'
散布到群集的每个核心。在您的情况下,您可以使用clusterExport
进行此操作:
clusterExport(cl,'_EffES_profileLLcpp')
对每个需要并行使用的对象重复此步骤(或者只是检查哪个对象出现在错误日志中,并使用clusterExport
对其进行准备)。
希望这会有所帮助
答案 1 :(得分:0)
该版本在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。