【发布时间】:2019-07-21 03:40:13
【问题描述】:
我想使用 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 个 cpu 的要求,即 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 个线程可用。但是,问题是如何使用来自多个节点的内核/线程来扩展并行度)。
【问题讨论】:
-
有必要使用 SLURM 吗?每个节点都有IP吗?如果是这样,很容易使用
parallel包在多台计算机上进行并行处理。 -
每个节点都有一个ip,但它只是内部的而不是公共的。只有主节点有公共 ip。是的,这里需要使用 Slurm。
-
我可能不明白你在问什么,但听起来你正在尝试跨节点并行化节点线程并行作业......你不能用典型的 SLURM 设置做到这一点.这些节点不共享内存,因此您无法组合来自不同节点的 CPU。
-
@nsheff 还有其他方法可以实现我想要的吗?我不敢相信这是不可能的:)
-
也许@damienfrancois 有想法?
标签: r parallel-processing hpc slurm