运行 一个脚本在 SLURM 中多个目录的首选方法

Preferred approach for running one script over multiple directories in SLURM

我最典型的用例是 运行 多个目录(通常是 R 或 Matlab)上的单个脚本。我可以访问高性能计算环境(基于 SLURM)。从我目前的研究来看,我不清楚以下哪种方法更适合最有效地利用可用的 CPUs/cores。我也想确保我没有不必要地占用系统资源,所以我想仔细检查以下两种方法中哪一种最合适。

方法一:

  1. 在脚本 (MPI) 中并行化代码。
  2. 将其包装在一个循环中,将脚本应用于所有目录。
  3. 将此作为单个 MPI 作业作为 SLURM 脚本提交。

方法二:

  1. 在脚本 (MPI) 中并行化代码。
  2. 创建一个 MPI 作业数组,每个目录一个作业,每个 运行 目录上的脚本。

我对此还是个新手,所以如果我在这里搞混了,或者您需要更多详细信息来回答问题,请告诉我。

答案对我来说很明显,假设获得良好的并行性通常很困难。

在第一种方法中,你向 SLURM 请求一组资源,但如果你请求许多 CPU,你可能会浪费相当多的资源(如果你请求 32 CPU 而你的加速只有 4 倍,你浪费了 28 CPUs)。因此,您将使用集群的一小部分一个接一个地处理文件夹。

在第二种方法中,您将要求 SLURM 运行 每个文件夹的作业。 运行同时会有很多工作,他们可以要求更少的资源。假设您要求每个作业 4 CPU 秒(加速是 3 倍,这意味着您每个作业浪费 1 cpu)。 运行 同时处理 8 个作业将花费与第一种方法相同的 32 CPU 秒,但只会浪费 8 CPU 秒,同时会处理 8 个文件夹。

最后,必须在看到不同数量的 CPUs 的加速后做出决定,但我的感觉是第二种方法通常是首选,除非你得到一个非常良好的加速,在这种情况下,两种方法是等效的。

如果您没有在原始 R 或 Matlab 脚本中明确使用 MPI,我建议您完全避免使用 MPI 并使用 job arrays.

假设您有一个脚本 myscript.R 和一组子目录 data01data02、...、data10,并且脚本采用directory作为输入参数,可以做如下操作

在数据目录的父目录中创建提交脚本:

#!/bin/bash
#SBATCH --ntasks 1
#SBATCH --cpus-per-task 1
#SBATCH --mem-per-cpu=2G
#SBATCH --time 1-0
#SBATCH --array=1-10

DIRS=(data*/) # Create a Bash array with all data directories

module load R
Rscript myscript.R ${DIRS[$SLURM_ARRAY_TASK_ID]} # Feed the script with the data directory
                                                 # corresponding to the task ID in the array

此脚本将创建一个作业数组,其中每个作业将 运行 myscript.R 以其中一个数据目录作为参数。

当然,您需要调整内存和时间的值,并研究每个作业使用多个 CPU 是否对您的情况有益。并根据您的情况调整 --array 参数以适应实际目录数。