multi-partition 作业的批处理脚本?

Batch script for multi-partition job?

我正在从事一个项目,该项目 运行 在大型计算集群的两个不同分区上编写程序。我想 运行 使用批处理脚本来执行此操作,但在搜索之后,仍然不清楚 if/how 我可以从单个批处理脚本中在两个不同的分区上分配和 运行 程序。这是我想做的事情

#!/bin/bash
#SBATCH --partition=<WHAT GOES HERE? I want to perform 100 processes on partition "batch" and 1 process on partition "gpu". I will alternate between the 2 during my jobs execution>
#SBATCH --ntasks=<100 on batch, 1 on gpu>
#SBATCH --mem-per-cpu=2G
#SBATCH --time=4-00:00:00
#SBATCH --exclude=nodeynode[003,016,019,020-023,026-030,004-015,017-018,020,024,031]
#SBATCH --job-name="lorem_ipsum"

filenames=("name1" "name2" "name3")

srun -p gpu python gpu_init.py
wait

for i in {0..100}
do
    for name in "${filenames[@]}"
    do
    srun -p batch pythonexecutable &
    done
srun -p gpu python gpu_iter.py
wait
done

为 bash 错误道歉,我通常在 python 中编写脚本,但我不能在这里,因为我在 bash 中切换 python 模块(不同版本) ] 脚本(未显示)。我看到您实际上可以在批处理脚本的 header 中放置一个分区列表,但根据我的阅读,实际上只是告诉调度程序从列表中分配任何可用分区,而不是多个分区。

谢谢!

Slurm 作业仅限于一个分区,因此在您的情况下,有几种操作方法:

  • 提交两个作业数组 --array=1..100 并将您的提交脚本分成一部分用于 batch 分区,另一部分用于 gpu 分区并链接两个数组与 --depedendcy=aftercorr:<job_id of the 'batch' job array>

  • 使用 sallocgpu 分区上创建分配,然后使用 SSH 显式连接到该节点 运行 python gpu_iter.py提交脚本(如果集群配置允许)

  • 修改 gpu_iter.py 以便它可以发出信号(使用 UNIX 信号)它必须 运行 然后休眠直到下一个信号,并使用 scancel 在每次迭代时从 batch 作业中发出 gpu 作业信号。