如何将脚本部分提交为数组

问题描述

我在实验室的服务器上使用 Slurm,我想提交一个如下所示的作业:

#SBATCH ...

mkdir my/file/architecture
echo "#HEADER" > my/file/architecture/output_summary.txt

for f in my/dir/*.csv; do
    python3 myscript.py $f
done

有什么办法可以运行它,让它完成第一条指令,然后并行运行 for 循环?每一步都是独立的,所以它们可以同时运行。

初始步骤不是很复杂,因此如果需要,我可以将其拆分为单独的 SBATCH 脚本。 my/dir/ 但是包含大约 7000 个要处理的 csv 文件,因此手动将它们全部输入会很痛苦。

解决方法

GNU Parallel 可能很适合这里,或者 xargs,不过我更喜欢在 Slurm 工作中使用 parallel

以下是运行 8 路 sbatchparallel 脚本示例:

#!/bin/sh

#SBATCH ...
#SBATCH --nodes=1
#SBATCH --ntasks=

srun="srun --exclusive -N1 -n1"

# -j is the number of tasks parallel runs so we set it to $SLURM_NTASKS
# Note that --ntasks=1 and --cpus-per-task=8 will have srun start one copy of the program at a time. We use "find" to generate a list of files to operate on.

find /my/dir/*.csv -type f | parallel -j $SLURM_NTASKS "$srun python3 myscript.py {}"

最简单的方法是在单个节点上运行,尽管 parallel 可以使用 SSH(我相信)在多台计算机上运行。