我想使用Slurm调度程序并行化HPC上的R脚本。
SLURM配置有SelectType: CR_Core_Memory
。
每个计算节点具有16个内核(32个线程)。
我使用clustermq作为Slurm的接口,使用以下配置将R脚本传递给SLURM。
#!/bin/sh
#SBATCH --job-name={{ job_name }}
#SBATCH --partition=normal
#SBATCH --output={{ log_file | /dev/null }} # you can add .%a for array index
#SBATCH --error={{ log_file | /dev/null }}
#SBATCH --mem-per-cpu={{ memory | 2048 }}
#SBATCH --cpus-per-task={{ n_cpus }}
#SBATCH --array=1-{{ n_jobs }}
#SBATCH --ntasks={{ n_tasks }}
#SBATCH --nodes={{ n_nodes }}
#ulimit -v $(( 1024 * {{ memory | 4096 }} ))
R --no-save --no-restore -e 'clustermq:::worker("{{ master }}")'
在R脚本中,我使用30个内核进行“多核”并行化。 我想使用来自多个节点的核心来满足30 cpus的需求,即,来自node1的16个核心,来自node2的14个核心。
我尝试使用n_tasks = 2
和cpus-per-task=16
。这样,作业将分配给两个节点。但是,只有一个节点在16个内核上进行计算。第二个节点已分配给该作业,但不执行任何操作。
在this中,问题srun
用于在具有foreach
和Slurm ID的节点之间划分并行性。我既不使用srun
也不使用foreach
。有没有办法通过SBATCH
和multicore
并行性实现我想要的?
(我知道我可以使用SelectType=CR_CPU_Memory
并在每个节点上有32个线程。但是,问题是通常如何使用多个节点中的内核/线程来扩大并行度)。
答案 0 :(得分:1)
我的评论摘要:
答案是您无法执行,因为您的任务是在单个R进程中使用大量CPU。您要的是一个R进程来并行执行一个比物理计算机更多的CPU的任务。您不能将单个R进程拆分为多个节点。这些节点不共享内存,因此您不能将来自不同节点的CPU结合在一起,至少不能与典型的群集体系结构结合使用。如果您有像DCOS这样的分布式操作系统,则是可能的。
在您的情况下,解决方案是您需要做的是将工作拆分到这些R流程之外。运行2个(或3个或4个)单独的R进程,每个进程在其自己的节点上,然后将每个R进程限制为计算机具有的最大CPU数量。