正如在其他文章中建议的那样,我在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
我做错了什么?
发布于 2018-10-11 19:46:02
编辑:在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。
发布于 2018-10-06 16:11:46
您必须将对象'_EffES_profileLLcpp'
扩展到集群的每个核心。您可以使用clusterExport
来完成这一任务,在您的示例中:
clusterExport(cl,'_EffES_profileLLcpp')
对需要并行使用的每个对象重复此步骤(或只检查错误日志中显示的对象,并使用clusterExport
对其执行spreat )。
希望这能有所帮助
https://stackoverflow.com/questions/52502855
复制相似问题