在 AWS 云上快速搭建高性能计算 (HPC) 集群

阅读数:34 2019 年 11 月 12 日 08:00

在AWS云上快速搭建高性能计算(HPC)集群

1. 高性能计算的应用场景

科学家、工程师及科研者等经常需要使用大规模高性能计算集群(HPC)来解决计算密集或存储密集型计算的问题,常见的使用高性能计算的场景包括基因处理、金融建模与仿真、计算化学、物理建模与仿真、政府及科研项目等。在这些 HPC 应用中,通常需要使用 HPC 集群来帮助我们快速完成计算,从而减少研发成本和时间。比如基因公司为了完成遗传病组学研究,通常一次需要研究上万份基因的样本,分析上百 T 的数据,如果用自己机房的服务器来完成计算分析,需要数年的时间,如果使用 HPC 集群,提交基因分析任务,我们能使用集群的分布式资源管理器来调度并最大化的利用机器资源,在数天内完成分析任务,大大的节省计算的时间。常见的高性能计算的场景还包括:视频转码与编码、流体力学、天气预测、材料仿真、汽车碰撞仿真、风险建模、分子建模、上下文搜索、物流建模、地震勘探数据处理、基因数据计算、天体物理、深度学习、动画建模、微电子验证、图像处理、地理信息系统等。

2. 什么是高性能计算

通常所说的高性能计算使用的硬件一般分为两种情况:

  • 高性能计算机

高性能计算机通常指使用了很多处理器(作为单个机器一部分)的机器。

比如说国内的高性能计算机“天河”、“曙光”、“神威 - 太湖之光”等,如“神威 - 太湖之光”由 40 个运算机柜和 8 个网络机柜组成,一台机柜装有 1024 块处理器,计算速度 12 亿亿次浮点运算次数。

  • 高性能计算机集群

使用某一集群中的多台计算机(作为单个计算资源操作)的计算系统和环境。

这是通过将多台计算机,通过软件的方式组成集群,由集群的分布式资源管理器来负责集群中服务器资源的监控、调度等,我们可以将集群看做单个计算资源,然后将任务提交到集群,分布式资源管理器负责将任务调度到具体服务器执行。

比如在 2013 年的超级计算机 500 强的竞赛中,AWS 使用多个 C3 实例组建了高性能计算机集群,使用了 26496 个核,计算峰值速度达 593.5 万亿次浮点运算次数,当年排名世界第 64 位。

当我们需要高性能计算的时候,通常由于机房的资源比较固定,很难有很多服务器给我们来组建集群,而借用高性能计算机如“曙光“,”神威“的成本非常高,也不太现实。这时在云上搭建高性能计算集群就非常方便,因为云上有无限量的计算及存储的资源,资源更弹性,计算过程中可以根据业务压力,调整集群服务器数量;在完成计算后,我们可以释放所有计算资源,大大降低了计算成本。

3. 如何使用 AWS 云搭建 HPC 集群

通过 AWS,您能在数分钟内完成高性能计算集群的创建,并将并行 HPC 任务的数量增加到大多数本地 HPC 环境都无法支持的规模,从而提高研究速度并缩短获得成效的时间。AWS 可按需提供针对特定应用程序进行优化的 CPU、GPU 和 FPGA 服务器,有众多的服务器类型选择,无需巨额资金投入,从而帮助降低成本。您有权限访问面向紧密耦合、IO 密集型和存储密集型工作负载的完全等分的高带宽网络,这使您能够在数千个核心之间横向扩展,从而更快获得成效。

4. 集群管理软件 CFNCluster

您的 HPC 集群可能拥有成百上千台机器,手工搭建 HPC 集群意味着你需要创建所有服务器,配置所有软件,这个过程太复杂。为了简化这个操作,AWS 提供了 CFNCluster 集群管理软件,它是由 AWS 开发和维护的高性能计算集群的框架,能帮助你在数分钟内完成集群的创建和生产部署,CFNCluster 创建的集群支持 SGE,OpenLava,Torque 等高性能计算框架。下图是 CFNCluster 和 HPC 集群的关系图:

在AWS云上快速搭建高性能计算(HPC)集群

通过上图可知,通常我们需要在一台服务器上安装 CFNCluster 软件,然后通过 CFNCluster 创建和管理多个 HPC 的集群,HPC 集群中的服务器安装了 SGE, OpenLava 等分布式资源管理器,你可以根据需要配置分布式资源管理器的类型 ,你也可以使用 Cloudwatch 监控服务,根据业务压力动态调整 (AutoScaling)HPC 集群计算节点的数量。当 HPC 集群创建完成后,你可以像以往使用 HPC 集群一样通过 Master 节点访问你的 HPC 集群。下面示例详细介绍了安装 CFNCluster 和创建 HPC 集群的详细过程:

(1) 在 AWS 云中创建一台 EC2 服务器(使用 Amazon Linux 的 AMI),并运行 sudo pip install cfncluster 安装 CFNCluster,示例如下:

Java

复制代码
sudo pip install cfncluster
You are using pip version 6.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting cfncluster
Downloading cfncluster-1.3.2.tar.gz
Requirement already satisfied (use --upgrade to upgrade): boto>=2.42.0 in /usr/lib/python2.7/dist-packages (from cfncluster)
Requirement already satisfied (use --upgrade to upgrade): awscli>=1.10.56 in /usr/lib/python2.7/dist-packages (from cfncluster)
Collecting future>=0.16.0 (from cfncluster)
Downloading future-0.16.0.tar.gz (824kB)
100% |████████████████████████████████| 827kB 565kB/s
Collecting configparser>=3.5.0 (from cfncluster)
Downloading configparser-3.5.0.tar.gz
Requirement already satisfied (use --upgrade to upgrade): botocore==1.4.46 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): colorama<=0.3.7,>=0.2.5 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): docutils>=0.10 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): rsa<=3.5.0,>=3.1.2 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Collecting s3transfer<0.2.0,>=0.1.0 (from awscli>=1.10.56->cfncluster)
Downloading s3transfer-0.1.10-py2.py3-none-any.whl (54kB)
100% |████████████████████████████████| 57kB 6.3MB/s
Requirement already satisfied (use --upgrade to upgrade): jmespath<1.0.0,>=0.7.1 in /usr/lib/python2.7/dist-packages (from botocore==1.4.46->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): python-dateutil<3.0.0,>=2.1 in /usr/lib/python2.7/dist-packages (from botocore==1.4.46->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): pyasn1>=0.1.3 in /usr/lib/python2.7/dist-packages (from rsa<=3.5.0,>=3.1.2->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): futures<4.0.0,>=2.2.0 in /usr/lib/python2.7/dist-packages (from s3transfer<0.2.0,>=0.1.0->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): six in /usr/lib/python2.7/dist-packages (from python-dateutil<3.0.0,>=2.1->botocore==1.4.46->awscli>=1.10.56->cfncluster)
Installing collected packages: future, configparser, cfncluster, s3transfer
Running setup.py install for future
Running setup.py install for configparser
Running setup.py install for cfncluster
Successfully installed cfncluster-1.3.2 configparser-3.5.0 future-0.16.0 s3transfer-0.1.10
sudo pip install cfncluster
You are using pip version 6.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting cfncluster
Downloading cfncluster-1.3.2.tar.gz
Requirement already satisfied (use --upgrade to upgrade): boto>=2.42.0 in /usr/lib/python2.7/dist-packages (from cfncluster)
Requirement already satisfied (use --upgrade to upgrade): awscli>=1.10.56 in /usr/lib/python2.7/dist-packages (from cfncluster)
Collecting future>=0.16.0 (from cfncluster)
Downloading future-0.16.0.tar.gz (824kB)
100% |████████████████████████████████| 827kB 565kB/s
Collecting configparser>=3.5.0 (from cfncluster)
Downloading configparser-3.5.0.tar.gz
Requirement already satisfied (use --upgrade to upgrade): botocore==1.4.46 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): colorama<=0.3.7,>=0.2.5 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): docutils>=0.10 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): rsa<=3.5.0,>=3.1.2 in /usr/lib/python2.7/dist-packages (from awscli>=1.10.56->cfncluster)
Collecting s3transfer<0.2.0,>=0.1.0 (from awscli>=1.10.56->cfncluster)
Downloading s3transfer-0.1.10-py2.py3-none-any.whl (54kB)
100% |████████████████████████████████| 57kB 6.3MB/s
Requirement already satisfied (use --upgrade to upgrade): jmespath<1.0.0,>=0.7.1 in /usr/lib/python2.7/dist-packages (from botocore==1.4.46->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): python-dateutil<3.0.0,>=2.1 in /usr/lib/python2.7/dist-packages (from botocore==1.4.46->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): pyasn1>=0.1.3 in /usr/lib/python2.7/dist-packages (from rsa<=3.5.0,>=3.1.2->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): futures<4.0.0,>=2.2.0 in /usr/lib/python2.7/dist-packages (from s3transfer<0.2.0,>=0.1.0->awscli>=1.10.56->cfncluster)
Requirement already satisfied (use --upgrade to upgrade): six in /usr/lib/python2.7/dist-packages (from python-dateutil<3.0.0,>=2.1->botocore==1.4.46->awscli>=1.10.56->cfncluster)
Installing collected packages: future, configparser, cfncluster, s3transfer
Running setup.py install for future
Running setup.py install for configparser
Running setup.py install for cfncluster
Successfully installed cfncluster-1.3.2 configparser-3.5.0 future-0.16.0 s3transfer-0.1.10

从输出中我们看到,CFNCluster 软件已经成功的安装。

(2) 配置集群

通过上面的 CFNCluster 软件,我们已经可以创建集群了,但创建集群前,需要使用 cfncluster configure 对集群进行简单的配置,配置信息包括集群创建的区域、创建的权限、网络等。更多的配置可以通过配置参数文件完成,示例如下:

Java

复制代码
cfncluster configure
Cluster Template [default]:
AWS Access Key ID []: AKXXXXXXXXXXXXXXXXXX
AWS Secret Access Key ID []: hmxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Acceptable Values for AWS Region ID:
us-east-1
us-west-1
cn-north-1
ap-northeast-1
ap-southeast-2
sa-east-1
ap-southeast-1
ap-northeast-2
us-west-2
us-gov-west-1
ap-south-1
eu-central-1
eu-west-1
AWS Region ID []: us-west-2
VPC Name [public]: vpc-dee1xxxx
Acceptable Values for Key Name:
Demoxxxx
Key Name []: Demoxxxx
Acceptable Values for VPC ID:
vpc-c0f00000
vpc-2d600000
vpc-66f00000
vpc-dee1xxxx
vpc-06400000
VPC ID []: vpc-dee1xxxx
Acceptable Values for Master Subnet ID:
subnet-b9e00000
subnet-22800000
subnet-4e900000
subnet-e55xxxxx
subnet-47800000
Master Subnet ID []: subnet-e55xxxxx

上述配置中:

AWS Access Key ID

创建集群的 AWS 用户对应的 Access Key,在 IAM 中创建。

AWS Secret Access Key ID

Access Key 对应的 Secret Access Key。

AWS Region ID

集群所在的区域。

VPC ID

集群被创建的网络。

Master Subnet ID

集群被创建的子网。

当我们进行简单的配置后,我们就可以创建测试的 HPC 集群了,示例如下:

Java

复制代码
cfncluster create testcluster
Starting: testcluster
Status: cfncluster-testcluster - CREATE_IN_PROGRESS
Status: cfncluster-testcluster - CREATE_IN_PROGRESS
Status: MasterEIP - CREATE_IN_PROGRESS
Status: SNS - CREATE_IN_PROGRESS
Status: RootRole - CREATE_COMPLETE
Status: MasterEIP - CREATE_COMPLETE
Status: SQSPolicy - CREATE_COMPLETE
Status: AssociateEIP - CREATE_IN_PROGRESS
Status: CfnClusterPolicies - CREATE_COMPLETE
Status: AssociateEIP - CREATE_COMPLETE
Status: RootInstanceProfile - CREATE_COMPLETE
Status: MasterServer - CREATE_IN_PROGRESS
Status: ComputeFleet - CREATE_IN_PROGRESS
Status: ComputeFleet - CREATE_COMPLETE
Status: cfncluster-testcluster - CREATE_COMPLETE
Output:"MasterPublicIP"="34.xxx.xx.xx"
Output:"MasterPrivateIP"="172.16.4.33"
Output:"GangliaPublicURL"="http://34.xxx.xx.xx/ganglia/"
Output:"GangliaPrivateURL"="http://172.16.4.33/ganglia/"

从上面的输出可以看到,当 create 集群的时候,会帮我们创建 master 和多个 computer 的节点。你可以根据上图中的 MasterPublicIP 的地址 ssh 登录到 HPC 的主节点,也可以使用 GangliaPublicURL 来监控集群资源。除了上述的 CFNCluster 的 create 和 configure 命令,还有 delete,update,stop,list 等命令来查看集群状态和管理集群。

5. CFNCluster 是如何创建集群的

上一节您通过 cfncluster configure 简单的配置,然后就能创建集群了,这时候你可能会有很多疑惑,比如:我如何定义我集群的节点类型、节点数等,这些都可以通过配置 CFNCluster 服务器 home 目录下面~/.cfncluster/config 来实现,在此配置文件中能够配置集群的参数,AWS 通过 CloudFormation 的模板和参数列表创建 HPC 集群。下面是部分的参数:

template_url
使用 cloudformation 创建 HPC 的模板文件,AWS 也提供了默认的模板文件。

compute_instance_type
集群计算节点的类型。

master_instance_type
集群主节点的类型。

initial_queue_size
创建集群的初始节点数

max_queue_size
集群的最大节点数

scheduler
分布式资源管理器的类型

base_os
操作系统类型等,全部的配置参数,可以参考下面链接:

http://cfncluster.readthedocs.io/en/latest/configuration.html

6. 提交 Job 到 HPC 集群

完成集群创建后,您就可以登录集群,然后运行 qsub 命令提交你的任务了。下面是通过主节点登陆 HPC 集群示例:

Java

复制代码
ssh -i Demoxxx.pem ec2-user@34.xxx.xx.xx
The authenticity of host '34.xxx.xx.xx (34.xxx.xx.xx)' can't be established.
ECDSA key fingerprint is 6c:a0:21:10:13:b4:07:4b:bc:b9:83:dc:bd:87:00:00.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '34.xxx.xx.xx' (ECDSA) to the list of known hosts.
Last login: Wed Aug 2 06:47:26 2017
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/
12 package(s) needed for security, out of 19 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-16-4-33 ~]$

分布式资源管理器安装在 /opt 目录下,查看分布式资源管理器示例如下:

Java

复制代码
cd /opt
[ec2-user@ip-172-16-4-33 opt]$ ls -l
total 24
drwxr-xr-x 5 root root 4096 Apr 17 07:58 aws
drwxr-xr-x 5 root root 4096 Aug 2 06:46 cfncluster
drwxr-xr-x 6 root root 4096 Jun 12 05:15 chef
drwxr-xr-x 16 sgeadmin root 4096 Aug 2 06:47 sge
drwxr-xr-x 7 root root 4096 Jun 12 05:29 slurm
drwxr-xr-x 8 root root 4096 Jun 12 05:27 torque

查看集群状态和集群的主机示例如下:

Java

复制代码
[ec2-user@ip-172-16-4-33 opt]$ qstat
[ec2-user@ip-172-16-4-33 opt]$ qhost
HOSTNAME ARCH NCPU NSOC NCOR NTHR LOAD MEMTOT MEMUSE SWAPTO SWAPUS
----------------------------------------------------------------------------------------------
global - - - - - - - - - -
ip-172-16-4-123 lx-amd64 1 1 1 1 0.00 993.4M 144.4M 0.0 0.0
ip-172-16-4-128 lx-amd64 1 1 1 1 0.00 993.4M 181.6M 0.0 0.0

7. 总结

至此你的测试的高性能计算的集群就已经创建好了,对于创建生产环境的高性能计算的集群,你需要根据业务类型,在参数文件中配置合适的服务器类型、合适大小的集群、分布式资源管理器来创建集群。AWS 的 CFNCluster 能帮你快速创建集群,让你把工作集中在业务处理而不是集群的创建和管理。本文中的集群创建只适用于 AWS Global 区域,不适用于中国区,对于中国区的创建方法,请参考博客“在 AWS 中国区快速搭建高性能计算 (HPC) 集群”。

作者介绍:

在AWS云上快速搭建高性能计算(HPC)集群

蓝勇,AWS 解决方案架构师,负责基于 AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内的应用和推广,在 DR 解决方案、数据仓库、RDS 服务、企业应用、自动化运维等方面有着广泛的设计和实践经验。在加入 AWS 之前,在甲骨文中国担任资深售前工程师,负责售前方案咨询和架构设计,在数据库,中间件,大数据及企业应用方面有丰富经验。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/quickly-build-high-performance-computing-hpc-clusters-on-the-aws-cloud/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布