亚马逊AWS官方博客

在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集群的关系图:

通过上图可知,通常我们需要在一台服务器上安装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,示例如下:

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对集群进行简单的配置,配置信息包括集群创建的区域、创建的权限、网络等。更多的配置可以通过配置参数文件完成,示例如下:

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集群了,示例如下:

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集群示例:

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目录下,查看分布式资源管理器示例如下:

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

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

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