Slurm:使用来自多个节点的核心进行 R 并行化

Slurm: Use cores from multiple nodes for R parallelization

我想使用 Slurm 调度程序在 HPC 上并行化 R 脚本。

SLURM 配置为 SelectType: CR_Core_Memory

每个计算节点有 16 个核心(32 个线程)。

我通过以下配置将 R 脚本传递给 SLURM,使用 clustermq 作为 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 个内核进行 "multicore" 并行化。 我想使用来自多个节点的内核来满足 30 个 cpu 的要求,即 node1 的 16 个内核,node2 的 14 个内核。

我尝试使用 n_tasks = 2cpus-per-task=16。有了这个,作业被分配给两个节点。但是,只有一个节点在进行计算(在 16 个核心上)。第二个节点被分配给作业但什么也不做。

中,问题 srun 用于在具有 foreach 和 Slurm ID 的节点之间拆分并行性。我既不使用 srun 也不使用 foreach。有没有办法通过 SBATCHmulticore 并行度实现我想要的?

(我知道我可以使用 SelectType=CR_CPU_Memory 并且每个节点有 32 个线程可用。但是,问题是通常如何从多个节点使用 cores/threads 来扩展并行度).

我的评论总结:

答案是你不能这样做因为你的任务正在使用单个 R 进程中的一组 CPU。您要求单个 R 进程在比物理机器更多的 CPU 上并行执行任务。您不能跨多个节点拆分单个 R 进程。这些节点不共享内存,因此您不能组合来自不同节点的 CPU,至少不能使用典型的集群架构。如果你有像 DCOS 这样的分布式操作系统,这是可能的。

对于您的情况,解决方案是您需要将您的工作拆分到那些 R 进程之外。 运行 2(或 3、或 4)个独立的 R 进程,每个进程在其自己的节点上,然后将每个 R 进程限制为您的机器拥有的最大 CPU 数。