跳转至

课程集群使用说明

课程为同学们提供了实验集群来完成作业,并用于进行最终的测试和评分。你 可以 不在集群上完成作业,但 必须 保证提交的版本能在课程集群上正常地编译和运行,否则可能导致无法得到任何作业分数。所有的正确性和性能测试,都以课程集群的运行结果为准。

知识储备

完成该实验需要一定的 Make、SSH、Shell 和 Linux 的使用知识。同时,我们还推荐使用 Git 进行版本控制。如果你是大三或之后选的课程,那么你应该已经在《软件工程》《编译原理》《程序设计训练》等课程中学到了相应的知识。如果你是大一大二选的课程,可以参考以下的教程进行预习:

其中特别推荐 计算机教育中缺失的一课,其中包含了大量有用的内容。

集群配置

集群由五台 Dell PowerEdge R730 服务器构成,主机名为 conv[0-4],硬件配置为:

  • CPU: 2 \times Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz (14 Cores, turbo off)
  • Memory: 16 \times 16 GB DDR4-2400
  • Network: 1000 Mbps Ethernet + 100 Gbps Infiniband EDR
  • GPU: 1 \times NVIDIA GeForce GTX 1080 (conv0) / 1 \times NVIDIA Tesla P100 (conv[1-3])

所有服务器都安装了 Debian 11 (bullseye) 操作系统,conv0 上共有 14TB 的存储,作为提供给同学的共享 home。注意 conv0 的 GPU 与实际计算节点不同,因此性能表现可能有较大差异。

访问方式

集群的登录节点 conv0 可供 SSH 访问,通过下发的用户名(学号)和初始密码登录到 166.111.68.16322222 端口即可。在校内和校外都可直接访问,无需使用代理或者 VPN。如果使用终端,命令类似 ssh -p 22222 2019000000@166.111.68.163。如果使用客户端,注意不要忘记配置端口和用户名。

注意密码安全

初始密码是随机生成的,比较难记。你可以使用 passwd 命令更改登陆密码。为了保证安全,我们在集群上配置了密码复杂性策略:新密码必须至少 12 位长、不能包含用户名、不能包含连续的重复字符、不能包含连续的序列(如 1234)。

IP 封禁

为了防止暴力破解,单个 IP 在三次登录失败后,将会被登录节点封禁 10 分钟。封禁期间,登录集群可能会遭遇连接超时问题,请稍后再试。

为了简化过程和增强安全性,强烈推荐配置公钥进行 SSH 登录,你可以自行搜索相关的教程。如果需要使用集群上的图形化工具,需要保证本地有正在运行的 X server,并在连接时启用 SSH 的 X11 Forwarding 功能,即使用 ssh -X 登录集群。

禁止分享账号

禁止以任何形式将自己的账号分享给任何其他同学(无论是否选课)使用,包括且不限于提供密码、私钥等。一经发现,涉及的选课同学所有作业成绩无效。

conv[1-4] 为计算节点,不允许直接 SSH 连接,只能使用 SLURM 提交作业的形式在上面运行任务。

为了方便同学完成作业,conv0 被允许访问校外网络,而 conv[1-4] 不能访问集群以外的主机。

文件编辑

学生在集群上的 home 目录形如 /home/course/hpc/users/2020000000。你应当 在且仅在 此目录下放置作业文件。

注意权限

默认情况下,所有学生账号属于同一个组(hpc-lab),但 home 目录仅允许自己访问(默认权限为 700)。严格禁止 更改自己 home 目录的权限,以防其他人访问你的 home 目录。如果发现故意的此类行为,视同分享账号处理。

集群上安装了 VIM、Emacs、nano 等文本编辑器,你可以自由选取使用。也可以在本地编写代码并推送到集群上测试,推荐使用 Git 来进行文件的同步和追踪,或者使用 rsync 只进行同步。此外,为了防止由于网络原因造成的进度丢失、程序终止等问题,推荐在登录 SSH 后使用 screentmux 来进行终端复用。本文档中不会详细介绍这些工具,建议同学们自行查阅学习,亦可询问助教。

不推荐在集群上编辑

虽然 VSCode Remote SSH / JetBrains Remote Development 允许直接在集群上在线编辑,方便易用。但由于选课同学较多,这些工具的服务端进程可能给服务器带来较大的负载, 显著影响使用体验 。此外,直接在集群上编辑还存在集群损坏导致的 文件丢失风险 。因此推荐在本地编辑,使用集群进行调试。

如果你依旧选择在集群上编辑,说明你已经阅读并知悉了上述内容,并且 不会就这些问题向教学团队提出质疑

为了防止误操作,集群的 home 使用 ZFS 配置了自动的快照备份。每个用户的 home 都是单独的 ZFS dataset,可以通过访问 ~/.zfs/snapshot/ 下各个文件夹的方式获取快照时间点时存在的的文件,文件夹名称即为快照时间。如果需要,也可以请求助教直接将整个 home 回滚到某个当前存在的快照对应的时间点。注意快照是 只读的 ,并且在一段时间后会自动删除。请 自行备份 重要的文件,对于任何误操作导致的后果,包括且不限于作业丢失无法找回等,教学团队概不负责。

工具链与环境加载

集群的系统中预装了 GCC 10.2.1、GNU make、CMake 等常用的编译工具。所需的其他工具叙述如下:

Spack

集群使用 Spack 管理软件包,安装在 /home/spack/spack 下。用户登录后,在 shell 中输入 spack 即可自动加载。如果需要在脚本中加载,可以使用 source /home/spack/spack/share/spack/setup-env.sh 语句。

使用 spack find 可以列出所有已经安装的软件,集群中预装了下列软件可供加载:

  • cuda@11.1.0
  • openmpi@4.0.5

使用 spack load/unload xxx 即可从当前环境中加载/移除相应的软件包,如 spack load cuda 后即可使用 NVCC 编译器,spack unload openmpi 可移除 OpenMPI。注意使用 Spack 中的软件编译得到的文件,在运行时一般也需要加载对应的软件,否则可能会出现找不到库(.so 文件)的错误。用户无权安装或移除 Spack 中的软件,如有特殊需要,请与助教联系。

Intel 工具链

集群中还安装了全套的 Intel OneAPI 2021,包含 Intel MPI、MKL、ICC、vTune、Advisor 等组件。这些组件的安装目录在 /opt/intel/oneapi 下,可以通过其附带的脚本来加载环境,如:

source /opt/intel/oneapi/setvars.sh # 加载全部环境,或
source /opt/intel/oneapi/compiler/latest/env/vars.sh # 仅加载 ICC 编译器
source /opt/intel/oneapi/mpi/latest/env/vars.sh # 仅加载 Intel MPI
source /opt/intel/oneapi/mkl/latest/env/vars.sh # 仅加载 MKL
source /opt/intel/oneapi/vtune/latest/vtune-vars.sh # 仅加载 vTune
source /opt/intel/oneapi/advisor/latest/env/vars.sh # 仅加载 advisor

关于这些工具的使用方法,可以参见 工具概述 部分。

SLURM 使用

集群使用 SLURM 来管理作业提交。

必须使用 SLURM

任何任务都应该使用 SLURM 进行提交,登录节点(conv0)仅可进行编译和调试,禁止运行任务。 集群包含自动的监控脚本,如果检测到某用户在登录节点上有较长时间高负载,将会 强制杀死 其所有进程。

常用的 SLURM 命令包括 sinfo, squeue, srun, sbatchsacct

sinfosqueuesacct 用于状态查询。其中 sinfo 查询整个集群当前的状态,squeue 查询当前队列中正在运行和等待运行的任务(以及它们的所有者、任务名等)、sacct 可以查看属于自己的所有历史任务统计。这些命令的用法可以查询相应的文档,也可以查看 此教程

srun 用于运行单个程序,常见用法如:

srun -N 4 -n 8 --cpu-bind sockets ./test --args

上述命令表示占用全部 4 个节点,共运行 8 个进程(每机 2 进程),并将每个进程绑定到一个 CPU socket(即一个 NUMA 节点)。通常来说,只需要关注 -N-n 选项,用来控制进程数量;在一些负载上(尤其是 memory bound 程序),进程绑定 可能 对性能有较大影响,需要仔细调节。

为了提高作业运行效率,实验集群的 SLURM 默认工作在**非独占模式**下。如果需要独占节点,需要添加参数 --exclusive,此时每个任务的 最小分配粒度 为单个节点。在助教测试时,所有的任务都会独占节点运行,以防互相干扰。

由于机器数量有限,任务可能不会立刻被执行,此时 SLURM 会给出类似下面的提示,请耐心等待:

srun: job 271 queued and waiting for resources

集群只有一个名为 conv 的队列,默认不能使用 GPU。如果需要 GPU 则需要添加参数:--gpus M,其中 M 为总 GPU 数量。更详尽的用法请参见 Generic Resource (GRES) Scheduling

sbatch 用于提交一个非交互式的运行脚本,适用于时间较长的或多个任务的提交。本文档中不详细介绍这一命令的用法,有需要的同学可以查看 此教程。在此脚本中,需要显式地加载 Spack、使用 Spack 加载依赖软件后,方可正常执行程序。使用 sbatchsrun 提交的任务都可以用 scancel 命令进行取消或终止。

由于 salloc 经常引发资源占用问题,实验集群上 不允许 使用此命令。

资源限制

禁止滥用

除了上述已经声明的事项,在使用集群时,以下行为也是 严格禁止 的:

  • 任何与课程教学内容无关的行为,包括且不限于用作入校连接跳板、下载或存放无关文件;
  • 任何尝试攻击集群的行为,包括且不限于非法提升权限、暴力破解密码、非正常读写磁盘;
  • 任何恶意的、违反法律法规的行为,包括且不限于发起网络攻击、运行加密货币挖矿;
  • 任何长时间抢占资源的行为,包括且不限于使用脚本循环提交大量任务、在跳板机上运行大量任务。

由于选课人数较多,为了保证同学们能够公平地分享集群资源,我们设定了一系列的资源限制,包括空间限制与任务运行限制。每个用户的 home 配额为 20GB,超出这一限制后将无法再创建或修改文件。如果有合理的需求,可以联系助教进行扩容。

学期中的大部分时间内,选课同学可以无限制地使用实验集群的所有计算资源,但任何 单个任务 消耗的实际时长被限制为 5 分钟以内。根据经验,集群在作业 deadline 前的一段时间较为繁忙,通常会出现提交任务需要排队,甚至排队较长时间的现象。为保证该时间段内所有同学均有可用的资源,在每次编程作业提交前一周(以网络学堂上的时间限制为准)内,每位同学的总机时将会被限制为 112 核时(即假设集群满占用状态下,每人至多在全机上运行一小时)。

如果使用的核时超出限制,可能会导致当次作业被 扣除一定的分数 ;如果超出较多,将会导致你在本次作业周期内无法再提交任何任务。且对于超出限额的任务,随时可能会 在不被通知的情况下被集群管理员中止 。你可以在登录节点上运行 my_quota 命令来获取当前自己作业周期中的核时消耗数量(注意 used 对应的单位是 核 \times 分钟)。


最后更新: 2024年3月28日
作者: Harry Chen (96.62%), Kezhao Huang (0.68%), Harry Chen (1.35%), Jiajie Chen (0.68%), Rick Ho (0.68%)