如何用Slurm在同一节点运行多个独立Python脚本?
解决同一Slurm节点运行多个Python实验的方案
核心修改思路
你的需求是在同一节点、单GPU上运行4个独立Python实验,只需调整Slurm资源参数并通过合适方式启动多任务即可。以下是两种规范且可行的修改方案:
方案一:基于Slurm srun 任务调度(推荐)
这种方式符合Slurm的任务管理逻辑,能让系统自动分配CPU资源,避免资源竞争。
修改后的完整脚本:
#!/bin/bash #SBATCH --nodes=1 #SBATCH --ntasks=4 # 任务数改为4,对应4个实验 #SBATCH --time=12:00:00 #SBATCH --job-name=multi-exps #SBATCH --gres=gpu:1 # 保持单GPU不变,所有实验共享 #SBATCH --cpus-per-task=2 # 每个实验分配2核CPU,总核数4*2=8,与原脚本总CPU资源一致 source .venv/bin/activate # 激活虚拟环境 # 定义4个实验的参数(根据你的实际需求修改) EXP_ARGS=("exp_config1" "exp_config2" "exp_config3" "exp_config4") # 循环启动每个实验任务 for ARG in "${EXP_ARGS[@]}"; do # --exclusive 确保每个任务独占分配的CPU核心,避免干扰 srun --exclusive --ntasks=1 python test.py --args=$ARG > log_$ARG.txt 2>&1 & done # 等待所有后台任务执行完成,避免Slurm提前终止脚本 wait
方案二:直接后台运行(适合简单场景)
如果不需要Slurm精细的任务调度,也可以直接用后台进程方式启动,手动分配CPU核心避免竞争。
修改后的完整脚本:
#!/bin/bash #SBATCH --nodes=1 #SBATCH --ntasks=1 # 保持单任务,由脚本自行管理多进程 #SBATCH --time=12:00:00 #SBATCH --job-name=multi-exps #SBATCH --gres=gpu:1 #SBATCH --cpus-per-task=8 # 保留原总CPU资源 source .venv/bin/activate # 激活虚拟环境 # 用taskset绑定每个实验到不同CPU核心,后台运行并生成独立日志 taskset -c 0-1 python test.py --args=exp_config1 > log_exp1.txt 2>&1 & taskset -c 2-3 python test.py --args=exp_config2 > log_exp2.txt 2>&1 & taskset -c 4-5 python test.py --args=exp_config3 > log_exp3.txt 2>&1 & taskset -c 6-7 python test.py --args=exp_config4 > log_exp4.txt 2>&1 & # 等待所有实验完成 wait
注意事项
- 确保每个Python实验的GPU内存占用之和不超过单GPU的可用显存,避免OOM错误
- 日志输出部分(
> log_$ARG.txt 2>&1)可根据需求保留或删除,用来单独记录每个实验的输出和错误 - 如果每个实验需要更多CPU资源,可调整
--cpus-per-task参数,但需保证总核数不超过节点可用CPU数
内容的提问来源于stack exchange,提问作者Thanh Long Phan
相关产品推荐
相关产品推荐

