【问题标题】:Slurm: Use cores from multiple nodes for R parallelizationSlurm:使用来自多个节点的核心进行 R 并行化
【发布时间】: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 = 2cpus-per-task=16。有了这个,作业被分配给两个节点。但是,只有一个节点在进行计算(在 16 个内核上)。第二个节点被分配给作业,但什么也不做。

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

(我知道我可以使用 SelectType=CR_CPU_Memory 并且每个节点有 32 个线程可用。但是,问题是如何使用来自多个节点的内核/线程来扩展并行度)。

【问题讨论】:

  • 有必要使用 SLURM 吗?每个节点都有IP吗?如果是这样,很容易使用parallel 包在多台计算机上进行并行处理。
  • 每个节点都有一个ip,但它只是内部的而不是公共的。只有主节点有公共 ip。是的,这里需要使用 Slurm。
  • 我可能不明白你在问什么,但听起来你正在尝试跨节点并行化节点线程并行作业......你不能用典型的 SLURM 设置做到这一点.这些节点不共享内存,因此您无法组合来自不同节点的 CPU。
  • @nsheff 还有其他方法可以实现我想要的吗?我不敢相信这是不可能的:)
  • 也许@damienfrancois 有想法?

标签: r parallel-processing hpc slurm


【解决方案1】:

我的cmets总结:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多