超级计算机使用体验和教学

B站视频

超级计算机是什么样子的?超级计算机可以用来玩游戏吗?超级计算机到底怎么用?

本视频包含:超级计算机的简单介绍、使用体验,以及超级计算机的基础使用方法。

感谢 @失败中的victor 在周末排除万难,从四处建楼的大学城中找到一片安静的小树林帮忙录音~

视频文字稿

很多人都听说过超级计算机,简称超算,它们是计算机性能的绝对顶峰,拥有不计其数的内存和CPU,因此速度非常快。最近新一期的top500榜单出炉,日本的富岳(Fugaku)超级计算机获得第一,我国的神威·太湖之光排在第四,天河二号排在第六。

看着榜单上超算无敌的计算能力,哪个爱搞机的男孩不想拥有一台超级计算机并且用来玩一局游戏呢?(看到你们谈配置我就感觉好笑.jpg)

最近因为毕业设计的需要,申请到了超算的试用账号,借这个机会带大家看看超算的样子,以及怎样去使用它。想象一下,打开超算,然后打开任务管理器,看到CPU那满屏幕数不尽的框框,比硬盘容量还要大的内存,在上面随心所欲地畅玩游戏,满满的逼格有没有!

不过很可惜,大多数超算都使用Linux系统,因此并不能像Windows直观地看到一堆框框,但CPU挤满屏幕的情形仍然可以看到,至于畅玩游戏,我们留个悬念最后再揭晓。

超算并非一台计算机,而是一个计算机集群。实体的超算,其实就是一排排装着很多服务器的机柜,由服务器组成节点,节点再汇集成为一个集群。各种任务被创建后提交到队列,由调度系统选择合适的计算节点来执行,对于超算的介绍网上有很多,这里就省略了。

要使用超算,首先要远程连接到登录节点,不同的超算的登录方式可能不一样,有的使用VPN连接,我的超算账号是从并行申请的,提供了一个网页桌面来登录。

首先,输入账号密码点击登录,进入了一个云桌面。点击SSH,连接,这里的超算账号是北京超级云计算中心A区的,然后就登录进去了。这是一个登录节点,用来给用户编译软件和发布任务,而不是用来直接执行任务。

先来看看这个登录节点的配置信息。系统是centos,看看版本号,centos 7.6.1810。看看内存,64G。看看cpu,intel的e5-2678v3。共有两个CPU,每个CPU有12个物理核心,没有开启超线程,因此逻辑核心和物理核心数量相同,加起来一共24个。

用top命令看看,top类似于windows的任务管理器,可以看到确实有24个cpu在这里,内存64G。因为做了安全设置,只能看到自己的进程,可以看到我们只有一个bash,一个top。

然后看看这台机的存储。923T,用的是lustre文件系统。我们再看看磁盘,只有一块四百多G的,猜测应该是480G的固态硬盘。

然后看看网卡,两个InfiniBand口,只用了一个,就这个ib0。我们一个个看,这个em1是千兆口,em2也是千兆,ib0是56G的。

硬件配置就看到这里。下面是这台超算的使用方法

这台超算用的是slurm任务调度系统,这个调度系统也用在天河二号上。我们可以用sinfo命令来看有哪些任务队列。

第一列 PARTITION 是队列名。

第二列 AVAIL 是队列可用情况,inact表示不可用,up表示可用 【加字幕】

第三列 TIMELIMIT 是作业运行时间限制,默认是 infinite 没有限制。

第四列 NODES 是节点数。

第五列 STATE 是节点状态,idle 是空闲节点,alloc 是已被占用节点,comp 是正在释放资源的节点,其他状态的节点都不可用。 【加字幕】

第六列 NODELIST 是节点列表。

我的账号允许使用的是标了星号的这几个amd_256队列。我们可以用 sinfo -p 队列名 来看指定队列的情况。

如果想知道我的账号目前跑了什么作业,可以用squeue命令查看。现在没有跑作业。然后我们用salloc命令来申请节点资源。现在再执行squeue,可以看到有一个作业了。这是分配到的节点。这是作业id,作业所在的队列,作业名,用户名,作业状态,运行时间,使用的节点数。

分配到节点后,我们就可以直接通过ssh连上对应的节点。看看这台机,启动了16天多,当前登录用户,只有我一个。系统是centos,7.6。内存是256G,CPU是EYPC 7452,有两块,共64核。

看看top命令,看看cpu数量。这个屏幕已经显示不下了。

然后我们看看存储,挂了一个14T的和一个923T的lustre文件系统。看看磁盘,啥都没有,猜测是通过网络启动的。看看网络,有这么几块网卡。只有两块接了线。看看ens8f0,是千兆的,再看看ib0,56G的。

列出当前目录看看,有这些文件,都是我之前放上去的。这些都是共享的,每个节点同一个账号登上去看到的都一样。

然后退出这个节点。看看当前作业,就是刚刚申请的那个。我们可以用scancel来取消这个作业。

怎么在超算上运行程序呢?举个例子,比如我有一个程序叫hostname,它的作用是输出当前机器的主机名。我可以用srun -N 节点数 -n 进程数 -p 队列名 然后加要执行的程序。像这条命令就是在两个节点上各运行一个hostname程序。可以看到返回了两行输出,就是运行程序的计算节点名字。接下来我把进程数改成4,也就是每个节点跑两个程序,再运行一次看看。可以看到这次有四行输出,每个计算节点都输出了两次名字。

实际上超算跑的程序是需要特别编写的,普通的程序这样子跑也只是相当于同时运行一次而已。要想真正发挥超算的性能,需要用到mpi(信息传递接口),专门用来编写并行程序的。下面以一个python脚本为例子为大家演示一下。

首先用module avail查看有哪些模块。然后我们加载python3.7.6这个模块。module list可以看我们当前加载了哪些模块。现在我们只加载了python3.7.6这个模块。

然后我们看看这个python的helloworld脚本。很简单,只有4行,首先导入mpi4py库,然后用Get_rank函数得到当前的进程编号,并且打印出来。我们用srun运行一下看看,使用两个节点,每个节点跑两个进程。可以看到四个进程分别输出了0到3四行文字。然后我们试试用满所有核心,一个节点是64核,两个节点就是128核。最后就输出了128行文字,进程号从0到127。

最后解答开头的悬念。单个超算节点的结构和普通计算机其实是一样的,只是性能更好,所以理论上超算是可以玩游戏的。如果想要同时使用多个超算节点的计算能力来玩一个游戏,也是可以实现的,但是需要游戏使用MPI进行单独开发,以便游戏可以在多个节点上运行。当然,目前也没有游戏厂商会愿意做这种事情,毕竟开发出来的游戏也没几个人玩得起,怎么赚钱呢?