集群和个人电脑的区别
集群,即我们平时所说的“服务器”,将会是我们进行科学计算的第一劳动力。它有着和 个人计算机(PC)相似的用法,但在某些关键方面和个人计算机有本质的不同。这些 不同主要体现在:
- 使用服务器 Linux 系统,很少用 ubuntu,系统各类软件版本较低,更新较慢, 追求运行的稳定。
- 默认情况下图形界面为关闭状态,使用命令行跟系统进行交互,需要用户对命令行 模式有一定的熟练度。用户虽然可以使用图形界面方式连接,例如 X11 转发或者 VNC 等, 但由于其延迟较高,使用体验不好,因此还是推荐各位用户在命令行模式下操作。
- 多用户同时在线,用户之间会相互影响,会共享部分的计算资源。用户之间也可以 相互通信。例
write user pts/0 hello, nice to meet you! ^D
- 严格的权限管理,普通用户无法使用 sudo 进行权限提升,因此不能执行只有管理员 才能执行的操作,例如挂载,安装驱动,使用包管理器安装软件等。但并不意味着用户 无法安装自己需要的软件。
- 登录和计算分离。即登录所在的机器通常不是实际运行计算程序的机器。这是集群初学者 最容易产生的误区,认为超算就是一整个资源超级多的服务器,这是不对的。
相关概念
- 节点(node):指一台完整的主机,即通常我们说的“服务器”。根据它们的作用可分为 如下几类。
- 登录节点:供用户进行登录的机器,可以从外界访问,用户可在上面进行一些常规 操作,例如复制文件,编译小型软件等。
- 计算节点:主要负责服务器的所有计算任务,原则上只有计算节点才能运行用户的 计算程序,其他节点不可以。用户可以获得暂时的计算节点访问权限。根据计算的架构 还可细分为 CPU 节点,GPU 节点,胖节点等。
- 管理节点:主要负责集群各种系统的管理,例如用户管理,调度系统的控制器,集群 全局配置。只有管理员才有权限访问。
- 存储节点:主要负责集群的全局 IO,通常情况下集群所有节点的存储设备都放在 IO 节点上,然后由 IO 节点通过网络共享的方式挂载到其它节点。在大型超算集群中, 磁盘设备吞吐量特别大,因此需要专门用 IO 节点进行负载均衡,提高读写效率。
- 集群(cluster):一组节点经过局域网互联形成的计算机群。节点之间相互通信具有低 延迟高速率的特点。一般的集群都至少有两种以上的网络互联:一种是管理网,速度较慢 (1000Mbps),用于系统管理(查询网络用户,同步配置文件等);另一种是计算网,速度 较快(万兆或 Infiniband),主要用户磁盘 IO 和分布式并行程序的通信(MPI)。
- 主机名(hostname):节点的名字,用于区分是哪一台主机。一般在命令提示符(prompt) 中用户名的后面。在集群中由于有很多个节点,用户操作的时候一定要看清自己在哪。
未名教学一号的计算机互联结构
- 登录节点:
login[01-02]
- 计算节点:
cn67n[01-08],cn[68-70]n[01-14]
- 管理节点:
mgt[01-02]
- 存储节点:
io01
- 特殊:
gateway
,上游网关,主要用于网络的通信或一些软件 License Manager 的 安装。
登录
Linux/MacOS
使用终端即可登录。
ssh username@address
其中 user
为用户名,address
为服务器的地址,可以是 IP 或者域名。
配置免用户名登录
- 新建
.ssh/config
文件 - 建立如下的配置
Host pkuteach HostName ip_of_pkuteach User username
- 更改文件权限
chmod 600 .ssh/config
- 下次登录即可输入
ssh pkuteach
即可
配置 SSH Key 方式登录
此内容可选。SSH Key 是除用户名密码的另一种验证方式。它实际是一种非对称密钥体质。 用户将自己的公钥放在服务器上,而私钥放在本地。验证时将这两对密钥进行匹配验证, 如果验证成功即可登录。这就意味着只要拿到了你的私钥就可以登录使用你的私钥授权 的服务器!当然也可用另一个密码将私钥保护起来(需要注意的是这并不是一个愚蠢的 行为,因为使用 SSH Key 的原因不只是免除密码登录!)
- 生成 SSH Key Pair(如果以前生成过就无需再次生成)
ssh-keygen -t ed25519
- 按三下回车,确认保存位置,暂不设置密码。
- 将公钥
.ssh/id_ed25519.pub
上传的服务器上。 - 登录服务器,将
id_ed25519.pub
添加到授权的列表中。mkdir -p .ssh chmod 700 .ssh cat id_ed25519.pub >> .ssh/authorized_keys chmod 600 .ssh/authorized_keys
- 重新登录已经不需要密码。
Windows
推荐使用 MobaXterm 进行登录。在这里不讲。
调度系统
为什么要用调度系统?
为什么要用调度系统,上来就开始算不好吗?不好。作业调度系统的使用可以极大 减小用户程序之间的冲突,同时可追踪用户程序的运行情况。不过在某些执行效率方面 会略有降低。
- 在用户程序互不影响的条件下让各个程序按照指定的规则运行,注重资源的公平 与合理的分配。
- 用户需要做的是提交任务,告诉系统该做什么,需要多少资源,运行多长时间即可。不需要 实时盯着屏幕看,非常适合**批处理(batch)或离线(offline)**任务。
- 实现任务和资源绑定,有利于资源的规范使用,也可以减少用户查询空余资源的痛苦。
- 可记录用户消耗的资源数,有利于用户审计。所有大型计算集群有一套计费标准, 如果资源数量申请不合理,论文没写出来,经费却很快花光了!在收费集群上各位用户 一定要注意自己申请的资源大小,每一个 core 每一分钟都是需要花钱的。当然,在免费 的小集群上,这并不意味着用户可以为所欲为。
SLURM 结构
slurmctld
为主要的控制进程,负责处理提交的任务,任务的调度,任务控制等。 只需要安装在控制节点上(例如管理节点),在某些系统里还会有备用的 SLURM 控制节点。slurmdbd
主要负责用户审计,例如账号的管理,qos 的管理等。可能需要与数据库 进行交互(mysql, mariadb)。只需要安装在控制节点上。如果不需要审计功能可以不安装 这个模块。slurmd
计算节点控制进程,每个计算节点至少会安装一个。需要和其他节点的 slurmd 以及控制进程 slurmctld 进行通讯。主要功能是接收 slurmctld 分发的任务,创建 资源池并执行任务。
SLURM 分区
什么是分区?为什么要指定? 不同的节点的特性和硬件属性不同,设置分区可以帮助用户更好确定节点的特点,进而 选择最适合自己的节点进行运算。此外,如果集群中部分机器是私有的,那么设置分区 可以使得只有部分用户能在这个分区提交 Job。总的来说,分区(Partition)可看做 一系列节点的集合。
分区的节点可重叠。
示例:SLURM 脚本和 MPI 程序
用户通过编写 SLURM 脚本来和调度系统进行交互。脚本中需要指明所需要的资源和 运行的命令。一个简单的 SLURM 脚本例子为:
#!/bin/bash
#SBATCH -J MPI_test
#SBATCH -p compute
#SBATCH -t 5:00
#SBATCH -N 2
#SBATCH --ntasks-per-node=1
#SBATCH -c 2
#SBATCH -o MPI_test.log
module add mpi/mpich/3.2.1
export OMP_NUM_THREADS=2
mpiexec -n 2 ./test
mpiexec -n 2 ./send
其中各个参数含义为:
-J
任务名。-p
提交的分区。在这里教学一号没有指定默认分区所以必须填写。-t
运行最大时间。超过这个时间程序将被强行终止。-N
申请节点个数。--ntasks-per-node
每个节点运行的进程个数。-c
每个进程占用的 CPU 核心数,同功能选项为--cpus-per-task
。-o
标准输出和标准错误的重定向。由于任务交给计算节点完成,屏幕上的输出是 看不见的,因此可以用这个选项来保存输出。注意:不能保存非屏幕上的输出,例如 程序运行过程中的变量。这些输出需要手动存储。
注意:-N
,--ntasks-per-node
, -c
这三个选项可以计算出当前任务占用的总 核心数。这里为 2x1x2=4 cores。
用户使用 src/cluster/
下的源码可完成测试。通过
module add mpi/mpich/3.2.1
可以添加 mpich 环境。默认情况下这个环境没有被载入,无法直接使用 mpicc 等命令。
添加完毕后直接用 make
可以编译测试程序。在运行的时候载入的 MPI 模块需要和 编译时保持一致。编译时用的 mpich,运行时就不要载入 openmpi。
提交任务
使用 sbatch run.slurm
可将任务提交到 SLURM 调度系统。提交成功后会出现 Submitted Job xxx
的字样。如果提交失败需要检查 run.slurm
是否有错误。
常用命令
sinfo
查看目前所有节点分区情况。其中 STATE 标为alloc
表示已经没有剩余 资源;标为idle
的表示空闲;标为mix
的表示有人在占用但是有剩余资源; 标为down
表示节点无响应(可能是故障)。sbatch
提交任务。后面跟着 SLURM 脚本作为参数。如果没有参数则直接从标准 输入读参数。squeue
检查队列情况。只能列出正在排队或正在运行的程序。可以看到作业的拥有者, 运行状态,运行时间,占用节点数。处于运行状态的程序可查看所在计算节点,处于排队 的程序可查看没被运行的原因。scancel
取消作业。用法scancel JOBID
或scancel -u USERNAME
,可取消 某特定 ID 的作业或某个用户的全部作业。当然,非管理员不能取消别人的作业。
软件环境
使用 Environment Modules
多用户系统必然遇到的问题:用户A希望用 python=python2.7,cuda/8.0, 用户B希望用 python=python3,cuda/9.0,但这两者显然是冲突的,怎么解决?
为了满足同学们计算任务的需求,服务器中安装了各种版本的软件。 大家可在同一软件的不同版本之间切换,也可以在同一功能的不同软件之间切换, 以此来选择最合适的编程环境和运行环境。使用系统命令 module 可以快速地达到这一效果。
Environment Modules 这一工具的本质实际上是帮助你设置好某个软件运行所需要的 环境变量,它会智能地对 PATH
LD_LIBRARY_PATH
等变量做出变更。
基本用法
在你使用某个软件之前,你必须通过 module 命令来配置此软件的运行环境,否则将无法使用此软件或者使用一个错误的版本。
例如,在没有载入任何 module 的情况下,输入 python 来尝试打开 python
user@login01 ~$ which python # which <COMMAND>: 查看 <COMMAND> 的完整路径
/usr/bin/python
user@login01 ~$ python
Python 2.7.5 (default, Aug 4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
注意到此时 python 命令代表系统内置的 python,而系统内置的 python 并未安装大部分科学计算库。
此时我们用 module 命令载入 anaconda
user@login01 ~$ module add anaconda/3.5.1
[user@login01 ~]$ which python
/nfs-share/software/tools/anaconda/3.5.1/bin/python
[user@login01 ~]$ python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 18:10:19)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
此时使用的是集群各节点共享的 anaconda/3.5.1 中的 python,module 添加成功。
user@login01 ~$ module list # 查看当前所载入的所有 module
user@login01 ~$ module avail # 查看所有可用 module
user@login01 ~$ module rm <module name> # 卸载某个已载入的 module
user@login01 ~$ module purge # 卸载全部已加载 module
结合 SLURM 脚本
module 命令仅作用在当前节点上,如果使用 SLURM 脚本提交任务,应当在脚本中添加 程序所需要的 module,确保程序可以正常运行。
#!/bin/bash
#SBATCH -J test
#SBATCH -p compute
#SBATCH -t 5:00
module add anaconda/3.5.1
module add matlab/2018a
module add mpi/mpich/3.2.1
# do your computation jobs...
一个 SLURM 的特性是它会保留提交任务时添加的 module,即执行 sbatch 提交脚本 时它会自动复制当前环境中的 module。
[user@login01 ~]$ module add anaconda/3.5.1 matlab/2018a mpi/mpich/3.2.1
[user@login01 ~]$ sbatch
#!/bin/bash
#SBATCH -o out
#SBATCH -p compute
#SBATCH -N 1
module list^D
Submitted batch job 15109
[user@login01 ~]$ cat out
Currently Loaded Modulefiles:
1) anaconda/3.5.1 2) mpi/mpich/3.2.1 3) matlab/2018a
定制默认 module
当你登录系统时,系统默认不载入任何 module。当 需要载入更多的 module 时,那么请直接在个人 HOME 目录下的 .bash_profile
或 .bashrc
文件的最后添加
module add <module name>
即可。每个 module 的添加单独占一行。这样每次你登录系统之后系统就会自动加载你指定的 module。
更改 .bash_profile
文件的同时,在你运行 SLURM 任务时也会自动载入这些 module, 因此无需在 SLURM 脚本中再次添加 module 命令!
自行安装软件
示例软件:htop,下载地址
在集群上是可以自行安装多数软件的,只要这类软件本质上不需要动用管理员权限就可以 自行安装。自行安装的软件一般情况下无法被别的用户使用。注意,由于硬件驱动也算 是一种特殊的软件,这种软件需要和硬件直接交互,修改系统启动时载入的模块,因此 用户不能在系统上安装驱动。
包管理器的维护目录一般是 /usr
,这是系统全局的静态目录,用户不具有写入权限, 因此无法使用包管理器进行安装。多数包管理器不支持更改安装位置(如 yum
)。
上传
将下载的软件包上传到集群上。
scp htop-2.2.0.tar.gz pkuteach:
之后登录集群,创建新的目录 src
并解压缩。
mkdir src
cd src
tar -xzf ../htop-2.2.0.tar.gz
编译
进入源码目录进行编译
cd htop-2.2.0
./configure --prefix=$HOME
make
make install
这里使用 --prefix
参数来重写安装位置,因为普通用户对默认安装位置没有写权限, 所以在这里把安装位置改成了 $HOME
,即家目录。
测试
安装完成后,用命令 htop
即可打开软件。这是因为在 RedHat 系统中,$HOME/bin
在默认情况下正好处于 PATH
变量中。因此无需动用任何其他配置。在其他的发行版, 需要把 $HOME/bin
添加到 PATH
环境变量中。