【问题标题】:sbatch script with number of CPUs different to total number of CPUS in cores?sbatch 脚本的 CPU 数量与内核中 CPU 的总数不同?
【发布时间】:2021-02-11 17:31:27
【问题描述】:

我习惯于在节点有 32 个 CPU 且我的代码需要 2 个处理器的集群中启动 sbatch 脚本。

例如我这样做:

#SBATCH -N 1
#SBATCH -n 16
#SBATCH --ntasks-per-node=16

#SBATCH -N 2
#SBATCH -n 64
#SBATCH --ntasks-per-node=32

但是我现在需要使用一个不同的集群,其中每个节点都有 40 个 CPU。目前我只使用一个节点和 32 个进程进行测试:

#SBATCH --ntasks=32
#SBATCH --ntasks-per-node=32

(我后来从集群的文档中得到了这个脚本。他们在这个例子中没有使用#SBATCH -N 行,我不知道为什么但可能是因为它是一个例子)

但是,我现在需要使用 512 个处理器进行更大的模拟。我需要使用的更接近的节点数是 13(即 40*13=520 个处理器)。现在的问题是每个节点的任务数(技术上)不是整数。

我认为一个解决方案是要求 13 个节点,我将完全使用 12 个,只有我不会完全使用最后一个。

我的问题是我该怎么做?,有没有另一种方法可以做到这一点而不更改代码? (代码不能改,代码很大)。

512 proc 的模拟至少需要 10 小时,因此使用 32 proc 进行更大的模拟需要一周时间。而且我现在不仅需要一个模拟,而且至少需要 20 个。

另一种解决方案是请求 16 个节点 (32*16=512),每个节点仅使用 32 个 proc。但是,这将浪费处理器和集群中允许的小时数。

【问题讨论】:

  • 不要指定--ntasks-per-node。它要么冗余要么与-N-n 不兼容
  • 只使用#SBATCH -n 512,slurm 将为您分配满足您的工作所需的最少节点数,并且还将在节点之间对进程进行负载平衡,以便每个节点尽可能接近相同数量的进程。为了避免与其他用户共享节点的风险,您可以添加#SBATCH --exclusive
  • 好的,我会尝试只使用-n 512。这听起来合乎逻辑,但因为我是使用 slurm 的新手,所以我不知道。因为在两个集群的示例中,他们都使用--ntasks-per-node 我认为这是必须的
  • @Gilles 它有效,谢谢。我删除了--ntasks-per-node 行,只留下了-n 512,它就像一个魅力。我如何将您的评论作为答案?
  • 自己写一个答案并接受它。我很高兴你得到相应的代表:)

标签: parallel-processing mpi slurm sbatch


【解决方案1】:

好的,答案很简单,但取决于您使用的机器。但我认为它应该每次都有效。

对于第二个集群,我不需要指定--ntasks-per-node=512 行。我只需要告诉机器我总共需要多少任务--tasks=512,机器会自动分配相应数量的节点来执行这些任务。

重要提示:如果您的ntasks 不是每个节点处理器的倍数,那么最后一个节点将不会被完全使用。例如,在我的情况下,我需要 512 个任务,这对应于 13 个节点 = 520 个处理器。前 12 个处理器已完全使用,但最后一个未使用,因此 8 个处理器为空。

请注意,这可能会在某些代码中导致一些优化问题,因为最后一个节点上的进程将需要与其他节点中的大多数进程进行通信。对我来说不是问题,但我知道另一个有问题的代码。

【讨论】:

    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多