在集群上运行Rmpi,指定库路径

时间:2014-08-01 14:32:24

标签: r foreach parallel-processing mpi hpc

我正在尝试在我们的计算集群上并行运行分析 不幸的是,我不得不自己设置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 - &gt; suppressMessages - &gt; withCallingHandlers - &gt;库
  执行停止了   库中的错误(doMPI):没有名为'doMPI'的包。
  电话:本地... eval - &gt; suppressMessages - &gt; withCallingHandlers - &gt;库
  执行暂停

我已尝试在运行时安装doMPI,但即使未打印第2步,似乎错误也是由循环产生的。

当然,有了这一切,我仍然在我们的前端进行测试,我还没有把它提交给预期的集群。

我试图在我的.Rprofile中指定.libPaths调用,但我不确定这会在集群上读取,我甚至无法在前端读取它(我无法读取)找出R在哪里寻找文件。)

1 个答案:

答案 0 :(得分:1)

将R软件包安装到“个人库”中要容易得多,因为它会自动使用,因此您无需在脚本中调用.libPaths。您可以通过执行来确定这是一个目录:

> Sys.getenv('R_LIBS_USER')

这将自动成为.libPaths返回的第一个目录(如果存在),因此您根本不必担心调用.libPaths

请注意,在foreach循环体中调用.libPaths没有意义,因为群集工作者必须先加载doMPI才能执行任何任务。

我不确定你的“mpirun”情况出了什么问题,因为mpirun正在启动所有的工作程序,所以你的脚本的前四行都是由它们执行的。这就是“步骤1”显示三次的原因。但在第二种情况下,集群工作者正在生成,因此doMPI包由RMPIworker.R脚本加载,导致加载doMPI时出错。

我建议您使用mpirun方法解决.libPaths问题,但使用startMPIcluster选项调用verbose=TRUE。这将在您的工作目录中创建一些名为“MPI _ * .log”的文件,其中可能包含一些有用的错误消息,这些消息将提供问题的线索。