如何配置Slurm自动终止低使用率/闲置GPU的作业?
配置Slurm自动终止低使用率/闲置GPU作业的方案
当然可以实现,除了全局作业时限,有以下几种更智能的方案:
1. 自定义定时监控脚本
这是最易落地的方式,通过定时检查GPU使用率,自动终止满足闲置条件的作业:
- 核心逻辑:
- 用
nvidia-smi或gpustat获取GPU上的进程及对应使用率 - 通过进程PID关联到Slurm作业ID(利用
scontrol show pid <pid>命令) - 设置闲置阈值(比如连续10分钟GPU使用率低于5%),满足条件时执行
scancel <job_id> - 用
cron或Slurm定时任务(sbatch循环执行)定期运行脚本
- 用
- 示例脚本片段:
#!/bin/bash # 检查间隔:1分钟 THRESHOLD=5 CHECK_COUNT=10 gpustat -cp | grep -v "PID" | while read line; do pid=$(echo "$line" | awk '{print $1}') gpu_util=$(echo "$line" | awk '{print $4}' | sed 's/%//') job_id=$(scontrol show pid "$pid" | grep -oP 'JobId=\K\d+') if [[ -n "$job_id" && "$gpu_util" -lt "$THRESHOLD" ]]; then state_file="/tmp/low_gpu_$job_id" if [[ -f "$state_file" ]]; then current_count=$(cat "$state_file") if [[ "$current_count" -ge "$CHECK_COUNT" ]]; then scancel "$job_id" rm "$state_file" echo "终止闲置作业:$job_id(GPU使用率持续低于${THRESHOLD}%达${CHECK_COUNT}分钟)" else echo $((current_count + 1)) > "$state_file" fi else echo 1 > "$state_file" fi fi done
2. 基于Slurm插件的实时监控
如果团队有开发能力,可以编写Slurm插件实现更原生的监控:
- 利用Slurm的
JobSubmitPlugins或JobEpilog/JobProlog机制,或者基于Slurm API开发自定义插件 - 插件可实时采集GPU使用数据(结合
acct_gather_gpu插件的统计结果),当作业连续处于低使用率状态时,触发Slurm的作业终止接口 - 这种方式需要修改Slurm配置并重新编译,适合大规模集群的统一管理
3. 作业级别的主动退出机制
让作业自身监控GPU使用率,满足闲置条件时主动退出:
- 在作业脚本中加入后台监控逻辑,当GPU使用率低于阈值时主动调用
exit - 配合Slurm的
--signal选项(比如sbatch --signal=SIGUSR1@300),提前给作业发送通知,预留清理时间 - 示例作业脚本片段:
#!/bin/bash # 后台监控GPU使用率 monitor_gpu() { while true; do avg_util=$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits | awk '{sum+=$1} END {print sum/NR}') if [[ "$avg_util" -lt 5 ]]; then echo "GPU使用率过低,作业将退出" exit 0 fi sleep 60 done } monitor_gpu & # 主作业任务 python train.py
注意事项
- 确保监控脚本拥有执行
scancel和读取GPU信息的权限 - 阈值和连续检查次数要根据集群作业类型调整,避免误杀初始化阶段或间歇性使用GPU的作业
- 可以启用Slurm的
acct_gather_gpu插件,通过sacct -o JobID,AllocGRES,MaxGPUUtilization查询历史GPU使用率,辅助优化阈值设置
内容的提问来源于stack exchange,提问作者Leo Gallucci
相关产品推荐
相关产品推荐

