问题描述
我在实验室的服务器上使用 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 路 sbatch
的 parallel
脚本示例:
#!/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(我相信)在多台计算机上运行。