环境准备

我们将使用一个 CloudFormation 来部署 VPC、子网、安全组、IAM 角色、EFS、FSx for Lustre、自定义 PCS 和可视化 AMI,以及一个 LDAP 服务器。基于 static/cfn/pcs-workshop-infra.yaml 构建。由于它使用 EC2 Image Builder 构建两个自定义 AMI,因此部署需要 30 到 45 分钟。

上传模板并部署cloudformation堆栈

该基础设施模板太大,无法内联传递给 CloudFormation(内联限制约为 50 KB)。因此,要将其上传到 S3 存储桶并通过 URL 引用它。

下载模板:

export AWS_DEFAULT_REGION=us-east-2
wget https://pingfan.s3.amazonaws.com/files/pcs-workshop-infra.yaml
ls -la pcs-workshop-infra.yaml

应该会看到一个大小非零的文件(模板约为 60 KB)。

现在创建一个存储桶,上传模板,并创建堆栈:

# 为 CloudFormation 模板创建一个私有 S3 存储桶。
# 存储桶名称必须全局唯一,因此我们用账户 ID 作为后缀。
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
export TEMPLATE_BUCKET="pcs-workshop-templates-${AWS_ACCOUNT_ID}"
aws s3 mb s3://${TEMPLATE_BUCKET} --region $AWS_DEFAULT_REGION

# 上传模板
aws s3 cp pcs-workshop-infra.yaml s3://${TEMPLATE_BUCKET}/pcs-workshop-infra.yaml
# 部署堆栈,指向已上传的模板
aws cloudformation create-stack \
  --stack-name pcs-workshop-infra \
  --template-url https://${TEMPLATE_BUCKET}.s3.${AWS_DEFAULT_REGION}.amazonaws.com/pcs-workshop-infra.yaml \
  --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

该基础设施堆栈部署需要 30-45 分钟。其中大部分时间是 EC2 Image Builder 打 AMI。

为什么需要 S3 这一步? CloudFormation API 将 --template-body(内联)限制为约 50 KB。使用 --template-url 可以让 CloudFormation 从 S3 读取模板,那里的限制为 1 MB。

等待堆栈变成 CREATE_COMPLETE:

aws cloudformation wait stack-create-complete \
  --stack-name pcs-workshop-infra

创建的资源

  • VPC 和网络 — 一个 VPC,在 2 个可用区中拥有公有和私有子网、一个 NAT 网关和路由表。该 VPC 满足所有 PCS 网络要求(启用了 DNS 主机名和解析,拥有足够的 IP 地址)。

  • 安全组 — 针对不同流量模式预先配置:

    • Public SG — SSH 访问和所有 VPC 内部流量
    • Private SG — 所有 VPC 内部流量
    • EFA SG — 组内所有流量(EFA 节点间通信所需)
    • Lustre SG — 用于 FSx Lustre 客户端挂载的端口 988 和 1018-1023
    • DCV SG — 用于 Amazon DCV Web 访问的端口 8443
  • IAM 实例配置文件 — 一个 EC2 实例配置文件,具有 PCS 节点注册(pcs:RegisterComputeNodeGroupInstance)、Systems Manager、S3 读取访问、CloudWatch agent、ECR 读取访问和 Secrets Manager 的权限。

  • Amazon EFS — 一个加密的文件系统,在两个私有子网中都有挂载目标。我们将把它用作所有集群节点上的共享主目录(/home)。

  • Amazon FSx for Lustre — 一个 PERSISTENT_2 文件系统(1200 GiB,LZ4 压缩),部署在与 hpc7a 实例相同的可用区中以获得最佳性能。我们将在计算节点上把它挂载到 /fsx

  • PCS 兼容 AMI — 一个基于 Amazon Linux 2023 构建的自定义 x86_64 AMI,安装了 PCS agent、Slurm 、EFA 驱动程序、Lustre 客户端、CloudWatch agent、SSSD/LDAP 客户端(预先配置)以及开发工具(gcc、make、htop、vim、jq)。

  • LDAP 服务器 — 一个 OpenLDAP 目录服务器,预先配置了 2 个测试用户(user1user2)和一个 hpcusers 组。AMI 上的 SSSD 已经配置为针对此服务器进行身份验证。

  • 可视化 AMI — 一个基于 Amazon Linux 2023 构建的自定义 x86_64 AMI,包含上述 PCS AMI 中的所有内容,另外预装了 NVIDIA GPU 驱动程序和 Amazon DCV 服务器。GPU 驱动程序在非 GPU 实例上处于休眠状态,但在 g5/g6 硬件上会自动激活。用于远程可视化章节。

  • EC2 密钥对 — Workshop Studio 在我们的账户中创建了一个 ws-default-keypair。计算节点启动模板按名称引用它。本 workshop 通过 Systems Manager Session Manager 而非 SSH 访问节点,因此我们不会直接使用该密钥。

后面我们将从 CloudFormation 输出中检索资源 ID。基础设施stack名为 pcs-workshop-infra

资源 堆栈输出键 描述
VPC VpcId VPC 标识符
Private Subnet (AZ1) PrivateSubnetId1 第一个私有子网
Private Subnet (AZ2) PrivateSubnetId2 第二个私有子网
HPC Subnet HpcSubnetId hpc7a 可用区中的私有子网
HPC Availability Zone HpcAvailabilityZone hpc7a 实例可用的 AZ
Public Subnet PublicSubnetId1 用于 NAT 网关和登录节点的子网
Public Security Group PublicSecurityGroupId SSH + VPC 流量
Private Security Group PrivateSecurityGroupId VPC 内部流量
EFA Security Group EfaSecurityGroupId EFA 节点间通信
Lustre Security Group LustreSecurityGroupId FSx Lustre 客户端访问
DCV Security Group DcvSecurityGroupId DCV Web 访问(端口 8443)
IAM Instance Profile (ARN) PcsInstanceProfileArn 用于 PCS 计算节点组
IAM Instance Profile (Name) PcsInstanceProfileName 用于 PCS 计算节点组
EFS File System EfsFileSystemId 共享主目录
FSx Lustre File System FsxLustreFileSystemId 高性能共享存储
FSx Lustre Mount Name FsxLustreMountName Lustre 挂载命令所需
PCS AMI PcsAmiId 用于计算节点的预构建 x86_64 AMI
Visualization AMI VizAmiId 带有 GPU 驱动程序 + DCV 的可视化节点 AMI
LDAP Server URI LdapServerUri LDAP 连接字符串
LDAP Base DN LdapBaseDn LDAP 目录基础
LDAP Bind DN LdapBindDn LDAP 管理员账户
LDAP Bind Password LdapBindPassword 用于 LDAP 密码的 Secrets Manager ARN
Image Builder Profile ImageBuilderInstanceProfileName 用于构建自定义 AMI
Image Builder Log Bucket ImageBuilderLogBucketName 用于 AMI 构建日志的 S3 存储桶