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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:39:39