亚马逊AWS官方博客

基于云原生构建的 HPC 平台演示

一、背景介绍

目前人工智能、生命科学、航天航空、气象石油和工业制造等应用领域对超强计算能力的需求呈井喷式增长,从最极端的神秘科学到最直接的实际问题,超级计算机在人类能力、环境和理解的提升和进步中发挥着至关重要的作用。高性能计算(HPC)是超级计算的代名词,是一种主要的探索手段,使用HPC所需的技能是多样且复杂的,而学习这样的技能并达到充分熟悉的程度,在正常实践中至少需要多年的学习和经验积累。

随着云计算的发展,HPC 的部署难度大幅度降低,与此同时HPC的形式也多种多样,有依赖于Slurm, SGE, PBS等作业调度及资源管理系统的HPC,也有结合云原生技术发展出来的托管服务如AWS Batch,不仅无需运维管理底层硬件,还能依托于全球云资源构建更大规模、硬件资源更多样的HPC集群,并且依然可以结合OpenMP或MPI构建我们的并行应用。

本文对真实的企业应用场景进行抽象,围绕AWS托管服务,基于CDK构建了完整的HPC平台,以批处理作业为示例,让终端用户能够通过web页面进行任务的提交,触发相应的Serverless工作流来调度数据拆分、批量计算、消息提醒等任务,为了更好的示例效果,本文的工作流涉及Serial、Parallel、Map、Choice等多种调度逻辑和复杂嵌套关系,根据任务对算力的要求采用了AWS Lambda、AWS Batch以演示如何与多种算力进行结合,最终结果存储在S3中,并集成了数据生命周期管理,此外基于云原生的理念,所有的计算环境我们均采用容器化方式实现,方案中也构建了CI/CD Pipeline,让用户能够通过提交代码自动化更新应用环境。

二、架构概述

a) 前端应用

左侧 WebApplication Stack 部分为前端应用,用户任务提交,用户可指定输入、输出位置以及任务拆分等相关参数,表单提交后会同步调用后端API启动工作流进行计算任务调度。该应用采用Flask构建并运行在AWS Fargate之上,为保证高可用由AWS ALB代理多个容器并根据负载弹性伸缩,容器会通过环境变量动态获取后端API Endpoint。

b) HPC 资源管理及调度

中间Production Stack部分为任务调度及HPC计算平台,用户提交的任务参数经过lambda解析会传递给Step function状态机执行对应的工作流,工作流中包含了多种任务逻辑如Parallel、Map、Choice等以及他们之间的复杂嵌套,具体任务根据计算类型分别运行在AWS Lambda(轻量级任务)和AWS Batch(重量级任务)之上,两者计算过程中均会与S3进行数据读写交互。

c) 工作流逻辑

如上图所示,为了尽可能的演示serverless workflow工具的使用,示例采用了比较简单的数据处理逻辑,蓝色线为任务输入,黄色为输出。

Start State 输入为Json格式,包含输入、每个任务需要处理的文本行数(假设input.tsv总行数为10万行,拆分参数为1万行)。

String_Split State 会调用API提交计算任务到AWS Batch,该任务创建S3项目目录,并将文本文件拆分为10个文件,存储拆分后文件及文件列表在S3指定位置。

Job_Map State 会调用AWS Lambda读取文件列表,构建新的JSON作为后续任务的输入,包含每个子任务与其需要处理的文件。

String_Repeat 和String_Reverse State是并行的Map任务(上图左侧绿色框),均接收Job_Map的输出作为输入,根据输入的任务数组元素数量,创建对应的10个Map子任务,每个Map子任务对应一个Batch Job,如10个String_Repeat子任务分别对拆分后的文件1,2,3…10中的文本进行Repeat操作,而String_Reverse会进行Reverse操作,输出结果会添加repeat/reverse前缀。

Map任务的所有子任务均结束后,会触发对应String_Repeat_Merge/String_Reverse_Merge任务,对上述结果进行合并。

所有合并任务完成后会触发Check_Output,会调用Lambda检查S3文件大小,并构造消息提醒Json输出。

Notification State会将Check_Output结果作为消息体发送给对应SNS Topic,。

Is_Complete State是Choice任务,会判断消息体中的OutputStatus字段,若为FAILED则调用Failed任务,若为SUCCESSED则结束整个工作流。

Failed State是wait任务,会延迟5s后重新调用Job_Map, 在实际应用场景中我们可对原始参数进行微调后重新调用分析流程,此处并未做任务参数修改。

对于每个任务传参的细节可参考CDK代码,此外在基因测序、新药研发等领域常见的workflow流程均可使用该服务进行编排,后续会在其它文章中给出详细示例。

d) 数据存储

持久化数据均存储在S3中,该S3桶配置了生命周期策略,如下:

Standard   —30 days—> S3 Glacier

—120 days—> S3 Deep Archive

—365 days—> Expiration

e) CI/CD Pipeline

整个架构中包含两条流水线,均采用AWS Code系列构建。

1)负责构建和更新计算任务所需要的容器镜像

该流水线负责对提交的代码进行docker build,并推送镜像至ECR镜像仓库,覆盖Latest版本,在AWS Batch环境中会引用EC2启动模板,该模板会默认引用不同容器的最新版本镜像。

2)负责构建并滚动更新AWS Fargate 中运行的前端服务

该流水线除了对提交的代码进行docker build外,会通过AWS CodeBuild 滚动更新 AWS Fargate 上运行的前端服务。

三、平台部署

注:整套环境建议在Global区域(如弗吉尼亚北部、新加坡等)进行测试,由于中国区缺少AWS CodePipeline服务,暂时无法部署CICDPipeline Stack,可手动build对应镜像并推送至ECR。

a) 创建必要的Role及User

该实验需要如下权限策略,需要创建对应策略与角色,在实验环境安全情况下也可使AdministratorAccess或PowerUserAccess创建role,后续所有操作需要在附加该Role的EC2中进行,本地用户需要创建IAM User。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "states:*",
                "sns:*",
                "codeartifact:*",
                "apigateway:*",
                "s3:*",
                "logs:*",
                "cloudformation:*",
                "elasticloadbalancing:*",
                "codebuild:*",
                "iam:*",
                "codecommit:*",
                "batch:*",
                "cloudwatch:*",
                "kms:*",
                "lambda:*",
                "ecs:*",
                "ecr:*",
                "codepipeline:*",
                "ec2:*",
                "events:*"
            ],
            "Resource": "*"
        }
    ]
}

b) 初始化环境

  • 启动配置为t3.small的EC2,选择Amazon Linux2镜像,配置admin role

  • 登录EC2并配置CDK依赖环境
curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
sudo yum install -y nodejs git
sudo npm install -g aws-cdk@1.126.00

  • Clone代码仓库配置库环境
cd ~
git clone https://github.com/hy714335634/awesome-HPC-with-IaC
cd awesome-HPC-with-IaC/
python3 -m venv .env
source .env/bin/activate
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
#中国区域部署可使用 -i https://pypi.tuna.tsinghua.edu.cn/simple 

  • 修改环境变量,配置项目参数如下:
echo 'export UserName="abc"' >> ~/.bashrc
echo 'export EmailAddress="abcdefc@qq.com"' >> ~/.bashrc
echo 'export Region="ap-southeast-1"' >> ~/.bashrc
echo 'source ~/awesome-HPC-with-IaC/.env/bin/activate' >> ~/.bashrc
source ~/.bashrc
aws configure set default.region ${Region}
  • 查看cdk stack,配置cdk部署环境

cdk ls

cdk bootstrap

c) HPC平台部署

  • 部署Serverless编排及后端HPC资源

cdk deploy Production-${UserName}

  • 部署过程中会收到SNS订阅邮件,点击确认订阅

d) 前端应用部署

cdk deploy WebApplication-${UserName}


e) 部署自动化流水线

  • 部署CICD流水线
    1.  国内区域无法部署,需删除Code pipeline相关方法

#注:部署完成后需要手动更新

sed -i '41,68d' workshop/construct/cicdpipeline/cicd_batch.py
sed -i '44,84d' workshop/construct/cicdpipeline/cicd_web.py
cdk deploy CICDPipeline-${UserName}
    1. 海外区域部署方法

cdk deploy CICDPipeline-${UserName}

f) 获取下述信息

通过deploy命令输出Codecommit地址,Web地址并记录

cdk deploy –all

change picture

四、通过CICD部署应用并测试

a) 配置CodeCommit认证

git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true

b) 前端应用部署

  • 克隆代码仓库
cd ~
git clone https://git-codecommit.${Region}.amazonaws.com/v1/repos/Workshop-Web-${UserName}
cp -r awesome-HPC-with-IaC/docker-image/WebApplication/* Workshop-Web-${UserName}/
cd Workshop-Web-${UserName}/
  • 修改buildspec.yml文件中的username及account-id
accountID=`curl --silent http://169.254.169.254/latest/meta-data/iam/info/ | perl -lne 'print $1 if /:iam::(\d*):instance-profile/'`
sed -i "s/username: \"username\"/username: \"${UserName}\"/g" buildspec.yml
sed -i "s/accountid.dkr.ecr.ap-southeast-1.amazonaws.com/${accountID}.dkr.ecr.${Region}.amazonaws.com/g" buildspec.yml
  • 代码提交
git add .
git commit -m "init code"
git push origin master


c) 后端应用部署

  • 克隆代码仓库
cd ~
git clone https://git-codecommit.${Region}.amazonaws.com/v1/repos/Workshop-Batch-${UserName}
cp -r awesome-HPC-with-IaC/docker-image/BatchJob/* Workshop-Batch-${UserName}/	
cd ~/Workshop-Batch-${UserName}
  • 修改buildspec.yml文件中的username及account-id
accountID=`curl --silent http://169.254.169.254/latest/meta-data/iam/info/ | perl -lne 'print $1 if /:iam::(\d*):instance-profile/'`
sed -i "s/username: \"username\"/username: \"${UserName}\"/g" buildspec.yml
sed -i "s/accountid.dkr.ecr.ap-southeast-1.amazonaws.com/${accountID}.dkr.ecr.${Region}.amazonaws.com/g" buildspec.yml
  • 代码提交
git add .
git commit -m "init code"
git push origin master

五、测试数据处理流程

a) 上传测试数据到S3 bucket

cd ~/
s3bucket=`aws cloudformation describe-stacks \
  	--stack-name Production-${UserName} \
  	--query "Stacks[0].Outputs[?ExportName==S3BucketForAWSBatch].OutputValue" \
  	--output text`
cd ~/awesome-HPC-with-IaC/testdata
aws s3 cp random.string s3://${s3bucket}/

b) 页面提交任务


c) 在控制台查看AWS Step functions及AWS Batch任务调度



d) 分析完成后可在控制台或通过命令行检查结果


cd ~/
s3bucket=`aws cloudformation describe-stacks \
  	--stack-name Production-${UserName} \
  	--query "Stacks[0].Outputs[?ExportName==S3BucketForAWSBatch].OutputValue" \
  	--output text`
aws s3 sync s3://${s3bucket}/result/ .

六、清理资源

a) 删除S3 bucket

cd ~/
s3bucket=`aws cloudformation describe-stacks \
  	--stack-name Production-${UserName} \
  	--query "Stacks[0].Outputs[?ExportName==S3BucketForAWSBatch].OutputValue" \
  	--output text`
aws s3 rb s3://${s3bucket} --force

b) 删除ECR

f

for repo in `aws ecr describe-repositories \
    --output text \
    --query 'repositories[*].[repositoryName]' \
    | grep -E "^(batch|web)+_${UserName}/"`; 
    do aws ecr delete-repository 
        --repository-name $repo \
        --force; \
done;

c) 删除stack

cd ~/awesome-HPC-with-IaC
cdk destroy --all

七、总结

该实验结合AWS Serverless及云原生的HPC服务,演示了相对完整的HPC业务场景,包括前端交互、任务自动化编排及调度、HPC计算与任务管理,以及CI/CD与基础设施代码化构建业务所需环境。对于较为成熟的业务流程,使用该架构可以大大降低运维难度与计算成本,并且提高资源利用率,保证业务的高可用与任务的全生命周期的监控。

八、参考

Amazon API Gateway官方文档:https://docs.aws.amazon.com/zh_cn/apigateway/?id=docs_gateway

AWS Lambda官方文档:https://docs.aws.amazon.com/zh_cn/lambda/?id=docs_gateway

Amazon S3官方文档:https://docs.aws.amazon.com/zh_cn/s3/?id=docs_gateway

Amazon SQS官方文档:https://docs.aws.amazon.com/zh_cn/sqs/?id=docs_gateway

Amazon DynamoDB官方文档:https://docs.aws.amazon.com/zh_cn/dynamodb/?id=docs_gateway

AWS Batch官方文档:https://docs.aws.amazon.com/zh_cn/batch/?id=docs_gateway

Amazon ECR官方文档:https://docs.aws.amazon.com/zh_cn/ecr/?id=docs_gateway

Amazon ECS官方文档:https://docs.aws.amazon.com/zh_cn/ecs/?id=docs_gateway

Amazon SNS官方文档:https://docs.aws.amazon.com/zh_cn/sns/?id=docs_gateway

AWS Step functions官方文档:https://docs.aws.amazon.com/zh_cn/step-functions/?id=docs_gateway

AWS Cloud Development Kit (CDK):https://docs.aws.amazon.com/zh_cn/cdk/?id=docs_gateway

本篇作者

张强

AWS解决方案架构师,拥有多年生物信息开发经验,熟悉传统工作流与HPC环境迁移至云原生技术的技术实现,目前服务于生命科学和医疗健康相关行业客户,如医学影像、基因组学、药物研发等,致力于提供有关HPC、无服务器、数据安全等各类云计算解决方案的咨询与架构设计。热爱生活,闲暇之余喜欢外出远足、摄影和潜水,乐于参加各类技术交流。