Skip to content
Go back

在 Slurm 集群上用 gvitop 查看计算节点显存占用

Published:  at  10:46 PM

目录

一、问题背景

在 Slurm 集群上,用户通常先登录到 login node,再通过 sbatchsrun 把任务提交到计算节点。真正占用 GPU 的进程运行在 compute node 上,而不是 login node 上。

所以直接在登录节点执行:

nvitop

往往看不到正在训练的进程。更合理的方式是:先找到自己的 Slurm job,再进入这个 job 所在的计算节点查看 GPU。

二、核心函数

可以把下面这段函数写入 ~/.bashrc~/.zshrc

gvitop () {
  jobid="$1"

  # 自动找最近 job
  if [ -z "$jobid" ]; then
    jobid=$(squeue -u "$USER" -t R -h -o %A | head -n 1)
    [ -z "$jobid" ] && echo "No running job" && return 1
    echo "Using latest job: $jobid"
  fi

  # 尝试直接运行
  srun --jobid="$jobid" --overlap --pty nvitop 2>/dev/null

  # fallback
  if [ $? -ne 0 ]; then
    echo "Fallback to bash + nvitop"
    srun --jobid="$jobid" --overlap --pty bash -c "nvitop"
  fi
}

重新加载配置:

source ~/.bashrc
# 或者
source ~/.zshrc

三、使用方式

如果当前只有一个正在运行的任务,直接执行:

gvitop

如果有多个任务,建议显式指定 job id:

gvitop 123456

可以先用下面的命令查看自己的运行中任务:

squeue -u "$USER" -t R

四、为什么需要 —overlap

核心命令是:

srun --jobid="$jobid" --overlap --pty nvitop

--jobid 表示复用已有 job allocation,--pty 表示启动一个交互式终端,--overlap 则允许这个新的 step 和已有任务共享 allocation 中的资源。

这里运行的是 nvitop,目标是观察状态,而不是再启动一个训练任务。因此使用 --overlap 更符合这个场景。

五、fallback 的意义

有些集群环境中,直接执行:

srun --jobid="$jobid" --overlap --pty nvitop

可能会因为 PATH、shell 初始化或集群配置问题失败。所以函数里加了 fallback:

srun --jobid="$jobid" --overlap --pty bash -c "nvitop"

先启动 bash,再由 bash 执行 nvitop,通常能复用更多用户侧的 shell 环境。

六、常见问题

如果输出:

No running job

说明当前用户没有处于 R 状态的 Slurm job。可以用下面的命令确认:

squeue -u "$USER"

如果提示 nvitop: command not found,说明计算节点环境里没有安装 nvitop,或者当前 shell 没有激活对应环境。可以进一步确认:

which nvitop

如果使用 Conda 环境,也可以把 fallback 改成:

srun --jobid="$jobid" --overlap --pty bash -lc "conda activate your-env && nvitop"

七、总结

这个函数解决的是 Slurm 集群上的一个具体问题:训练任务跑在计算节点,但用户日常登录的是 login node,直接运行 nvitop 往往看不到真正的 GPU 占用。

日常使用时只需要:

gvitop
# 或者
gvitop 123456

它不复杂,但能减少在集群上排查显存占用、确认训练进程状态时的重复操作。


Suggest Changes
Share this post on:

Previous Post
Codex Full Course 2026:把 AI 编程工具当成 Agent 工作台使用
Next Post
Anthropic:我们如何构建多代理 Research 系统