在集群上运行 Rmpi,指定库路径
Posted
技术标签:
【中文标题】在集群上运行 Rmpi,指定库路径【英文标题】:run Rmpi on cluster, specify library path 【发布时间】:2014-09-24 19:04:49 【问题描述】:我正在尝试在我们的计算集群上并行运行分析。 不幸的是,我不得不自己设置 Rmpi,而且可能没有正确设置。 因为我必须将所有必要的软件包安装到我的主文件夹中,所以我总是需要调用
.libPaths('/home/myfolder/Rlib');
在我可以加载包之前。
但是,doMPI
似乎在我可以设置库路径之前尝试加载自身。
.libPaths('/home/myfolder/Rlib');
cat("Step 1")
library(doMPI)
cl <- startMPIcluster()
registerDoMPI(cl)
cat("Step 2")
Children_mcmc1 = foreach(i=1:2) %dopar%
cat("Step 3")
.libPaths('/home/myfolder/Rlib');
library(MCMCglmm)
cat("Step 4")
load("krmh_married.rdata")
nitt = 1000; thin = 50; burnin = 100
MCMCglmm( children ~ paternalage.factor ,
random=~idParents,
family="poisson",
data=krmh_married,
pr = F, saveX = T, saveZ = T,
nitt=nitt,thin=thin,burnin=burnin)
closeCluster(cl)
mpi.quit()
如果我这样做
mpirun -H localhost -n 3 R --slave -f "3 - krmh mcmcglmm scc test 2.r"
我得到(在删除一些样板消息之后)
启动期间 - 警告消息: 第 1 步 第 1 步 第 1 步 第 2 步 中的错误:任务 2 失败 - “无法打开连接” 调用:%dopar% -> 执行停止
如果我这样做
R --slave -f "3 - krmh mcmcglmm scc test 2.r"
我明白了
第 1 步 库 (doMPI) 中的错误:没有名为“doMPI”的包 调用:本地 ... eval -> suppressMessages -> withCallingHandlers -> 库 执行停止 库 (doMPI) 中的错误:没有名为“doMPI”的包 调用:本地 ... eval -> suppressMessages -> withCallingHandlers -> 库 执行停止
我尝试在运行时安装doMPI
,但即使没有打印第 2 步,似乎错误是由循环引起的。
当然,尽管我仍在前端测试所有这些,但我还没有将作业提交到预期的集群。
我试图在我的 .Rprofile 中指定 .libPaths
调用,但我不确定这是否会在集群上被读取,我什至无法让它在前端被读取(而且我不能找出 R 在哪里寻找文件)。
【问题讨论】:
【参考方案1】:将 R 包安装到“个人库”中要容易得多,因为它会自动使用,因此您不必在脚本中调用 .libPaths
。您可以通过执行来确定这是什么目录:
> Sys.getenv('R_LIBS_USER')
如果存在,这将自动成为.libPaths
返回的第一个目录,因此您完全不必担心调用.libPaths
。
请注意,在 foreach 循环的主体中调用 .libPaths
是没有意义的,因为集群工作人员必须先加载 doMPI,然后才能执行任何任务。
我不确定您的“mpirun”案例出了什么问题,因为 mpirun 正在启动所有工作人员,所以脚本的前四行由所有工作人员执行。这就是为什么“步骤 1”显示 3 次的原因。但是在您的第二种情况下,正在生成集群工作人员,因此 RMPIworker.R 脚本加载了 doMPI 包,导致加载 doMPI 时出错。
我建议您使用 mpirun 方法来解决 .libPaths
问题,但使用 verbose=TRUE
选项调用 startMPIcluster
。这将在您的工作目录中创建一些名为“MPI_*.log”的文件,其中可能包含一些有用的错误消息,可为问题提供线索。
【讨论】:
感谢您的帮助和出色的软件包!出于某种原因,我认为我没有个人库,因为必须创建R_LIBS_USER
中引用的目录。这使事情变得容易得多。我确实更进一步(使用R --slave
方式“无法打开连接”。我会在一周内尝试更多。“连接”问题可能是由于尝试加载数据文件,也许我需要给出一个完整的路径或类似的东西?
@Ruben “无法打开连接”是加载命令在找不到文件时产生的错误,因此指定完整路径将是一个有用的测试。
确实是一条不确定的路径导致了该错误。但是现在我验证了 foreach 中的代码可以自己运行,并且我使用这两种方法都得到了Error: ReadItem: unknown type 0, perhaps written by later version of R
(使用 mpirun 3 次)。
@Ruben 听起来 mpirun 使用了错误的 R 版本,可能是由于您的 shell 初始化脚本。尝试在执行 mpirun 时指定 R 的完整路径。
听起来很像,但是mpirun -H localhost -n 3 R --version
产生了Spring Dance,无论哪种方式,R --slave
方法都不应该出现这个问题,对吧?还有其他想法吗?以上是关于在集群上运行 Rmpi,指定库路径的主要内容,如果未能解决你的问题,请参考以下文章