首页 > 解决方案 > 如何配置批处理脚本以使用 future.batchtools (SLURM) 并行化 R 脚本

问题描述

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

到目前为止,我尝试了不同的配置(附上cf代码),但都没有达到预期的结果。我的 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) 
}

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

标签: rparallel-processingfuturehpcslurm

解决方案


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

  1. 您可以使用具有多个内核的单个节点,在这种情况下,这mclapply是一个不错的替代方案,因为原则上与parLapply.

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

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

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

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


推荐阅读