如何在Slurm/Sbatch中并行运行Python脚本处理多输入文件?
如何用Slurm并行运行单线程Python脚本处理批量文件?
我想要编写一个Slurm脚本,让单线程且完全独立的Python脚本同时处理数十至数百个输入文件以提升处理速度。当前我的Slurm脚本内容如下:
#SBATCH --nodes=1 --ntasks-per-node=1 --time=0:20:00 python3 xxx.py -i /path/input1我希望改为类似以下的批量处理形式:
python3 xxx.py -i /path/*input请问该如何修改脚本,才能让所有处理任务并行运行?
方法一:使用Slurm作业数组(推荐处理大量文件)
Slurm作业数组是处理数十到数百个独立任务的最优方案,它会为每个文件启动单独的Slurm任务,由集群调度并行执行。
- 先把所有目标输入文件的路径导出到文本文件:
ls /path/*input > input_files.txt
- 修改Slurm脚本(示例命名为
run_batch.sh):
#SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --time=0:20:00 #SBATCH --array=1-$(wc -l < input_files.txt) # 数组任务数等于文件总数,可加%N限制并行数(如1-100%20) # 获取当前数组任务对应的输入文件 INPUT_FILE=$(sed -n "${SLURM_ARRAY_TASK_ID}p" input_files.txt) # 运行Python脚本处理单个文件 python3 xxx.py -i "$INPUT_FILE"
- 提交作业:
sbatch run_batch.sh
方法二:单节点内用GNU Parallel并行处理
如果所有任务都在同一个节点执行,且节点有足够CPU核心,可借助GNU Parallel在单节点内启动多进程并行处理。
修改Slurm脚本如下:
#SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --cpus-per-task=20 # 根据节点可用核心数设置,比如20核 #SBATCH --time=0:20:00 # 用Parallel按核心数并行启动Python进程,每个进程处理一个文件 parallel -j $SLURM_CPUS_PER_TASK python3 xxx.py -i {} ::: /path/*input
说明:-j参数指定并行进程数,用$SLURM_CPUS_PER_TASK匹配申请的核心数,避免资源浪费。
方法三:脚本内后台进程循环(适合少量文件)
如果文件数量不多,可在脚本中循环启动后台进程,并控制并行上限:
#SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --cpus-per-task=10 #SBATCH --time=0:20:00 MAX_PARALLEL=10 # 最多同时运行10个进程 count=0 for file in /path/*input; do python3 xxx.py -i "$file" & count=$((count+1)) if [ $count -ge $MAX_PARALLEL ]; then wait # 等待当前所有后台进程完成 count=0 fi done wait # 等待剩余未完成的后台进程
内容的提问来源于stack exchange,提问作者Yaqiong Li
相关产品推荐
相关产品推荐

