gpt4 book ai didi

bash - SLURM:令人尴尬的并行程序中的令人尴尬的并行程序

转载 作者:太空宇宙 更新时间:2023-11-03 20:15:20 25 4
gpt4 key购买 nike

我有一个用 Matlab 编写的复杂模型。该模型不是我们编写的,最好将其视为“黑匣子”,即为了从内部解决相关问题,需要重写整个模型,这需要数年时间。

如果我遇到“令人尴尬的并行”问题,我可以使用数组提交同一模拟的 X 个变体,并使用选项 #SBATCH --array=1-X。但是,集群通常对最大数组大小有一个(令人沮丧的小)限制。

在使用 PBS/TORQUE 集群时,我通过强制 Matlab 在单个线程上运行、请求多个 CPU,然后在后台运行多个 Matlab 实例来解决了这个问题。示例提交脚本是:

#!/bin/bash
<OTHER PBS COMMANDS>
#PBS -l nodes=1:ppn=5,walltime=30:00:00
#PBS -t 1-600

<GATHER DYNAMIC ARGUMENTS FOR MATLAB FUNCTION CALLS BASED ON ARRAY NUMBER>

# define Matlab options
options="-nodesktop -noFigureWindows -nosplash -singleCompThread"

for sub_job in {1..5}
do
<GATHER DYNAMIC ARGUMENTS FOR MATLAB FUNCTION CALLS BASED ON LOOP NUMBER (i.e. sub_job)>
matlab ${options} -r "run_model(${arg1}, ${arg2}, ..., ${argN}); exit" &
done
wait
<TIDY UP AND FINISH COMMANDS>

谁能帮我在 SLURM 集群上做同样的事情?

  • par 函数不会在 Matlab 的并行循环中运行我的模型。
  • PBS/TORQUE 语言非常直观,但 SLURM 的语言让我感到困惑。假设一个与我的 PBS 示例结构相似的提交脚本,这就是我认为某些命令会产生的结果。
    • --ncpus-per-task=5 对我来说似乎是最明显的一个。我是将 srun 放在循环中 matlab 命令的前面,还是将其保留在 PBS 脚本循环中?
    • --ntasks=5 我想会请求 5 个 CPU,但会串行运行,除非程序特别请求它们(即 MPI 或 Python 多线程等)。在这种情况下,我需要将 srun 放在 Matlab 命令前面吗?

最佳答案

我不是数组作业方面的专家,但我可以帮助您处理内部循环。

我会一直使用 GNU parallel在具有多个 CPU 可用的单个作业中并行运行多个串行进程。它是一个简单的 perl 脚本,因此“安装”并不困难,而且它的语法非常简单。它基本上做的是并行运行一些(嵌套的)循环。此循环的每次迭代都包含一个(长)过程,就像您的 Matlab 命令一样。与您的解决方案相比,它不会一次提交所有这些进程,而是同时仅运行 N 个进程(其中 N 是您可用的 CPU 数量).一个完成后,立即提交下一个,依此类推,直到整个循环完成。并非所有进程都需要相同的时间,这很好,只要释放一个 CPU,就会启动另一个进程。

然后,您想做的是启动 600 个作业(我在下面用 3 个代替,以显示完整的行为),每个作业有 5 个 CPU。为此,您可以执行以下操作(因此我没有包括 matlab 的实际运行,但可以包括在内):

#!/bin/bash
#SBATCH --job-name example
#SBATCH --out job.slurm.out
#SBATCH --nodes 1
#SBATCH --ntasks 1
#SBATCH --cpus-per-task 5
#SBATCH --mem 512
#SBATCH --time 30:00:00
#SBATCH --array 1-3

cmd="echo matlab array=${SLURM_ARRAY_TASK_ID}"

parallel --max-procs=${SLURM_CPUS_PER_TASK} "$cmd,subjob={1}; sleep 30" ::: {1..5}

使用以下方式提交此作业:

$ sbatch job.slurm

向队列提交 3 个作业。例如:

$ squeue | grep tdegeus
3395882_1 debug example tdegeus R 0:01 1 c07
3395882_2 debug example tdegeus R 0:01 1 c07
3395882_3 debug example tdegeus R 0:01 1 c07

每个作业获得 5 个 CPU。 parallel 命令利用它们来并行运行您的内部循环。同样,此内部循环的范围可能(远)大于 5,parallel 负责此作业中 5 个可用 CPU 之间的平衡。

让我们检查一下输出:

$ cat job.slurm.out

matlab array=2,subjob=1
matlab array=2,subjob=2
matlab array=2,subjob=3
matlab array=2,subjob=4
matlab array=2,subjob=5
matlab array=1,subjob=1
matlab array=3,subjob=1
matlab array=1,subjob=2
matlab array=1,subjob=3
matlab array=1,subjob=4
matlab array=3,subjob=2
matlab array=3,subjob=3
matlab array=1,subjob=5
matlab array=3,subjob=4
matlab array=3,subjob=5

您现在可以清楚地看到 3 x 5 个进程同时运行(因为它们的输出是混合的)。

在这种情况下不需要使用 srun。 SLURM 将创造 3 个工作岗位。在每个作业中,一切都发生在单独的计算节点上(即,就好像您在自己的系统上运行一样)。


安装 GNU Parallel - 选项 1

将 GNU 并行“安装”到您的主文件夹中,例如在 ~/opt 中。

  1. Download the latest GNU Parallel .

  2. 如果目录~/opt 尚不存在则创建目录

    mkdir $HOME/opt
  3. “安装”GNU Parallel:

    tar jxvf parallel-latest.tar.bz2
    cd parallel-XXXXXXXX
    ./configure --prefix=$HOME/opt
    make
    make install
  4. ~/opt 添加到您的路径中:

    export PATH=$HOME/opt/bin:$PATH

    (要使其永久化,将该行添加到您的 ~/.bashrc。)


安装 GNU Parallel - 选项 2

使用 conda

  1. (可选)创建新环境

    conda create --name myenv
  2. 加载现有环境:

    conda activate myenv
  3. 并行安装 GNU:

    conda install -c conda-forge parallel 

请注意,该命令仅在环境加载时可用。

关于bash - SLURM:令人尴尬的并行程序中的令人尴尬的并行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49297653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com