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

Slurm多节点运行含多作业数组批量脚本警告问题的解决咨询

解决Slurm作业数组多节点分配问题

你遇到的警告是因为Slurm的资源配置逻辑:你请求了3个节点,但只设置了--ntasks=1——单个MPI任务默认不会跨多个节点运行,所以Slurm自动把节点数调整为1,这显然不符合你“每个作业用3个节点”的需求。

问题根源分析

你的原脚本是在一个Slurm作业里手动循环后台启动多个mpirun进程,但Slurm只给这个作业分配了1个节点(因为--ntasks=1的限制),这会导致多个mpirun在同一个节点上抢资源,既达不到多节点并行的目的,还会造成性能下降。

正确解决方案:使用Slurm作业数组

Slurm的--array参数专门用来处理批量作业,每个数组任务可以独立分配资源。针对你的需求,我们可以让每个数组任务分配3个节点,每个节点跑满28核。

修改后的脚本如下:

#!/bin/bash
#SBATCH --job-name=Littest
#SBATCH --array=0-2  # 对应3个输入文件,生成3个独立作业任务
#SBATCH --nodes=3  # 每个数组任务分配3个节点
#SBATCH --ntasks-per-node=28  # 每个节点启动28个MPI进程(刚好匹配节点28核)
#SBATCH --cpus-per-task=1  # 每个MPI进程占用1个CPU核心
#SBATCH --output=output_%a.txt  # %a会替换为数组任务索引,每个任务输出独立文件
#SBATCH --exclude=node2,node11,node43,node44

# 定义输入文件数组
declare -a arrK=(Li2.in Li6.in Li8.in)
# 通过Slurm环境变量获取当前数组任务对应的输入文件
current_file=${arrK[$SLURM_ARRAY_TASK_ID]}

# 加载依赖模块
module load intel
module load qe/6.5

echo "启动数组任务 $SLURM_ARRAY_TASK_ID,处理文件:$current_file"
# 使用srun替代mpirun,Slurm会自动根据配置分配进程数
srun pw.x -i $current_file > out.$current_file
echo "数组任务 $SLURM_ARRAY_TASK_ID 完成"

关键参数说明

  • --array=0-2:创建3个独立的作业任务,索引从0到2,分别对应你的3个输入文件。
  • --nodes=3:明确告诉Slurm每个数组任务需要3个节点。
  • --ntasks-per-node=28:确保每个节点用满28核,3个节点总共84个MPI进程,和你原脚本中mpirun -np 84的需求一致。
  • %a:在输出文件名中使用该占位符,每个数组任务的输出会保存到不同文件,避免互相覆盖。
  • srun:Slurm推荐的并行任务启动命令,它能自动识别Slurm分配的资源,不需要手动指定-np参数,比mpirun更适配Slurm环境。

为什么原脚本不行?

原脚本中,你请求了3个节点但只设置--ntasks=1,Slurm认为单个任务无法利用多节点资源,因此自动调整节点数为1。同时,你在这个单节点上后台启动多个mpirun -np 84,会导致每个mpirun都试图占用84核,但单个节点只有28核,必然引发资源冲突。

额外建议

如果你的输入文件数量不确定,可以用--array=0-$((${#arrK[@]}-1))来自动生成数组范围,避免手动修改数字。

内容的提问来源于stack exchange,提问作者NikithaSrinivas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:17:32