在slurm系统下,有时候需要按步骤运行A、B、C三个任务,但是直接写在脚本里会同时提交,所以需要建立依赖关系。
错误做法:
搜索网上做法及slurm串行教程,做法多为如下,使用bash或python来按顺序/循环内来串行多个任务。这种做法对于本地运行是没有问题的,上一个程序跑完再进行下一个程序,但是对于slurm而言,srun提交到远程即视为结束,并不检测job实际运行状态,就导致连续提交了3个任务,但是3个任务均在远程运行
# 这种情况下,任务提交视为完成,但是实际任务并没有运行完毕,导致按顺序同时提交了3个任务。
srun -p partition python a.py
srun -p partition python b.py
srun -p partition python c.py
正确做法
参考slurm教程,有个参数为dependency,可以设置上一个JOBID运行完再运行下一个。
#!/bin/sh
date=$(date "+%Y%m%d%H%M")
# -p为分区名,async可以后台运行,-o 将结果输出到定向文件
srun -p xx --gres=gpu:8 --job-name=yy --async -o log/${date}_yy.log python -m torch.distributed.run --nproc_per_node=8 --master_port=25431 a.py
jobid1=$(squeue -p xx --name yy| tail -1| awk '{print $1}')
srun -p xx --dependency=afterok:${jobid1} --gres=gpu:8 --job-name=yy2 --async -o log/${date}_yy2.log python -m torch.distributed.run --nproc_per_node=8 --master_port=25432 b.py
jobid2=$(squeue -p xx --name yy2| tail -1| awk '{print $1}')
srun -p xx --dependency=afterok:${jobid2} --gres=gpu:8 --job-name=yy3 --async -o log/${date}_yy3.log python -m torch.distributed.run --nproc_per_node=8 --master_port=25433 c.py
bash脚本获取JOBID:https://stackoverflow.com/questions/73186840/how-do-i-get-the-slurm-job-id
perl脚本运行可以参考:http://cn.voidcc.com/question/p-gktjwzvv-bkn.html