WMG集群使用指南¶
Version: v1.0 | Date: 2025-04-24
使用须知¶
基本信息¶
集群管理和作业调度系统目前采用SLURM(Simple Linux Utility for Resource Management)开源框架。
WMG计算集群包括一个登录节点和若干计算节点组成。
集群用户直接访问的是登录节点,需要通过 Slurm 作业管理器提供的命令行接口向计算节点提交计算任务。具体方法参见编写/提交任务脚本。
使用集群需要掌握简单的 Linux 命令行操作,网上有很多这方面的教程,也可以使用 GPT 等 LLM 工具帮助生成和编辑目标命令。
重要注意事项¶
严禁在登录节点上直接运行计算任务!!!后果包括但不限于集群登录节点过载,导致用户集体掉线。
务必记得使用
srun [选项] 可执行程序 [程序参数]
命令提交交互式作业,或者通过srun --pty bash
启动交互式 Bash 环境再运行可执行程序!!!否则任务会在登录节点上运行!!!注意 节点计算资源有限,请估计或测试好任务需要的 CPU/memory 资源,谨慎填写任务脚本,避免出现有 GPU 但是其他资源不够导致他人任务长时间排队的情况。
集群节点清单¶
集群目前由登录节点、存储节点和计算节点组成,登录节点只负责 SLURM 控制/登录功能,严禁在登录节点上运行计算任务。
节点硬件配置¶
节点名 | 型号 | 厂商 | CPU 配置 | GPU 配置 |
---|---|---|---|---|
wmc-slave-g6 | SYS-4029GP-TRT | AMAX | Xeon Gold 5120 28核 | 1080Ti * 8 |
wmc-slave-g7 | SYS-4029GP-TRT | AMAX | Xeon Gold 5120 28核 | 1080Ti * 8 |
wmc-slave-g8 | 思腾合力 | 28 | 2080Ti * 8 | |
wmc-slave-g9 | 思腾合力 | 28 | 2080Ti * 8 | |
wmc-slave-g10 | SYS-4029GP-TRT | Xeon Gold 5120 28核 | 2080Ti * 8 | |
wmc-slave-g11 | 28 | 2080Ti * 8 | ||
wmc-slave-g12 | 28 | 2080Ti * 8 | ||
wmc-slave-g13 | 28核 | 2080Ti * 8 | ||
wmc-slave-g14 | 32 | 2080Ti * 10 | ||
wmc-slave-g15 | 32 | 2080Ti * 10 | ||
wmc-slave-g16 | SYS-4029GP-TRT2 | AMAX | Xeon Gold 5220R 48核 | 3090 * 7 |
wmc-slave-g17 | SYS-4029GP-TRT2 | AMAX | Xeon Gold 5220R 48核 | 3090 * 6 |
wmc-slave-g18 | 思腾合力 | 48 | A6000 * 10 | |
wmc-slave-g19 | 思腾合力 | 48 | A6000 * 10 | |
wmc-slave-g20 | 思腾合力 | 48 | A6000 * 10 | |
wmc-argon | ||||
wmc-helium | ||||
wmc-krypton | 思腾合力 |
节点软件配置¶
节点名 | 操作系统 | GPU 驱动版本 | 负责功能 |
---|---|---|---|
wmc-slave-g6 | Ubuntu 20.04.6 LTS | 535.183.01 | SLURM 控制/登录 |
wmc-slave-g7 | Ubuntu 18.04.4 LTS | 495.44 | 计算 |
wmc-slave-g8 | Ubuntu 20.04.6 LTS | 535.230.02 | 计算 |
wmc-slave-g9 | Ubuntu 20.04.6 LTS | 535.230.02 | 计算 |
wmc-slave-g10 | Ubuntu 20.04.6 LTS | 570.169 | 计算 |
wmc-slave-g11 | Ubuntu 18.04.4 LTS | 计算 | |
wmc-slave-g12 | Ubuntu 18.04.4 LTS | 计算 | |
wmc-slave-g13 | 退役 | ||
wmc-slave-g14 | Ubuntu 18.04.4 LTS | 计算 | |
wmc-slave-g15 | Ubuntu 18.04.4 LTS | 计算 | |
wmc-slave-g16 | Ubuntu 18.04.5 LTS | 550.54.14 | 计算 |
wmc-slave-g17 | Ubuntu 18.04.6 LTS | 550.54.14 | 计算 |
wmc-slave-g18 | Ubuntu 18.04.6 LTS | 计算 | |
wmc-slave-g19 | Ubuntu 20.04.6 LTS | 计算 | |
wmc-slave-g20 | Ubuntu 18.04.6 LTS | 计算 | |
wmc-argon | Debian 10 (buster) | 存储 | |
wmc-helium | Ubuntu 20.04.2 LTS | 存储 | |
wmc-krypton | Ubuntu 20.04.2 LTS | 存储 |
计算资源分区¶
以下是计算资源的分区情况,在申请调试节点和编写任务脚本时需要指定目标分区。如果是 GPU 分区,默认会分配对应物理节点的 CPU 资源,例如当分配的节点为 wmc-slave-g8 时,会默认分配 wmc-slave-g8 节点的 CPU 资源。目前 wmc-slave-g[18-20] 的 CPU 不参与分区,在申请这些节点的 GPU 任务时默认分配。
PARTITION | NODELIST |
---|---|
cpu3 | wmc-slave-g[7-12] |
cpu4 | wmc-slave-g[14-15] |
cpu5 | wmc-slave-g[16-17] |
gpu3 | wmc-slave-g[8-12,14-15] |
gpu4 | wmc-slave-g[16-17] |
gpu5 | wmc-slave-g[18-20] |
登录集群¶
集群账户¶
需要使用集群的老师和同学请联系管理员开通账户。每个集群用户使用独立的 Linux 账户登录和提交任务。为保证服务器安全,普通用户不提供 root 权限。
默认登录节点:wmc-slave-g6(用于 SSH 连接)
新账户首次登录¶
首次登录时需要修改初始密码(注意输入一遍初始密码两遍新密码):
You must change your password now and login again!
Current Password: (输入初始密码)
New password: (输入新密码)
Retype new password: (再次输入新密码)
修改完成后重新登录,成功后即可得到命令提示符:
Welcome! This is the Computer Cluster of Weiming Lab.
通过 SSH 连接登录节点¶
用户在登录节点上使用 Slurm 命令行提交计算任务,另外也可以进行一些简单的数据处理操作。
推荐使用 VS Code 插件 Remote-SSH 进行连接。config 文件示例(将信息提示替换为对应内容即可使用):
Host wmg-cluster
HostName ClusterAddress
User YourAccount
# 可以选择生成公私密钥对,将公钥添加到集群,如果使用密码登录可以将这条注释掉
IdentityFile /path/to/your/private/key
Windows/Linux 公私密钥对生成及使用请自行查找相关资料或借助 GPT 生成相关命令。
查看集群/节点状态¶
查看集群状态¶
在登陆节点上,使用 Slurm 提供的命令可以查看集群的各项状态。
sinfo
命令可以看到哪些分区/计算节点是空闲的(idle)、分配了一部分资源(mix)或者完全占满了(alloc),输出示例如下:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpu3 up infinite 1 drain wmc-slave-g7
cpu3 up infinite 5 idle wmc-slave-g[8-12]
cpu4 up infinite 1 mix wmc-slave-g14
cpu4 up infinite 1 idle wmc-slave-g15
cpu5 up infinite 1 mix wmc-slave-g16
cpu5 up infinite 1 idle wmc-slave-g17
gpu3 up infinite 1 mix wmc-slave-g14
gpu3 up infinite 6 idle wmc-slave-g[8-12,15]
gpu4 up infinite 1 mix wmc-slave-g16
gpu4 up infinite 1 idle wmc-slave-g17
gpu5 up infinite 3 mix wmc-slave-g[18-20]
通过
-o
参数自定义格式可以查看更多信息,例如:
# 显示每个节点的 CPU 和 GPU 总数
sinfo -o "%20n %10c %25G"
# 查看内存占用情况
sinfo -o "%20n %10m %10e %10a"
查看节点状态¶
scontrol
命令则可展示更详细的信息。scontrol show node 具体节点
查询节点信息、scontrol show partition
查询分区信息。例如
scontrol show node wmc-slave-g20
,得到输出如下:
NodeName=wmc-slave-g20 Arch=x86_64 CoresPerSocket=24
CPUAlloc=7 CPUTot=48 CPULoad=15.36
AvailableFeatures=(null)
ActiveFeatures=(null)
Gres=gpu:10(S:0)
NodeAddr=wmc-slave-g20 NodeHostName=wmc-slave-g20 Version=20.02.3
OS=Linux 5.4.0-89-generic #100~18.04.1-Ubuntu SMP Wed Sep 29 10:59:42 UTC 2021
RealMemory=248000 AllocMem=214688 FreeMem=59620 Sockets=2 Boards=1
State=MIXED ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
Partitions=gpu5
BootTime=2024-08-26T11:16:42 SlurmdStartTime=2024-08-26T11:17:20
CfgTRES=cpu=48,mem=248000M,billing=48
AllocTRES=cpu=7,mem=214688M
CapWatts=n/a
CurrentWatts=0 AveWatts=0
ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s
wmc-mon
工具可以查看特定计算节点上的 CPU、内存以及 GPU 使用信息。wmc-mon cpu wmc-slave-g20
: 查看 g20 节点上的所有进程信息(主要是 CPU、内存,输出同 top 命令)wmc-mon gpu wmc-slave-g20
: 查看 g20 节点上GPU 的使用情况(输出同 nvidia-smi 命令)如果需要查看各个节点的任务信息,参见监控任务状态。
调试节点申请&远程 debug¶
计算资源申请&使用¶
用户需要通过
salloc
命令申请资源后,使用srun
运行调试任务。salloc
命令示例如下:
# 使用 Slurm 分配交互式计算资源:
# --nodelist=wmc-slave-g12 # [可选] 强制指定节点名称,若省略则由系统自动分配
# -p gpu3 # 提交到 gpu3 分区(也可选择 cpu 分区)
# -N 1 # 分配 1 个计算节点
# -c 4 # 分配 4 个 CPU 核心
# --mem 30G # 分配 30GB 内存
# --gres gpu:1 # [可选] 分配 1 块目标 GPU,纯 CPU 任务可不填写
salloc --nodelist=wmc-slave-g12 -p gpu3 -N 1 -c 4 --mem 30G --gres gpu:1
获得计算资源分配后,务必使用
srun [选项] 可执行程序 [程序参数]
进行交互式作业调试,否则任务会运行在登录节点上,可能导致集群崩溃。
# 调试命令必须以 srun 开头,才能运行在分配的计算节点上
# 未加 srun 仍是在登录节点执行命令
hostname
# 使用 srun 在计算节点执行命令
srun hostname
# 查看分配的 gpu 信息
srun nvidia-smi
# 运行 python 脚本
srun python your_script.py
推荐在已分配的 Slurm 计算节点上,直接启动一个交互式 Bash Shell ,这样在后续调试中可以不用
srun
命令,防止不小心忘记。
# 在分配临时节点上启动交互式 Bash
srun --pty bash
# 进入交互式环境后可自由执行命令,不需要再使用 srun
nvidia-smi
python debug.py
# 退出交互式环境
exit
结束调试后,务必记得释放分配的计算资源,这里的
exit
命令和退出交互式环境的命令是分开的。
# 释放分配的计算资源
exit
在集群上使用 VS Code 远程 debug¶
首先,需要安装 VS Code 的 Remote-SSH 插件。
pip install ptvsd
,将以下代码加到需要调试的代码前面:
import ptvsd
ptvsd.enable_attach(address = ('0.0.0.0', 3000))
ptvsd.wait_for_attach()
在服务器上申请资源,
srun
运行 python 文件。在 VS Code 左侧点击“运行和调试”的图标(或
Ctrl+Shift+D
),点击“运行和调试”按钮(没有的话点击 Python Debugger 旁边的齿轮),调试器选择 Python Debugger ,调试配置选择“远程附加”, 主机名填wmc-slave-gX
(X为申请的调试节点),端口号填 3000 ,之后选择调试。此时,在代码上可以直接添加断点,中间变量可以在左侧实时看到。这个过程实际上是在创建一个 json 文件作为远程调试的配置。在调试完之后,务必记得释放申请的资源!
环境搭建¶
python 环境管理¶
推荐使用 Miniconda 进行 python 环境管理。
鉴于某些已知原因,建议 conda 和 pip 设置国内源。下面是简单示例:
# 查看所有配置的软件源和优先级
conda config --get channels
pip config list -v
# 添加软件源(更多源请自行查找)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
Hugging Face 加载模型¶
对于从 huggingface 上 load 模型,推荐两种方式:
在 bash 脚本里,运行 python 文件之前先通过命令
export HF_ENDPOINT="https://hf-mirror.com"
修改环境变量。直接本地手动下载后上传到集群。
CUDA 版本问题¶
查看当前版本¶
可以使用以下命令查看版本,如果驱动支持 CUDA 版本过低,请联系管理员更新 GPU 节点驱动。
# 驱动支持的最高 CUDA 版本(不一定是实际安装版本)
nvidia-smi
# 当前实际安装的 CUDA Toolkit 版本
nvcc --version
某些节点运行
nvcc --verison
会出现Command 'nvcc' not found
的情况,可以尝试手动指定CUDA版本,具体操作见下一小节。
指定/更改使用的 CUDA 版本¶
集群提供多个 CUDA 版本,存放在
/app/cuda
路径下,用户可以查看并选择合适的版本。用户可以通过修改环境变量指定 CUDA 版本:
# 临时修改环境变量(仅当前终端生效)
export CUDA_HOME=/app/cuda/cuda-11.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
# 验证环境变量
echo $CUDA_HOME # 应输出 /app/cuda/cuda-11.8
which nvcc # 应显示 /app/cuda/cuda-11.8/bin/nvcc
nvcc --version # 确认版本是否正确
在任务脚本中同样可以用上述命令指定任务运行的 CUDA 版本。
计算任务管理¶
编写/提交任务脚本 ¶
任务脚本用于描述 Slurm 计算任务。下面是一个简单的例子,这个脚本打印了一行文字、执行了一个 python 脚本、最后又打印了一行文字。
文件:test_sbatch.sh
#!/bin/bash
#SBATCH -p gpu1 # 在 gpu1 分区运行(不写默认为 cpu1)
#SBATCH -N 1 # 只在一个节点上运行任务
#SBATCH -c 1 # 申请 CPU 核心:1 个
#SBATCH --mem 500 # 申请内存:500 MB
#SBATCH --gres gpu:1 # 分配 1 个 GPU(纯 CPU 任务不用写)
#SBATCH -o test-%j.log # 输出 log 文件,%j会被自动替换为任务的ID(JobID)
echo "job begin"
python3 my_script.py # my_script.py 是用户的 python 程序
echo "job end"
这个任务脚本实际上就是个 bash 脚本。Slurm 读取以
#SBATCH
起始的行,这些行在 bash 语法里是注释,因此 bash 不会理会。集群任务脚本 中提供了更多示例。调试时可以通过以下命令进行试运行:
# 在调试节点运行名为 test_sbatch.sh 的 Bash 脚本
srun bash test_sbatch.sh
写好任务脚本后,使用
sbatch
命令向集群提交计算任务。若提交成功,sbatch
会输出任务编号,该任务会进入队列,请求的资源可用后就会执行。
# 这里也可以用 --nodelist 参数指定节点
sbatch test_sbatch.sh
注意 节点计算资源有限,请估计或测试好任务需要的 CPU/memory 资源,谨慎填写任务脚本,避免出现有 GPU 但是其他资源不够导致他人任务长时间排队的情况。
监控任务状态 ¶
用
squeue
命令查看当前正在运行或排队等待的计算任务。默认情况下,squeue
的输出包含以下列:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
squeue
命令也支持通过-o
参数自定义格式,示例如下。每个 %.Nx 表示一个字段,其中: N 是字段的固定宽度(字符数),不足时填充空格,超过时截断。 x 是字段类型标识符。
squeue -o "%.10i %.9P %.50j %.14u %.12T %.14M %.18R %.6C %.14b %.12m"
# 输出格式示例
JOBID PARTITION NAME USER STATE TIME NODELIST(REASON) CPUS TRES_PER_NODE MIN_MEMORY
252990 gpu5 Test.sh xxxxxxxxxxx PENDING 0:00 (Resources) 4 gpu:1 40G
252996 gpu5 sbatch_0_0.sh xxxxxxxxxxxx PENDING 0:00 (Priority) 4 gpu:1 10G
252498 gpu5 train_cond.sh xxxxxxxxxxxxx RUNNING 4-01:53:14 wmc-slave-g19 16 gpu:4 32G
252596 cpu3 run2.sh xxxxx RUNNING 3-14:47:09 wmc-slave-g9 12 N/A 20G
输出解析
字段名 | 说明 |
---|---|
JOBID | 任务的唯一标识符 |
PARTITION | 任务所在的队列/分区名称 |
NAME | 任务名称(通常为提交脚本的名称) |
USER | 提交任务的用户名 |
ST(STATE) | 任务状态代码(如 PD 、R 、CG 等) |
TIME | 任务已运行时间(格式为 天数-小时:分钟:秒 ,如 2-13:45:30 ) |
NODES | 任务使用的节点数量 |
NODELIST(REASON) | 分配的节点列表(如已运行)或未运行的原因(如 Resources 、Priority ) |
CPUS | 任务分配的 CPU 核心数量 |
TRES_PER_NODE | 每节点可跟踪资源(Trackable RESources per Node),通常为任务分配的 GPU 数目 |
MIN_MEMORY | 任务请求的最小内存量 |
常见任务状态
代码 | 全称 | 说明 |
---|---|---|
PD |
PENDING | 作业正在排队等待资源 |
R |
RUNNING | 作业正在运行中 |
CG |
COMPLETING | 作业正在收尾(即将完成) |
CD |
COMPLETED | 作业已成功完成 |
F |
FAILED | 作业因错误失败 |
TO |
TIMEOUT | 作业因超时被终止 |
任务执行完毕后会很快从队列中移除,这时
squeue
就看不到任务信息了。这时可以通过sacct
查阅任务的审计信息。
# 根据需要选择参数
sacct -j <jobid> -u <username>
取消任务¶
使用
scancel
取消正在等待或者执行中的任务。任务将会从任务队列中消失。
scancel <JOB_ID>
文件传输&管理¶
VS Code 支持 Windows 图形化界面的文件拖曳操作,但不显示传输速度和进度等相关信息,因此我们在这里提供一些其他的文件传输&管理工具。
使用 SCP 进行文件传输¶
SCP(Secure Copy Protocol)是一个基于 SSH(Secure Shell)的安全文件传输协议,用于在本地主机和远程主机之间(或两台远程主机之间)加密传输文件或目录。
正常 Linux 系统都原生支持 SCP 协议;Windows 系统则取决于当前是否已安装 OpenSSH 客户端,而 Windows 10 在 2018 年 4 月更新(版本 1803)中默认安装了 OpenSSH 客户端,只要你的电脑不是古董,大概率可以直接使用。
用法示例
# 从本地复制到远程
scp /local/path/file.txt username@remote_host:/remote/path/
# 复制整个目录(递归)
scp -r /local/dir username@remote_host:/remote/path/
# 从远程复制到本地
scp username@remote_host:/remote/path/file.txt /local/path/
Linux 和 OpenSSH 客户端还支持 SFTP(SSH File Transfer Protocol)协议,提供多功能文件管理,支持断点续传,但比 SCP 稍慢一些,有需要的用户可以自行查阅相关使用方法。
如需图形化操作,推荐使用 WinSCP(同时支持 SCP 和 SFTP )。
常用命令¶
# 申请调试节点
salloc --nodelist=<NODE_NAME> -p <PARTITION> -N <NODE_COUNT> -c <CPU_PER_NODE> --mem <MEMORY_SIZE> --gres gpu:<GPU_COUNT>
# 查看任务信息
squeue -o "%.10i %.9P %.50j %.14u %.12T %.14M %.18R %.6C %.14b %.12m"
# 取消任务
scancel <JOB_ID>