如何通过单个bash脚本在不同GPU运行程序并生成独立Slurm .out文件
核心问题原因
你当前写的合并脚本存在两个本质错误,所以达不到预期效果:
- 仅申请了1块V100 GPU(
#SBATCH --gres=gpu:v100:1),Slurm只会给该作业开放1块GPU的可见权限,两个后台运行的程序自然只能共用同一块GPU - 单个Slurm作业默认只会生成一个
.out输出文件,该作业内所有进程的标准输出、错误输出都会默认写入同一个文件
该需求完全可以实现,以下是两种可直接使用的方案:
方案一:单脚本提交两个独立Slurm作业(推荐)
该方案完全复用你原有的作业配置逻辑,和分开提交两个脚本的效果完全一致,仅需执行一个总脚本即可完成提交:
#!/bin/bash # 提交program1作业,指定独立输出文件 sbatch --output=program1_%j.out << 'EOF' #!/bin/bash -l #SBATCH --time=1:00:00 #SBATCH --gres=gpu:v100:1 #SBATCH --mem=90g #SBATCH --cpus-per-task=6 #SBATCH -N 1 program1 EOF # 提交program2作业,指定独立输出文件 sbatch --output=program2_%j.out << 'EOF' #!/bin/bash -l #SBATCH --time=1:00:00 #SBATCH --gres=gpu:v100:1 #SBATCH --mem=90g #SBATCH --cpus-per-task=6 #SBATCH -N 1 program2 EOF
该方案优势:两个作业独立调度,Slurm会自动分配不同的GPU资源(集群资源充足的前提下),互不影响,且各自生成独立的输出日志。
方案二:单Slurm作业申请多GPU,手动绑定分配
如果你要求两个任务必须运行在同一个节点上,可以用该方案,先申请2块GPU,再手动绑定每个程序的GPU设备,同时重定向输出:
#!/bin/bash -l #SBATCH --time=1:00:00 #SBATCH --gres=gpu:v100:2 # 申请2块V100 GPU #SBATCH --mem=180g # 两个任务各需90G内存,总申请180G #SBATCH --cpus-per-task=12 # 两个任务各需6核,总申请12核 #SBATCH -N 1 # 指定program1用第1块GPU,输出到独立日志 CUDA_VISIBLE_DEVICES=0 program1 > program1_${SLURM_JOB_ID}.out 2>&1 & # 指定program2用第2块GPU,输出到独立日志 CUDA_VISIBLE_DEVICES=1 program2 > program2_${SLURM_JOB_ID}.out 2>&1 & wait
该方案注意点:两个任务会被调度到同一个节点,GPU序号0、1对应Slurm给该作业分配的两张独立显卡,可保证互不抢占。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

