在 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() 代码的建议。我开了一个对应的问题.
按照其他帖子中的建议,我在 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() 代码的建议。我开了一个对应的问题