使用 Slurm 调度程序在 2 个或更多节点上运行 GNU Parallel

使用 Slurm 调度程序在 2 个或更多节点上运行 GNU Parallel

我正在尝试在使用 Slurm 工作负载管理器的 HPC 上使用 GNU Parallel 分发独立运行的进程。简而言之,这是数据分析的设置:

脚本#1:myCommands

./myscript --input infile.txt --setting 1 --output out1
./myscript --input infile.txt --setting 2 --output out2
./myscript --input infile.txt --setting 3 --output out3
./myscript --input infile.txt --setting 4 --output out4

脚本#2:run.sh

#SBATCH --time=00:02:00
#SBATCH --nodes=2
#SBATCH --cpus-per-task=2

cat myCommands | parallel -j 4

这是可行的,但它只使用一个节点。该节点上的两个核心被分为 4 个线程,以便根据并行请求为 4 个作业腾出空间。这是不可取的。

我的搜索表明我需要 anodefile和 asshloginfile来完成此操作,但我在网上没有看到与 一起使用的示例Slurm,仅与PBSsystem.

如何使脚本 (1) 使用两个节点,并且 (2) 不将核心拆分为线程?

答案1

你可以通过循环法来做到这一点srun(类似):

jobs=({1..4})
nodes=($(scontrol show hostname $SLURM_NODELIST))
for ((n = 0; n < ${#jobs[@]}; n++)); do
  index=$(expr $n % ${#nodes[@]})
  srun --nodes=1 --ntasks=1 --nodelist=${nodes[$index]} \
       --exclusive ./myscript --input infile.txt \
       --setting $n --output out$n &
done
wait

我想--cpus-per-task=2将会被给予srun。如果您有任何问题,请告诉我。今天早上我在搞并行,但我不知道如何直接解决这个问题。此外,我发现如果您的scancel作业包含 GNU 并行作业,则正在运行的进程不会终止,除非您使用srun.

答案2

我目前使用 GNU Parallel 本质上只是将我的作业“批处理”到远程集群上:

这是删除了脚本名称的尝试:

parallel --colsep '\t' \
         --shuf \
         --jobs=25% \
         --delay=1s \
         ssh -q ${remote} \
         sbatch --chdir="${remote_dir}" \
         --job-name="my-job-name-{1}-{2}-{4}-{5}_{6}" \
         --output="${OUTPUT_PREFIX}/joblogs/%x.out" \
         --error="${OUTPUT_PREFIX}/joblogs/%x.err" \
         my-job.sh \
         "${OUTPUT_PREFIX}/" "{1}" "{2}" "{4}" "{3}" "{5}" "{6}" \
         :::: "${COMPARISONS}" \
         :::: "${REPORTS}" \
         :::: "${METHODS}"

每个${COMPARISONS}${REPORTS}${METHODS}变量都是制表符分隔的文件,然后传递到sbatch.本质上,这使用并行的参数叉积来提交不同的变体,然后作业控制留给 SLURM,而不是并行。

my-job.sh是这样的:

#!/usr/bin/env bash

#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 4
#SBATCH -t 0-01:00:00

exec ~/bin/job.bin $@

如果您的队列支持它,您不需要手动指定节点(除非有其他原因这样做)。

我希望这有帮助。实际上,我正在寻找一种方法来减慢速度,这样我就不会压垮调度程序(我已经提交了足够的作业,我自己在队列中进行 QOS,直到作业开始完成,大多数作业需要几秒钟的时间才能完成) 10分钟)。 Parallel 有一个--delay选项,在提交数百个作业时会很有帮助。

如果你想在你最初启动的脚本中使用并行并让它启动SLURM中的任务,你可能可以更好地适应@barrymoo的答案sbatch并删除节点列表(同样,除非有特殊要求仅使用节点列表的子集)可供您使用的节点;大多数 HPC 的设计在各自队列中的节点之间是公平的。)

相关内容