簡體   English   中英

在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對其進行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()代碼的建議。 在這里提出一個相應的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM