【问题标题】:run Rmpi on cluster, specify library path在集群上运行 Rmpi​​,指定库路径
【发布时间】: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 在哪里寻找文件)。

【问题讨论】:

    标签: r foreach parallel-processing mpi hpc


    【解决方案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 方法都不应该出现这个问题,对吧?还有其他想法吗?
    猜你喜欢
    • 2017-04-24
    • 2018-11-25
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多