SLURM中sbatch与srun调用Singularity挂载行为不一致报错
SLURM作业srun提交触发/scratch只读报错排查方案
问题背景
- 首次使用SLURM向HPC集群提交作业的用户编写了
job.slurm作业脚本,脚本内容如下:
#!/bin/bash #SBATCH --job-name singularity-mpi #SBATCH -N 1 # 总节点数 #SBATCH --time=00:05:00 # 最大运行时长 #SBATCH --partition=partition-name #SBATCH --output=/home/users/r/usrname/slurm-reports/slurm-%j.out module load GCC/9.3.0 Singularity/3.7.3-Go-1.14 CUDA/11.0.2 OpenMPI/4.0.3 binaryPrecision=600 #临时参数 while getopts i:o: flag do case "${flag}" in i) input=${OPTARG} ;; o) output=${OPTARG} ;; *) echo "Invalid option: -$flag" ;; esac done mpirun --allow-run-as-root singularity exec --bind /home/users/r/usrname/scratch/points_and_lines/:/usr/local/share/sdpb/ sdpb_2.5.1.sif pvm2sdp $binaryPrecision /usr/local/share/sdpb/$input /usr/local/share/sdpb/$output
- 脚本中调用的
pvm2sdp为专用C++可执行程序,功能是将XML格式文件转换为JSON格式文件。 - 使用
sbatch ./job.slurm -i /home/users/r/usrname/scratch/points_and_lines/xmlfile.xml -o /home/users/r/usrname/scratch/points_and_lines/jsonfile.json提交作业时可正常运行。 - 改用
srun ./job.slurm -i /home/users/r/usrname/scratch/points_and_lines/xmlfile.xml -o /home/users/r/usrname/scratch/points_and_lines/jsonfile.json提交时抛出如下错误:
-------------------------------------------------------------------------- A call to mkdir was unable to create the desired directory: Directory: /scratch Error: Read-only file system Please check to ensure you have adequate permissions to perform the desired operation. --------------------------------------------------------------------------
- 用户曾尝试额外挂载/scratch路径但未解决问题,后续需要在包含多组MPI调用的.slurm脚本内部使用srun指令,需要对应的排查思路与解决方案。
根因说明
sbatch为批处理作业提交指令,提交后作业会被调度到计算节点执行,脚本内的#SBATCH参数会被正确解析,作业运行在计算节点标准执行环境中,Singularity容器默认继承计算节点本地可写临时存储配置,因此运行正常。- 直接使用
srun ./job.slurm属于错误用法:该调用方式不会预先为作业分配计算节点资源,也不会解析脚本内的#SBATCH参数,实际是在登录节点直接启动执行。HPC集群登录节点默认将系统级/scratch路径以只读方式挂载给Singularity容器,而OpenMPI启动时会默认尝试在/scratch下创建会话临时目录,直接触发只读报错。
解决方案
- 正确区分SLURM指令用途:
srun的设计定位是在已分配的作业资源内启动并行任务,不能直接替代sbatch提交作业脚本。如果需要交互式运行作业,先申请计算资源再执行脚本:
# 先申请1节点、5分钟运行时长的资源,进入分配到的计算节点交互式shell salloc -N 1 --time=00:05:00 -p partition-name # 资源申请成功后,在计算节点环境中执行脚本 ./job.slurm -i /home/users/r/usrname/scratch/points_and_lines/xmlfile.xml -o /home/users/r/usrname/scratch/points_and_lines/jsonfile.json # 任务执行完成后退出,释放占用的计算资源 exit
- 适配脚本内多MPI任务调用场景:如果需要在
sbatch提交的作业脚本内部调用srun启动多组MPI任务,直接将脚本中原有mpirun替换为srun即可,作业运行在计算节点环境时会自动拥有本地临时存储写权限,无需额外挂载/scratch路径:
# 替换脚本最后一行为srun调用即可 srun singularity exec --bind /home/users/r/usrname/scratch/points_and_lines/:/usr/local/share/sdpb/ sdpb_2.5.1.sif pvm2sdp $binaryPrecision /usr/local/share/sdpb/$input /usr/local/share/sdpb/$output
- 测试环境临时规避方案(不推荐生产计算任务使用):如果需要在登录节点做简单功能测试,可提前指定OpenMPI临时目录到个人可写路径,同时给Singularity开启临时可写权限:
# 提前创建个人可写临时目录,设置为系统临时路径 export TMPDIR=/home/users/r/usrname/tmp mkdir -p $TMPDIR # 执行命令时增加--writable-tmpfs参数给容器分配可写临时层 srun singularity exec --writable-tmpfs --bind /home/users/r/usrname/scratch/points_and_lines/:/usr/local/share/sdpb/ sdpb_2.5.1.sif pvm2sdp $binaryPrecision /usr/local/share/sdpb/$input /usr/local/share/sdpb/$output
内容的提问来源于stack exchange,提问作者Bharath Radhakrishnan
相关产品推荐
相关产品推荐

