You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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任务,由集群调度并行执行。

  1. 先把所有目标输入文件的路径导出到文本文件:
ls /path/*input > input_files.txt
  1. 修改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"
  1. 提交作业:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:22:04