一、集群简介
一个计算集群是由一组计算性能强劲的计算机通过高速网络连接后组成。集群中某单台计算机被称为节点(node)。高性能计算集群一般由登录节点、计算节点和存储节点组成。

用户需要先连接到登录节点,登录节点是连接整个集群的入口。用户通过登录节点来进一步调用计算资源。
计算节点,是提供计算服务的计算机节点,可以是CPU节点或GPU节点。通常情况下,一个用户作业任务需要一台或多台计算节点来支持其计算服务。
将某个计算作业任务分配到不同计算节点上进行计算的工具被称为作业调度系统,常见的有Slurm,PBS等。
计算作业一般需要读写文件,我们采用了共享存储系统,将存储节点的磁盘空间映射到所有计算节点上。共享存储的可用磁盘容量非常大,用户可以像操作本地的文件一样操作远程的存储节点上的文件。
注意:请勿在集群的登陆节点执行多核并行的计算任务!
二、登陆集群
1. 安装xshell
点击下方链接下载家庭和学校免费版的xshell
打开下载好的安装包并进行安装,安装好后填入姓名和邮箱进行注册激活
2. 线路选择
登录集群有移动、联通和电信三条线路可供选择,点击下方链接确定自己的线路运营商,选择对应的线路

如果查询显示科技网等其他运营商,可以随意选择一条线路进行登录,并在晚上9点以后对所有线路使用WinSCP软件测试文件下载速度,选择下载速度最快的线路即可
3. SSH登录
打开xshell 8后,在弹出的对话框中点击“新建”

在弹出的界面中按照①②③④顺序依次操作,填写连接信息

在弹出的界面中按照①②③顺序依次操作,填写用户身份验证信息




三、文件传输
1. 安装WinSCP
点击下方链接下载WinSCP
打开下载好的安装包并进行安装
2. 连接服务器
打开winscp后,按照下方提示,填写服务器信息





3. 断点续传
WinSCP支持断点续传功能,允许在传输过程中因网络中断或其他意外情况导致传输失败时,能够从中断的位置继续传输,而无需重新开始整个文件传输过程

设置好断点续传功能后,下载文件时,个人电脑上对应文件夹内会出现.filepart格式的文件,若传输失败,只要不删除.filepart格式文件,再次向此文件夹下载相同文件,即可实现自动续传
四、作业管理
1. Slurm作业管理系统
在使用Slurm作业系统之前,需要了解几个基本概念:
- 登陆节点(Login node)
登录节点是整个集群的入口点,集群所有用户共享使用同一个登陆节点,通常仅用于作业提交、文件编辑和编译工作,不应直接运行计算任务 - 计算节点(Compute Nodes)
实际执行计算任务的服务器,包含处理器、显卡、内存、磁盘空间等资源 - 分区(Partition)
分区是将计算节点按照资源类型或者其他逻辑划分的不同分组 - 作业(job)
用户向集群提交的一个计算任务请求,它代表一次完整的资源分配和任务执行过程
2. 常用Slurm命令详解
2.1 sinfo
sinfo命令的作用是查看分区和节点状态
sinfo # 显示所有分区和节点的基本信息
sinfo -l # 详细格式显示
sinfo -N # 以每行一个节点的方式显示
sinfo -p GPU # 查看特定分区(如GPU分区)状态
sinfo --states=idle # 只显示空闲节点
输出示例:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
GPU* up infinite 31 mix node[34-50,54-67]
GPU* up infinite 19 idle node[51-53,68-83]
CPU up 2-00:00:00 2 alloc node[02-03]
CPU up 2-00:00:00 1 idle node04
PARTITION(分区)
分区是将计算节点按照资源类型或者其他逻辑划分的不同分组
TIMELIMIT(作业时间限制)
格式为天-小时:分钟:秒,infinite代表无作业时间限制
STATE(节点状态)
| idle | 节点空闲,可接收新作业 |
| allocated/alloc | 节点已被分配给作业 |
| down | 节点宕机或不可用 |
| draining/drain | 节点正在排空任务,不再接收新作业 |
| mixed | 节点部分资源已分配,部分空闲 |
2.2 squeue
squeue命令的作用的查看作业状态
squeue # 只看当前用户的作业
\squeue # 显示所有用户的作业
squeue -p GPU # 查看特定分区的作业
默认情况下squeue输出的内容如下,分别是作业号,分区,作业名,用户,作业状态,运行时间,节点数量,运行节点(如果还在排队则显示排队原因)
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
2041 GPU job_name user1 PD 0:00 1 (AssocGrpGRES)
2039 GPU job_name user1 R 14:36:48 1 gpu01
作业状态(ST字段)包括:
| PD(pending) | 排队中 |
| R(running) | 运行中 |
| CG(completing) | 完成中 |
| F(failed) | 失败 |
NODELIST(REASON)字段排队原因包括:
| AssocGrpGRES | 此账户资源用尽 |
| Resources | 当前分区资源不足 |
| Priority | 当前任务优先级比其他任务优先级低 |
| QOS****PerUserLimit | 超过当前QOS用户最大CPU/GPU/任务数量等限制 |
| JobHeldUser | 用户主动挂起的作业 |
| InvalidAccount | 用户的SLURM账号无效或未授权使用该分区 |
2.3 sbatch
sbatch命令的作用是提交批处理作业,将整个计算过程,写到脚本中,通过sbatch指令提交到计算节点上执行
这是slurm作业系统最常用的作业提交方式,提交后立即返回命令行终端,作业在后台运行
假设我们的计算过程为:在计算节点上运行nvidia-smi指令,那么就可以这么编写作业脚本
#!/bin/bash
#SBATCH -o %j.out
#SBATCH -J job_name
#SBATCH -p 2V100
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --gres=gpu:1
nvidia-smi
假设上面作业脚本的文件名为job.sh,通过以下命令提交
sbatch job.sh
成功提交任务后,会得到一个作业号
Submitted batch job 48769
此作业号可以用squeue命令查询到
squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
48769 4P100 job_name user1 R 2:04 1 node107
2.4 scancel
scancel命令的作用是取消队列中已提交的作业
取消作业ID为48769的作业
scancel 48769
取消作业号为48769到48780的一连串作业
scancel [48769-48780]
取消所有正在排队的作业
scancel -t PENDING
#也可以指定其他状态,比如正在运行的(RUNNING)
2.5 scontrol
scontrol命令的作用是系统控制与详细信息查看
scontrol show job 123 # 显示作业号为123的作业的详细信息
scontrol show nodes node01 # 显示节点node01的详细配置
scontrol hold 123 # 挂起/暂停排队中尚未运行的作业号为123的作业,挂起的作业将不会被执行。
scontrol release 123 # 释放被挂起的作业123
3. Slurm作业脚本编写
3.1 基本脚本结构
Slurm作业脚本是一个shell脚本,包含Slurm指令和要执行的命令。基本结构如下:
#!/bin/bash
#SBATCH 指令部分
# 要执行的命令部分
3.2 常用SBATCH指令详解
#!/bin/bash
# 作业名称(--job-name或-J)
#SBATCH --job-name=my_job
# 指定分区(--partition或-p)
#SBATCH --partition=GPU
# 指定节点数(--nodes或-N,格式:最小节点数或最小节点数-最大节点数)
#SBATCH --nodes=1
#SBATCH --nodes=1-2
# 指定总任务数(--ntasks或-n,一般一个任务需一个CPU核,因此总任务数通常可理解为CPU核心数)
#SBATCH --ntasks=32
# 每个节点上的任务数
#SBATCH --ntasks-per-node=16
# 每个任务需要的CPU数
#SBATCH --cpus-per-task=1
# 内存需求(单位可以是K、M、G)
#SBATCH --mem=16G
# 每个CPU需要的内存
#SBATCH --mem-per-cpu=1G
# 作业最长运行时间(格式:days-hours:minutes:seconds)
#SBATCH --time=2-00:00:00
# 标准输出文件(--output或-o)
#SBATCH --output=job_%j.out
# 标准错误输出文件
#SBATCH --error=job_%j.err
# 需要GPU资源
#SBATCH --gres=gpu:2
3.3 实际应用示例
弦月一号的1V100队列申请一张V100显卡计算VASP任务的脚本
#!/bin/bash 👈Linux 系统中脚本文件开头的特殊注释
#SBATCH -o %j.out 👈标准输出文件,%j是指本次作业的作业号,因此输出文件名称为作业号.out
#SBATCH -J job_name 👈作业名称设置为job_name
#SBATCH -p 1V100 👈指定此次作业提交到1V100分区
#SBATCH --nodes=1 👈指定此次作业需要一个节点
#SBATCH --ntasks=1 👈指定此次作业任务数量为1
#SBATCH --gres=gpu:1 👈指定此次作业申请一个显卡
dos2unix ./POSCAR ./INCAR ./KPOINTS ./POTCAR 👈解决 Windows 和 Unix/Linux 系统间文本文件格式不兼容的问题
source /public/toolkit/oneapi_2023/mkl/latest/env/vars.sh 👈加载intel MKL库
module load /public/toolkit/nvidia/hpc_sdk/modulefiles/nvhpc/25.3 👈加载nvhpc_sdk环境变量
export NO_STOP_MESSAGE=1
export OMP_NUM_THREADS=1
export vasp_path=/public/software/vasp/GPU/vasp/vasp_std 👈指定VASP程序所在路径
mpirun -np $SLURM_NTASKS --bind-to none $vasp_path 👈运行VASP程序
弦月一号的CPU队列申请48核心计算VASP任务的脚本
#!/bin/bash 👈Linux 系统中脚本文件开头的特殊注释
#SBATCH -o %j.out 👈标准输出文件,%j是指本次作业的作业号,因此输出文件名称为作业号.out
#SBATCH -J job_name 👈作业名称设置为job_name
#SBATCH -p CPU 👈指定此次作业提交到CPU分区
#SBATCH --nodes=1 👈指定此次作业需要一个节点
#SBATCH --ntasks=48 👈指定此次作业任务总量为48
ulimit -s unlimited 👈取消进程的栈大小限制,允许程序使用任意大小的栈内存
source /public/toolkit/intel/oneapi/setvars.sh intel64 > /dev/null 👈加载intel_oneapi环境变量
export vasp_path=/public/software/vasp/CPU/vasp.6.4.2/vasp_std 👈指定VASP程序所在路径
mpirun -np $SLURM_NTASKS $vasp_path 👈运行VASP程序
五、Linux系统命令
1. 命令行
我们日常使用的个人计算机,绝大多数都运行着 Windows 操作系统。它提供了一套成熟完善的图形化桌面环境,用户通过鼠标点击、拖拽,配合键盘输入,就能直观、便捷地完成几乎所有日常操作,学习成本低,上手门槛也不高。
而在服务器领域,Linux 系统是绝对的主流。为了追求极致的运行稳定性、高效的资源利用率和最小的安全风险,服务器版的 Linux 通常不会安装图形桌面环境。此时,Linux 命令行就成了与系统交互的核心方式 —— 它是一个纯粹的文本界面,用户通过键盘输入指令,直接告诉系统要执行什么任务,全程无需鼠标操作,所有管理、配置、运维、计算任务都靠命令完成。这种方式虽然对新手有一定学习门槛,但在服务器场景下,它更高效、更可靠、更适合批量自动化与远程管理。
它长什么样?你现在看到的这种界面就是命令行:
(base) vasp6666@login01:~/test$
| 部分 | 含义 |
| (base) | 当前激活的 conda 环境是base(conda 的默认核心环境) |
| vasp6666 | 当前登录的用户名(你用这个账号操作服务器) |
| @ | 分隔符,无实际功能,仅用于区分 “用户名” 和 “主机名” |
| login01 | 当前所在服务器的主机名(这里是集群的登录节点,名字叫 login01) |
| : | 分隔符,区分 “主机名” 和 “当前工作目录” |
| ~/test | 当前所在的工作目录路径: ~ 是 Linux 的特殊符号,代表当前用户(vasp6666)的家目录(/home/vasp6666); ~/test 即 /home/vasp6666/test 这个文件夹 |
| $ | 命令行结束符,代表: 当前是普通用户(非 root),有操作权限限制; 若显示#,则是 root 超级用户(无权限限制) |
