我正在尝试在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。
1条答案
按热度按时间68bkxrlz1#
你的Slurm提交只在一个节点上运行你的R脚本的一个副本,尽管用Slurm分配了两个节点,除非你在R代码中使用MPI。我的首选方法是使用
pbdMPI
包来管理我运行的R会话数量(以及会话之间的协作),然后使用parallel
包的mclapply
来管理每个会话中的多核共享内存计算。例如,有4个R会话,每个会话使用10个核心,您的Slurm提交看起来像这样:字符串
10个核心的使用将通过
parallel::mclapply(<parameters>, mc.cores = 10)
完成。您还可以使用--map-by ppr:20:node
的所有40个内核,在这种情况下,您正在运行40个R会话。后者将占用更多内存。还有其他方法可以通过Slurm和OpenMPI指定相同的东西。不幸的是,Slurm中有依赖于站点的默认值,R的依赖于站点的部署,以及不同风格的MPI。