SLURM批处理作业中Python调用mpirun子进程失败求助
问题:SLURM批处理中Python调用mpirun子进程失败
原实现代码
Python脚本(script.py)
import subprocess def run_mpi(config_name, np, working_dir): data_path = working_dir + "/" + config_name subprocess.run( [ "mpirun -np " + np + " " + working_dir + "/spk_mpi -echo log < " + data_path + "/in.potts" ], # mpirun -np 32 spk_mpi -echo log < /$PATH/in.potts check=True, stderr=subprocess.PIPE, universal_newlines=True, stdout=subprocess.PIPE, shell=True, )
SLURM批处理脚本
#!/bin/bash #SBATCH --job-name=myjob #SBATCH --nodes=1 #SBATCH --ntasks=32 #SBATCH --time=2-00:00:00 # Time limit hrs:min:sec #SBATCH --partition=thin python script.py --working_dir=$PATH --np=$SLURM_NTASKS
遇到的问题
- 子进程始终未执行;
- 将
shell=True改为shell=False时,出现返回非零退出状态1的错误; - 交互式通过
salloc分配资源后执行则能正常运行,推测是子进程未正确继承SLURM配置变量导致无法并行。
最终解决方法
直接在批处理文件中调用mpirun,通过读取config_file中的路径处理输入,代码如下:
#SBATCH --ntasks=32 while IFS= read -r line; do path="$(echo -e "${line}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" echo "Processing: $path/in.potts_am_IN100_3d" mpirun -np 32 ${SPPARKS}/spk_mpi -echo log < ${SPPARKS}/${path}/in.potts done < "$config_file"
内容的提问来源于stack exchange,提问作者Betelgeuse
相关产品推荐
相关产品推荐

