Slurm异构多测试作业执行失败问题排查求助
Slurm异构作业报错排查与解决方案
问题背景
在HPC集群通过Slurm异构作业开展多资源规模测试时,提交任务后出现崩溃,返回Exit Code 8,同时报错包含:
/scratch_local/slurm_job.xxxxxx目录创建权限拒绝script.sh: Exec format error
相关脚本与报错详情
Slurm提交脚本(slurm_script.sh)
#!/bin/bash #SBATCH -p my_partition #SBATCH --exclusive #SBATCH --time 16:00:00 # format: HH:MM:SS #SBATCH -N 1 # 1 node #SBATCH --ntasks-per-node=32 # tasks out of 128 #SBATCH --gres=gpu:4 # gpus per node out of 4 #SBATCH --mem=246000 # memory per node out of 246000MB #SBATCH hetjob #SBATCH -p my_partition #SBATCH --exclusive #SBATCH --time 16:00:00 # format: HH:MM:SS #SBATCH -N 2 # 2 nodes #SBATCH --ntasks-per-node=32 # tasks out of 128 #SBATCH --gres=gpu:4 # gpus per node out of 4 #SBATCH --mem=246000 # memory per node out of 246000MB #SBATCH hetjob #SBATCH -p my_partition #SBATCH --exclusive #SBATCH --time 16:00:00 # format: HH:MM:SS #SBATCH -N 4 # 4 nodes #SBATCH --ntasks-per-node=32 # tasks out of 128 #SBATCH --gres=gpu:4 # gpus per node out of 4 #SBATCH --mem=246000 # memory per node out of 246000MB #SBATCH hetjob #SBATCH -p my_partition #SBATCH --exclusive #SBATCH --time 16:00:00 # format: HH:MM:SS #SBATCH -N 8 # 8 nodes #SBATCH --ntasks-per-node=32 # tasks out of 128 #SBATCH --gres=gpu:4 # gpus per node out of 4 #SBATCH --mem=246000 # memory per node out of 246000MB #SBATCH hetjob #SBATCH -p my_partition #SBATCH --exclusive #SBATCH --time 16:00:00 # format: HH:MM:SS #SBATCH -N 16 # 16 nodes #SBATCH --ntasks-per-node=32 # tasks out of 128 #SBATCH --gres=gpu:4 # gpus per node out of 4 #SBATCH --mem=246000 # memory per node out of 246000MB srun --job-name=job1 --output=4cpu_%N_%j.out --het-group=0 script.sh 4 srun --job-name=job2 --output=8cpu_%N_%j.out --het-group=0 script.sh 8 srun --job-name=job3 --output=16cpu_%N_%j.out --het-group=0 script.sh 16 srun --job-name=job4 --output=32cpu_%N_%j.out --het-group=0 script.sh 32 srun --job-name=job5 --output=64cpu_%N_%j.out --het-group=1 script.sh 64 srun --job-name=job6 --output=128cpu_%N_%j.out --het-group=2 script.sh 128 srun --job-name=job7 --output=256cpu_%N_%j.out --het-group=3 script.sh 256 srun --job-name=job8 --output=512cpu_%N_%j.out --het-group=4 script.sh 512
执行脚本(script.sh)
make cpp_program_I_need_to_run mkdir -p my_results mpirun -n $1 cpp_program_I_need_to_run # other tasks
报错信息
cat slurm-8482798.out srun: error: r242n13: tasks 0-31: Exited with exit code 8 srun: launch/slurm: _step_signal: Terminating StepId=8482798.0
同时出现:
slurmstepd: error: Unable to create TMPDIR [/scratch_local/slurm_job.8482798]: Permission denied slurmstepd: error: execve(): /cluster/home/userexternal/username/myfolder/script.sh: Exec format error
分步解决方案
1. 修复script.sh的Exec格式错误
- 在
script.sh第一行添加shebang头:#!/bin/bash - 赋予脚本执行权限:
chmod +x script.sh
2. 解决TMPDIR权限问题
两种可行方案:
- 方案一:自定义临时目录
在Slurm脚本开头添加以下内容,指定自己有权限的临时目录:export TMPDIR=$HOME/tmp/slurm_$SLURM_JOBID mkdir -p $TMPDIR - 方案二:联系集群管理员
如果/scratch_local是集群共享临时目录,申请对应权限或确认目录配置。
3. 修正MPI启动的冗余问题(Exit Code 8核心原因)
Slurm环境下无需使用mpirun,直接用srun启动MPI程序更适配资源调度,避免冲突:
修改script.sh中的MPI启动命令为:
srun -n $1 cpp_program_I_need_to_run
注:Slurm的
srun会自动根据作业分配的资源调度任务,无需额外指定节点/主机列表,避免与异构作业的资源分组冲突。
4. 优化异构作业资源匹配
确保每个srun调用的--het-group对应资源规模与传入的任务数匹配:
het-group=0对应1节点32核,任务数不能超过32het-group=1对应2节点64核,任务数不能超过64- 以此类推,避免超配资源导致任务崩溃
5. 额外优化建议
- 将
make cpp_program_I_need_to_run移至Slurm脚本开头,仅编译一次,避免每个任务重复编译浪费资源 - 指定
my_results的绝对路径,比如mkdir -p $SLURM_SUBMIT_DIR/my_results,确保不同节点都能写入结果目录
内容的提问来源于stack exchange,提问作者hub
相关产品推荐
相关产品推荐

