【问题标题】:How to configure batchscript to parallelize R script with future.batchtools (SLURM)如何配置批处理脚本以使用 future.batchtools (SLURM) 并行化 R 脚本
【发布时间】:2019-07-26 14:50:48
【问题描述】:

我试图使用 future.batchtools 包在 SLURM HPC 上并行化 R 文件。虽然脚本在多个节点上执行,但它只使用 1 个 CPU 而不是可用的 12 个。

到目前为止,我尝试了不同的配置(附上 c.f. 代码),但都没有达到预期的结果。我的 bash 文件配置如下:

#!/bin/bash
#SBATCH --nodes=2
#SBATCH --cpus-per-task=12

R CMD BATCH test.R output

在 R 中,我使用了一个 foreach 循环:

# First level = cluster
# Second level = multiprocess 
# https://cran.r-project.org/web/packages/future.batchtools/vignettes/future.batchtools.html
plan(list(batchtools_slurm, multiprocess))

# Parallel for loop
result <- foreach(i in 100) %dopar% {
       Sys.sleep(100)
return(i) 
}

如果有人能指导我如何为多节点和多核配置代码,我将不胜感激。

【问题讨论】:

  • 您的 R 脚本使用单层 foreach 并行化,它将使用 batchtools_slurm 进行并行化。如果您使用两层 foreach 并行化,则第二层将使用多进程(鉴于 plan())。仅供参考,foreach(i in 100) 只会迭代一个值。
  • 感谢您的回复!我实际上在这个计划中使用了一个嵌套的forachach(为了一个简洁的例子,我没有在这里粘贴它。R result &lt;- foreach(i= 1:100) %dopar% { foreach(jRun = 1:100) %dopar% { # calulation }} 这个代码更接近我正在使用的那个。不过,我没有在 HPC 上利用多个结. 还有什么我忽略的吗?
  • 啊...您需要在设置计划时指定每个任务的核心数 - 类似于plan(list(tweak(batchtools_slurm, resources = list("ntasks-per-node"=4)), multiprocess)),参见。 github.com/HenrikBengtsson/future.batchtools。要验证这是否有效:使用该新计划,请致电 f &lt;- future( availableCores() ); ncores &lt;- value(f)。这将显示第二层将有多少核心可用。你应该得到四 (4) 个。
  • 感谢您的帮助。对于面临同样挑战的其他人:有必要使用 srun 启动 .R 文件以允许并行进程。
  • Michael,你最后找到合适的设置了吗?如果是这样,如何在此处发布您找到的解决方案?

标签: r parallel-processing future hpc slurm


【解决方案1】:

有多种方法可以使用 Slurm 并行化 R 作业。需要注意的几点:

  1. 您可以使用具有多个内核的单个节点,在这种情况下,mclapply 是一个不错的替代方案,因为原则上与 parLapply 相比,它更快且内存效率更高。

  2. 您可以使用JOB arrays with Slurm,这意味着您可以编写一个 R 脚本,Slurm 将在指定选项 --array=1-[# of replicates] 时多次运行该脚本。您可以使用SLURM_ARRAY_TASK_ID 环境变量指定在每个作业中执行的操作(您可以使用Sys.getenv("SLURM_ARRAY_TASK_ID") 在R 中捕获它)。并在此基础上使用条件语句if/else。

  3. @george-ostrouchov 提到,您可以使用 MPI,您需要为其安装 Rmpi 软件包,但这有时可能会有点痛苦。

  4. 您可以尝试的另一件事是使用并行包创建 SOCKET 集群对象。这将是一个多节点集群,允许您使用 parLapply 和其他跨多个节点的计算来跨越计算。

我确实有一个教程,我在其中解释了这些选项以及如何使用 slurmR 包(我正在研究,即将在 CRAN 上)或 rslurm(已经在 CRAN 上)。你可以看看教程here。

【讨论】:

    【解决方案2】:

    由于您正在批量运行并使用多个节点,请考虑将 MPI 与mclapply 的多核分支结合使用。这些更接近硬件中实际发生的情况,并在每个节点的 R 实例数量和每个实例的核心使用之间提供控制。示例 SLURM 和 PBS 脚本以及随附的 R 批处理脚本位于 https://github.com/RBigData/mpi_balance 中,说明了如何平衡多核和多节点并行性。

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2021-08-01
      • 2011-06-15
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多