R-在SuperComputer上并行运行模型的问题.CALL并未在Parlapply/clusterApply中识别我



我试图通过远程连接到超级计算机来并行运行模型列表,以使用并行软件包的parlapply使用许多内核(通过computecanada(。

当我运行该行时:

 modsout<-parLapply(cl=cl, X=mods, fun=run_um)

我有以下错误:

 models3out<-parLapply(cl=cl, X=mods, fun=run_um)
 Error in do.call(c, clusterApply(cl = cl, x = splitList(X, nchunks), fun 
 = lapply,  : 
 second argument must be a list
 Calls: parLapply -> do.call
 Execution halted

我通过执行以下操作来创建我的" mod"列表:

mods<-list(mod1, mod2, mod3, mod4)

遇到错误后,我检查了str(mod(,并以" 4"列表返回,所以我真的不明白为什么在我的行列行中没有识别它。

这是我的代码的重量:

nodeslist = unlist(strsplit(Sys.getenv("NODESLIST"), split=" "))
cl<-makeCluster(nodeslist, type="PSOCK") #make cluster
#load all the data xxx
#create model list
mods<- list(b0<-list(formula='~1~1', data=bear3),
           b1<-list(formula='~trail+elev+precip+temp+hum+cat+tree+month+topo~1', data=bear3),
           b2<-list(formula='~trail~1', data=bear3),
           b3<-list(formula='~elev~1', data=bear3))
run_um<-function(x) {unmarked::occu(as.formula(x[[1]]),x[[2]])} #define the function
clusterExport(cl=cl, varlist=c("bear3", "run_um") #send data to cores
clusterEvalQ(cl=cl, library(unmarked))#load package on all cores
modsout<-parLapply(cl=cl, X=mods, fun=run_um)

我的完整工作具有> 2000个型号,每个型号至少需要20分钟才能运行,此外,我必须运行适合测试的优点,因此为什么我要尝试使用HPC。我仍然是R的新手,并且对HPC非常陌生,因此目前任何指导对我都非常有用!预先感谢

在将并行化应用于代码之前,要检查代码是否在列表中的第一对元素并不同行运行始终是一个好主意。这将帮助您在代码中捕获错误。

由于我没有您的数据集,因此我将使用数据集青蛙来准备UnmarkedFitoccu对象:

library(unmarked)
# Create some unmarkedFitOccu object
data(frogs)
pferUMF <- unmarkedFrameOccu(pfer.bin)
siteCovs(pferUMF) <- data.frame(sitevar1 = rnorm(numSites(pferUMF)))
obsCovs(pferUMF) <- data.frame(obsvar1 = rnorm(numSites(pferUMF) * obsNum(pferUMF)))

第二步是准备一个列表(在您的情况下(。创建命名列表时,您应该使用" ="符号(不是像您在代码中一样的" <-"(:

# Create a list
mods <- list(b1 = list(formula='~obsvar1~1', data=pferUMF),
             b2 = list(formula='~sitevar1~1', data=pferUMF))

我们可以定义函数:

run_um<-function(x) {unmarked::occu(as.formula(x[[1]]),data=x[[2]])  }

然后确保您检查列表中的几个元素是否有效:

# Check if the function works on a single list item
run_um(mods[[2]])
# Call:
#   unmarked::occu(formula = as.formula(x[[1]]), data = x[[2]])
# 
# Occupancy:
#   Estimate   SE     z P(>|z|)
# 8.81 29.7 0.297   0.767
# 
# Detection:
#   Estimate    SE       z  P(>|z|)
# (Intercept)   -1.916 0.164 -11.721 9.93e-32
# sitevar1      -0.139 0.178  -0.781 4.35e-01
# 
# AIC: 262.7176 

然后,您可以首先尝试使用常规lapply功能,以获取前几个元素:

lapply(mods,FUN=run_um)

,如果一切顺利,则可以应用并行化。

最新更新