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

提交SLURM作业仅指定总任务数,如何获取各节点分配核心数及更优方法?

答案:当然可以!这里有几种高效的方法来获取节点核心分配信息,不用手动解析scontrol的冗长输出

方法1:用sacct直接生成目标格式(最简方案)

如果你只需要快速生成nodeXX:YY空格分隔的机器文件格式,直接在作业脚本里运行这条命令就行:

sacct -j $SLURM_JOB_ID --format=NodeList,CPUTaskRaw --noheader | awk '{print $1 ":" $2}' | paste -sd " " -

拆解说明:

  • sacct -j $SLURM_JOB_ID:针对当前运行的作业查询资源分配
  • --format=NodeList,CPUTaskRaw:仅提取节点名和每个节点分配的核心数(CPUTaskRaw就是单节点核心数)
  • --noheader:去掉冗余的表头行
  • awk '{print $1 ":" $2}':把每行的节点和核心数用冒号拼接
  • paste -sd " " -:把所有行合并成一行,用空格分隔

如果你的节点是范围格式(比如node[02-04]),想要展开成单个节点名,只需要加一步scontrol show hostnames的处理:

# 先获取展开后的节点列表和对应的核心数
sacct -j $SLURM_JOB_ID --format=NodeList,CPUTaskRaw --noheader | while read node_range cpus; do
    scontrol show hostnames $node_range | while read node; do
        echo "$node:$cpus"
    done
done | paste -sd " " -

方法2:用SLURM环境变量自定义脚本(更灵活)

如果需要更精细的控制(比如写入文件、后续逻辑处理),可以直接利用SLURM提供的环境变量,结合简单的bash脚本展开压缩格式:

# 定义一个函数,展开SLURM_JOB_CPUS_PER_NODE的压缩格式(比如"8(x2),7" → "8 8 7")
expand_cpu_allocation() {
    echo "$1" | tr ',' '\n' | while read segment; do
        if [[ $segment =~ ^([0-9]+)\(x([0-9]+)\)$ ]]; then
            # 处理重复节点的情况,比如8(x2)表示2个节点各8核
            core_count=${BASH_REMATCH[1]}
            node_count=${BASH_REMATCH[2]}
            for ((i=0; i<node_count; i++)); do echo -n "$core_count "; done
        else
            # 单个节点的核心数
            echo -n "$segment "; fi
    done
}

# 获取展开后的节点列表(每个节点一行)
IFS=$'\n' read -d '' -r -a node_list < <(scontrol show hostnames "$SLURM_JOB_NODELIST")
# 获取展开后的核心数列表
IFS=' ' read -r -a core_list < <(expand_cpu_allocation "$SLURM_JOB_CPUS_PER_NODE")

# 生成目标格式的字符串
machine_string=""
for index in "${!node_list[@]}"; do
    machine_string+="${node_list[$index]}:${core_list[$index]} "
done
# 移除末尾多余的空格
machine_string=$(echo "$machine_string" | sed 's/ $//')

# 输出结果或者写入文件
echo "$machine_string"
# echo "$machine_string" > my_machine_file.txt

关键环境变量说明:

  • $SLURM_JOB_NODELIST:作业分配的节点列表(可能是范围格式,比如node[02-06])
  • $SLURM_JOB_CPUS_PER_NODE:每个节点分配的核心数(压缩格式,比如7,14(x2),3)
  • $SLURM_JOB_ID:当前作业的唯一ID

为什么这比scontrol show jobid -dd更好?

  • 直接提取你需要的节点+核心数信息,完全过滤掉scontrol输出的冗余配置(比如内存、优先级、提交时间等)
  • 可以直接在作业脚本中自动化处理,不用手动复制粘贴或者解析大段文本
  • 两种方法都支持压缩格式的节点/核心数,不需要手动展开范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:17:33