R语言 在HPC中为2个节点使用所有内核

nxowjjhe  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(211)

我正在尝试在HPC环境中运行R代码。HPC系统有8个节点,每个节点有20个核心。我希望使用2个节点,总共使用40个核心。我通过SLURM提交作业,它运行的是.R文件,其中有一个并行计算代码。我有下面的. spatch代码

#!/bin/bash
#SBATCH --job-name=my_r_script   # Job name
#SBATCH --nodes=2                 # Number of nodes
##SBATCH --ntasks-per-node=20       # Number of tasks per node
#SBATCH --ntasks=40                # Total number of tasks (cores)
#SBATCH --cpus-per-task=1         # Number of CPU cores per task
#SBATCH --mem=4G                  # Memory per node (e.g., 4G, 8G, 16G)
#SBATCH --time=1:00:00            # Wall clock time limit (hh:mm:ss)

module load R    # Load the R module 

Rscript my_Rscript.R

字符串
然而,当我看到结果时,我知道它只使用单个节点的20个核心,而不是一起使用40个核心。如何编写. spatch文件以确保来自2个节点的所有40个内核都被用于运行R代码进行并行计算。
我在这里使用了回复中提出的想法:https://stackoverflow.com/a/73828155/12493753来理解 --ntasks--cpus-per-task=1

68bkxrlz

68bkxrlz1#

你的Slurm提交只在一个节点上运行你的R脚本的一个副本,尽管用Slurm分配了两个节点,除非你在R代码中使用MPI。我的首选方法是使用pbdMPI包来管理我运行的R会话数量(以及会话之间的协作),然后使用parallel包的mclapply来管理每个会话中的多核共享内存计算。例如,有4个R会话,每个会话使用10个核心,您的Slurm提交看起来像这样:

#!/bin/bash
#SBATCH --job-name=my_r_script   # Job name
#SBATCH --nodes=2                 # Number of nodes
#SBATCH --exclusive               # Use all cores on allocated nodes
#SBATCH --mem=4G                  # Memory per node (e.g., 4G, 8G, 16G)
#SBATCH --time=1:00:00            # Wall clock time limit (hh:mm:ss)

module load openmpi # To load OpenMPI - may be site-dependent
module load R    # Load the R module 

## Run 2 R sessions per node (map-by is OpenMPI-specific):
mpirun --map-by ppr:2:node Rscript my_Rscript.R

字符串
10个核心的使用将通过parallel::mclapply(<parameters>, mc.cores = 10)完成。您还可以使用--map-by ppr:20:node的所有40个内核,在这种情况下,您正在运行40个R会话。后者将占用更多内存。
还有其他方法可以通过Slurm和OpenMPI指定相同的东西。不幸的是,Slurm中有依赖于站点的默认值,R的依赖于站点的部署,以及不同风格的MPI。

相关问题