我有一些R代码将函数应用于对象列表。该函数很简单,但涉及自举计算,可以使用mclapply
轻松加速。在单个节点上运行时,一切都很好。
但是,我有一个集群,我一直在尝试将该函数的应用程序分发到跨多个节点的对象列表。要做到这一点,我一直在使用Rmpi
(0.6-6)。
以下代码运行良好
library(Rmpi)
cl <- parallel::makeCluster(10, type='MPI')
parallel::clusterExport(cl, varlist=c('as.matrix'), envir=environment())
descriptor <- parallel::parLapply(1:5, function(am) {
val <- mean(unlist(lapply(1:120, function(x) mean(rnorm(1e7)))))
return(c(val, Rmpi::mpi.universe.size()))
}, cl=cl)
print(do.call(rbind, descriptor))
snow::stopCluster(cl)
但是,如果我将lapply
转换为mclapply
并设置mc.cores=10
,则MPI会警告分叉会导致错误,并且作业会挂起。
(在所有情况下,工作都是通过SLURM提交的)
根据MPI警告,似乎我不应该在mclapply
个工作中使用Rpmi
。这是正确的评估吗?
如果是这样,是否有人建议如何并行化每个节点上运行的功能?