亚马逊AWS官方博客

利用 Slurm + ParallelCluster 多集群解决方案,助力云端高性能计算

背景

在云上进行高性能计算的客户越来越多,利用云计算资源充足、按需使用、弹性伸缩的特点,客户不仅能快速的得到结果,而且成本很低。为了让客户能快速的部署高性能计算集群,AWS 推出了开源的ParallelCluster 集群管理软件,该软件可以让客户在数分钟之内部署一个高性能计算集群。ParallelCluster支持Torque、Slurm、SGE等调度引擎,集群的大小可以根据任务数量动态伸缩,而且支持SPOT实例,能最大程度的帮助客户降低成本。

在某些高性能计算场景中,客户会同时使用到CPU实例和GPU实例,这样就需要创建两个ParallelCluster集群,比如,一个是c5.xlarge集群和一个p3.2xlarge实例集群。并且客户的程序通常运行在一个主节点上,这就要求可以在一个主节点上提交任务到任意集群。而ParallelCluster 则要求到两个集群的主节点上分别提交任务,这种情况下,如果客户要使用ParallelCluster ,必须需要修改程序,不仅耗时耗力,而且需要改变用户原来的使用习惯,很难快速使用起来。

Slurm +ParallelCluster 多集群解决方案,在两个ParallelCluster集群前面增加一个管理节点,通过该管理节点可以提交任务到任意集群,这样,客户的程序可以运行在管理节点上,不需要做任何改变。

这种方案不仅满足了客户多种实例类型的要求,而且保留了ParallelCluster弹性伸缩优点,可以支持SPOT实例,多个集群可以通过EFS共享数据。目前已经有客户通过该方案在AWS上进行高性能计算。

 

Slurm +ParallelCluster 多集群解决方案

Slurm +ParallelCluster多集群架构如下:

 

该方案把两个ParallelCluster集群的Slurm accounting信息存储在一个独立的管理节点(SlurmDBD所在节点)上,并保存在MySQL数据库中,这样在管理节点可以提交任务到任意的集群上。

以下是Slurm +ParallelCluster多集群方案详细配置步骤,主要包含以下几个步骤:

  • 使用ParallelCluster创建两个slurm集群,两个集群通过EFS共享数据
  • 创建并配置Slurm管理节点
  • 注册第一个ParallelCluster集群到管理节点
  • 注册第二个ParallelCluster集群到管理节点
  • 检查配置并提交测试任务

 

创建两个ParallelCluster集群

ParallelCluster的安装步骤在这里不再赘述,在参考资料中有ParallelCluster的配置链接。

使用ParallelCluster创建两个集群,集群名称分别为 parallelcluster和pcluster2,每个节点初始配置为一个master node和两个compute node。

1.创建第一个集群

配置文件中需要增加EFS的配置,完整的配置文件参考附录。

[efs customfs]

shared_dir = efs

encrypted = false

performance_mode = generalPurpose

 

创建第一个集群:

88e9fe506815:~ liangmao$ pcluster create parallelcluster

 

2.创建第二个集群

创建第二个集群时,需要在集群配置文件中指定第一个集群的efs_fs_id,efs_fs_id需要根据实际情况进行修改。

[efs customfs]

shared_dir = efs

encrypted = false

performance_mode = generalPurpose

efs_fs_id = fs-165884bd

 

创建第二个集群:

88e9fe506815:~ liangmao$ pcluster create pcluster2

 

创建Slurm 管理节点

Slurm管理节点需要部署在单独的服务器上,运行SlurmDBD进程,并且通过Munge进行身份认证,Slurm管理节点可以使用pcluster集群的master node创建AMI,再从AMI中创建,这样做有以下几个好处:

  • 不用安装Munge和Slurm,master node中已经包含。
  • 管理节点的Slurm和Munge用户的uid和gid和pcluster集群保持一致
  • 不用再额外配置Munge key,使用pcluster创建的key即可。

1.使用集群的master node创建AMI

可以在管理控制台上创建AMI:

 

2.使用AMI创建管理节点

在管理控制台上创建管理节点,使用上一步创建的AMI。

注意:要把管理节点加入两个slurm master的安全组。

 

另外,两个slurm master的安全组需要增加一条规则,允许安全组内的实例互相访问。

3.在管理节点上安装和配置MySQL

sudo yum install mysql

sudo yum install mysql-server

sudo yum install mysql-devel

 

service mysqld start

/usr/bin/mysqladmin -u root password <password>

 

chkconfig –add /etc/init.d/mysqld

chkconfig mysqld on

 

mysql -u root -p

 

create database slurm_acct_db;

create user ‘slurm’@’localhost’ identified by ‘<password>’;

create user ‘slurm’@’%’ identified by ‘<password>’;

 

GRANT ALL PRIVILEGES ON slurm_acct_db.* TO ‘slurm’@’localhost’;

GRANT ALL PRIVILEGES ON slurm_acct_db.* TO ‘slurm’@’%’ ;

 

4.修改SlurmDBD配置文件/opt/slurm/etc/slurmdbd.conf

[ec2-user@ip-172-31-30-63 ~]$ more  /opt/slurm/etc/slurmdbd.conf

#

# slurmDBD info

#DbdAddr=192.168.80.13

DbdHost=localhost

#DbdBackupHost=node14

DbdPort=6819

SlurmUser=slurm

#MessageTimeout=60

#DebugLevel=6

#DefaultQOS=normal

LogFile=/var/log/SlurmdbdLogFile

PidFile=/var/run/slurmdbd.pid

PluginDir=/opt/slurm/lib/slurm

#PrivateData=accounts,users,usage,jobs

#TrackWCKey=yes

#

# Database info

StorageType=accounting_storage/mysql

StorageHost=localhost

StoragePort=3306

StoragePass=<password>

StorageUser=slurm

StorageLoc=slurm_acct_db

 

5.启动slurmdbd进程

#/opt/slurm/sbin/slurmdbd

 

可以查看日志文件/var/log/SlurmdbdLogFile是否有报错。

 

[2019-05-27T06:45:59.410] error: Processing last message from connection 10(172.31.23.185) uid(496)

[2019-05-27T06:45:59.494] error: Processing last message from connection 10(172.31.23.185) uid(496)

[2019-05-27T13:24:08.546] error: Problem getting jobs for cluster test

[2019-05-27T14:45:34.646] error: Problem getting jobs for cluster test

[2019-05-28T02:45:39.496] error: Database settings not recommended values: innodb_buffer_pool_size innodb_log_file_size innodb_lock_wait_timeout

[2019-05-28T02:45:39.537] error: chdir(/var/log): Permission denied

[2019-05-28T02:45:39.537] chdir to /var/tmp

[2019-05-28T02:45:39.538] slurmdbd version 18.08.6-2 started

 

注:日志建议修改innodb的参数innodb_buffer_pool_size innodb_log_file_size innodb_lock_wait_timeout,可以按实际要求修改。

 

6.修改/opt/slurm/etc/slurm.conf

测试中发现要在管理节点上执行slurm 相关命令,会检查slurm.conf文件中的配置。因管理节点没有集群,可以把ClusterName和ControlMachine改成任意一个名称和地址,以免和另外两个集群冲突,并注释最后两行配置。

 

ClusterName=dummy

ControlMachine=dummyip

#include slurm_parallelcluster_nodes.conf

#PartitionName=compute Nodes=ALL Default=YES MaxTime=INFINITE State=UP

 

注册第一个集群到管理节点

1.修改master node slurm.conf配置文件

修改/opt/slurm/etc/slurm.conf配置,主要是以下几个配置,其中ip-172-31-30-63为管理节点的主机名。

 

ClusterName=parallelcluster

ControlMachine=ip-172-31-20-39

# JobComp

JobCompType=jobcomp/mysql

JobCompHost=ip-172-31-30-63

JobCompPort=3306

JobCompPass=<password>

JobCompUser=slurm

JobCompLoc=slurm_acct_db

 

#

# ACCOUNTING

JobAcctGatherType=jobacct_gather/linux

#JobAcctGatherFrequency=30

#

AccountingStorageType=accounting_storage/slurmdbd

AccountingStorageHost=ip-172-31-30-63

 

2.重启slurmctld进程

[root@ip-172-31-20-39 ~]# /etc/init.d/slurm stop

stopping slurmctld:                                        [  OK  ]

slurmctld is stopped

slurmctld is stopped

[root@ip-172-31-20-39 ~]# /etc/init.d/slurm start

starting slurmctld:                                        [  OK  ]

 

3.查看/var/log/slurmctld.log日志是否有报错

 

4.注册集群到管理节点

#sacctmgr add cluster parallelcluster

 

5.查看是否注册成功

用sacctmgr list cluster 查看ControlHost,ControlPort的信息是否为空,如果为空,表示注册失败,可以尝试重启slurmctld。

 

注册成功的日志如下:

检查 /var/log/slurmctld.log:

 

[2019-05-27T14:35:17.062] cons_res: select_p_node_init

[2019-05-27T14:35:17.062] cons_res: preparing for 1 partitions

[2019-05-27T14:35:17.062] Running as primary controller

[2019-05-27T14:35:17.062] Registering slurmctld at port 6817 with slurmdbd.

[2019-05-27T14:35:17.326] No parameter for mcs plugin, default values set

[2019-05-27T14:35:17.326] mcs: MCSParameters = (null). ondemand set.

 

注册第二个集群到管理节点

1.修改master node slurm.conf配置文件

修改/opt/slurm/etc/slurm.conf配置,主要是以下几个配置,其中ip-172-31-30-63为管理节点的主机名。

 

ClusterName=pcluster2

ControlMachine=ip-172-31-23-185

# JobComp

JobCompType=jobcomp/mysql

JobCompHost=ip-172-31-30-63

JobCompPort=3306

JobCompPass=slurm

JobCompUser=slurm

JobCompLoc=slurm_acct_db

 

#

# ACCOUNTING

JobAcctGatherType=jobacct_gather/linux

#JobAcctGatherFrequency=30

#

AccountingStorageType=accounting_storage/slurmdbd

AccountingStorageHost=ip-172-31-30-63

 

2.重启slurmctld进程

[root@ip-172-31-20-39 ~]# /etc/init.d/slurm stop

stopping slurmctld:                                        [  OK  ]

slurmctld is stopped

slurmctld is stopped

[root@ip-172-31-20-39 ~]# /etc/init.d/slurm start

starting slurmctld:                                        [  OK  ]

 

3.查看/var/log/slurmctld.log日志是否有报错

 

4.注册集群到管理节点

#sacctmgr add cluster pcluster2

 

5.查看是否注册成功

用sacctmgr list cluster 查看ControlHost,ControlPort的信息是否为空,如果为空,表示注册失败,可以尝试重启slurm。

 

注册成功的日志如下:

检查 /var/log/slurmctld.log:

 

[2019-05-27T14:42:31.654] cons_res: select_p_reconfigure

[2019-05-27T14:42:31.654] cons_res: select_p_node_init

[2019-05-27T14:42:31.654] cons_res: preparing for 1 partitions

[2019-05-27T14:42:31.654] Running as primary controller

[2019-05-27T14:42:31.654] Registering slurmctld at port 6817 with slurmdbd.

[2019-05-27T14:42:31.912] No parameter for mcs plugin, default values set

[2019-05-27T14:42:31.912] mcs: MCSParameters = (null). ondemand set.

 

运行测试任务

登陆管理节点,执行以下脚本:

 

可以在管理节点上看到两个集群,并且可以把测试命令hostname发送到不同的集群。

 

附录

1.ParallelCluster 集群config文件

88e9fe506815:.parallelcluster liangmao$ cat config

[aws]

aws_region_name = us-west-2

 

[global]

cluster_template = gputest

update_check = true

sanity_check = true

 

[cluster default]

key_name = <keypair name>

vpc_settings = public

 

[cluster gputest]

key_name = oregon

vpc_settings = public

compute_instance_type = c5.large

master_instance_type = c5.large

initial_queue_size = 2

max_queue_size = 10

maintain_initial_size = yes

scheduler = slurm

cluster_type = ondemand

placement_group = DYNAMIC

placement = cluster

shared_dir = public

master_root_volume_size = 20

compute_root_volume_size = 20

base_os = alinux

scaling_settings = custom

efs_settings = customfs

 

[efs customfs]

shared_dir = efs

encrypted = false

performance_mode = generalPurpose

 

[scaling custom]

scaledown_idletime = 60

 

[vpc public]

vpc_id = vpc-f33e268a

master_subnet_id = subnet-82e999fb

[aliases]

ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}

 

参考资料

ParallelCluster官方文档:

https://aws-parallelcluster.readthedocs.io/en/latest/

Slurm官方文档:

https://slurm.schedmd.com/overview.html

Multi-cluster配置:

https://slurm.schedmd.com/multi_cluster.html

Accounting and Resource Limits

https://slurm.schedmd.com/accounting.html

Slurm下载链接:

https://www.schedmd.com/downloads.php

Slurm安装步骤:

https://slurm.schedmd.com/quickstart_admin.html

Munge下载链接:

https://dun.github.io/munge/

Munge安装步骤

https://github.com/dun/munge/wiki/Installation-Guide

 

 

本篇作者

廖良茂

AWS解决方案架构师,负责基于AWS云计算方案架构的咨询和设计,在国内推广AWS云平台技术和各种解决方案,目前专注于高性能计算领域。在加入AWS之前就职于微软、甲骨文公司,熟悉数据库、备份和容灾等解决方案。