DerrickRose 2018-03-26
使用低成本的硬件和开源软件设计一个高性能计算集群。
在我的 之前发表在 Opensource.com 上的文章中,我介绍了 OpenHPC 项目,它的目标是致力于加速高性能计算(HPC)的创新。这篇文章将更深入来介绍使用 OpenHPC 的特性来构建一个小型的 HPC 系统。将它称为 HPC 系统 可能有点“扯虎皮拉大旗”的意思,因此,更确切的说法应该是,它是一个基于 OpenHPC 项目发布的 集群构建方法 的系统。
这个集群由两台树莓派 3 系统作为计算节点,以及一台虚拟机作为主节点,结构示意如下:
Map of HPC cluster
我的主节点运行的是 x86_64 架构的 CentOS 操作系统,而计算节点运行了 aarch64 的轻度修改版的 CentOS 操作系统。
下图是真实的设备工作照:
HPC hardware setup
要把我的系统配置成像上图这样的 HPC 系统,我是按照 OpenHPC 的集群构建方法的 CentOS 7.4/aarch64 + Warewulf + Slurm 安装指南 (PDF)的一些步骤来做的。这个方法包括了使用 Warewulf 的配置说明;因为我的那三个系统是手动安装的,我跳过了 Warewulf 部分以及创建 Ansible 剧本 的一些步骤。
在 Ansible 剧本中设置完成我的集群之后,我就可以向资源管理器提交作业了。在我的这个案例中, Slurm 充当了资源管理器,它是集群中的一个实例,由它来决定我的作业什么时候在哪里运行。在集群上启动一个简单的作业的方式之一:
[ohpc@centos01 ~]$ srun hostname calvin
如果需要更多的资源,我可以去告诉 Slurm,我希望在 8 个 CPU 上去运行我的命令:
[ohpc@centos01 ~]$ srun -n 8 hostname hobbes hobbes hobbes hobbes calvin calvin calvin calvin
在第一个示例中,Slurm 在一个单个的 CPU 上运行了指定的命令(hostname
),而在第二个示例中,Slurm 在 8 个 CPU 上运行了那个命令。我的计算节点一个命名为 calvin
,而另一个命名为 hobbes
;在上面的命令输出部分可以看到它们的名字。每个计算节点都是由 4 个 CPU 核心的树莓派 3 构成的。
在我的集群中提交作业的另一种方法是使用命令 sbatch
,它可以用于运行脚本,将输出写入到一个文件,而不是我的终端上。
[ohpc@centos01 ~]$ cat script1.sh #!/bin/sh date hostname sleep 10 date [ohpc@centos01 ~]$ sbatch script1.sh Submitted batch job 101
它将创建一个名为 slurm-101.out
的输出文件,这个输出文件包含下列的内容:
Mon 11 Dec 16:42:31 UTC 2017 calvin Mon 11 Dec 16:42:41 UTC 2017
为示范资源管理器的基本功能,简单的串行命令行工具就行,但是,做各种工作去配置一个类似 HPC 系统就有点无聊了。
一个更有趣的应用是在这个集群的所有可用 CPU 上运行一个 Open MPI 的并行作业。我使用了一个基于 康威生命游戏 的应用,它被用于一个名为“使用 Red Hat 企业版 Linux 跨多种架构运行康威生命游戏”的 视频。除了以前基于 MPI 的 Game of Life
版本之外,在我的集群中现在运行的这个版本对每个涉及的主机的单元格颜色都是不同的。下面的脚本以图形输出的方式来交互式启动应用:
$ cat life.mpi #!/bin/bash module load gnu6 openmpi3 if [[ "$SLURM_PROCID" != "0" ]]; then exit fi mpirun ./mpi_life -a -p -b
我使用下面的命令来启动作业,它告诉 Slurm,为这个作业分配 8 个 CPU:
$ srun -n 8 --x11 life.mpi
为了演示,这个作业有一个图形界面,它展示了当前计算的结果:
红色单元格是由其中一个计算节点来计算的,而绿色单元格是由另外一个计算节点来计算的。我也可以让康威生命游戏程序为使用的每个 CPU 核心(这里的每个计算节点有四个核心)去生成不同的颜色,这样它的输出如下: