在集群上运行 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​​,指定库路径的主要内容,如果未能解决你的问题,请参考以下文章

在集群上安装 R 包时出现奇怪的 C 编译器错误

06部署Spark程序到集群上运行

maven怎么连接hadoop集群

Mapreduce提交YARN集群运行

在 EMR 集群中运行 Spark 应用程序时在哪里指定 Spark 配置

如何在多个子网上运行 AWS EMR 集群?