创建PCS集群

PCS 资源

PCS 有三种主要资源类型:

Cluster — 顶层资源。当我们创建集群时,PCS 会在 AWS 托管账户中预置一个 Slurm 控制器。该控制器与我们账户中的计算节点进行通信。在创建集群时,我们需要指定 Slurm 版本、VPC 和子网。

Compute Node Group — 一组托管的 EC2 实例集合。我们可以定义实例类型、AMI、启动模板、扩展边界(最小/最大实例数)、购买选项(按需或竞价)以及 Slurm 特定的设置。PCS 会根据作业需求自动启动和终止实例。计算节点组也用于登录节点(采用静态扩展)。

Queue — 一个 Slurm 分区。我们将一个或多个计算节点组关联到一个队列。用户将作业提交到队列,PCS 会将它们调度到关联的计算节点组中的实例上。

PCS 如何映射到 Slurm

PCS 概念 Slurm 对应项 作用
Cluster 控制器(slurmctld) 管理调度和节点生命周期
Compute Node Group 节点集 定义具有共同属性的计算实例池
Queue 分区 将节点集分组以供作业提交

实例如何配置

PCS 使用两种机制来配置它启动的 EC2 实例:

  1. AMI — 包含操作系统、PCS 代理、Slurm、驱动程序和预装软件的基础镜像。这是我们构建一次即可重复使用的内容。

  2. Launch Template — 控制实例级别的配置: EFA 网络接口、安全组、置放群组和用户数据。用户数据(采用 MIME 多部分格式)在启动时运行,用于挂载文件系统、启动服务并为实例的角色进行配置。

AMI 提供"安装了什么”,而启动模板提供"启动时如何配置”。

资源创建顺序

我们需要按以下顺序创建 PCS 资源:

  1. Cluster — 需要 VPC 和子网
  2. Launch Template — 需要安全组、子网 ID、文件系统 ID
  3. Compute Node Group — 需要集群、AMI、启动模板、IAM 实例配置文件
  4. Queue — 需要集群和至少一个计算节点组

首先,使用来自预部署基础设施的资源 ID 设置 shell 变量:

export INFRA_STACK="pcs-workshop-infra"
export AWS_DEFAULT_REGION="us-east-2"

export PRIVATE_SUBNET_1=$(aws cloudformation describe-stacks \
  --stack-name $INFRA_STACK \
  --query "Stacks[0].Outputs[?OutputKey=='PrivateSubnetId1'].OutputValue" \
  --output text)

export HPC_SUBNET=$(aws cloudformation describe-stacks \
  --stack-name $INFRA_STACK \
  --query "Stacks[0].Outputs[?OutputKey=='HpcSubnetId'].OutputValue" \
  --output text)

export PRIVATE_SG=$(aws cloudformation describe-stacks \
  --stack-name $INFRA_STACK \
  --query "Stacks[0].Outputs[?OutputKey=='PrivateSecurityGroupId'].OutputValue" \
  --output text)

echo "HPC Subnet: $HPC_SUBNET"
echo "Private SG: $PRIVATE_SG"

创建集群

运行以下命令来创建一个 PCS 集群:

aws pcs create-cluster \
  --cluster-name hpc-cluster \
  --scheduler type=SLURM,version=25.11 \
  --size SMALL \
  --networking "subnetIds=$HPC_SUBNET,securityGroupIds=$PRIVATE_SG" \
  --slurm-configuration '{
    "accounting": {"mode": "STANDARD", "defaultPurgeTimeInDays": 30},
    "slurmCustomSettings": [
      {"parameterName": "MetricsType", "parameterValue": "metrics/openmetrics"},
      {"parameterName": "CommunicationParameters", "parameterValue": "enable_http"}
    ]
  }' \
  --region $AWS_DEFAULT_REGION

我们应该会看到如下输出:

image-20260803134355684

status: CREATING 确认集群正在配置中。

以下是每个参数的作用:

  • --cluster-name —— 集群的名称。必须为 3-40 个字符,以字母开头,且仅包含字母、数字和连字符。
  • --scheduler —— 作业调度器类型和版本。PCS 目前支持 Slurm。
  • --size —— 确定计算节点和作业的最大数量。SMALL 最多支持 32 个节点和 256 个作业。对于更大的工作负载,请使用 MEDIUM(512 个节点)或 LARGE(2048 个节点)。
  • --networking —— 集群控制器网络接口的子网和安全组。PCS 在此子网中创建一个 ENI 来与我们的计算节点通信。目前支持 1 个子网。
  • --slurm-configuration —— 嵌套的 Slurm 控制器配置。此处设置了两个字段:
    • accounting —— 启用托管的 Slurm accounting,数据保留期为 30 天。PCS 创建并管理 accounting 数据库,因此我们不需要单独的 Slurmdbd 服务器。这让我们可以使用 sacct 查询作业历史,并使用 sacctmgr 管理用户账户。
    • slurmCustomSettings —— 透传的 Slurm 控制器配置。MetricsType=metrics/openmetricsCommunicationParameters=enable_http 在 TCP 6817 上开启 Slurm 的 OpenMetrics HTTP 端点

注意PCS 在 AWS 托管的账户中创建集群controller,而不是在我们的账户中。controller通过它在指定子网中创建的 ENI 与我们 VPC 中的计算节点通信。

上面的操作也可以通过在控制台完成:

image-20260803134859285

等待集群变为活动状态

集群创建需要几分钟到十几分钟。检查状态:

aws pcs get-cluster \
  --cluster-identifier hpc-cluster \
  --query "cluster.{Name:name,Status:status,Id:id}" \
  --output table

image-20260803134629643

我们应该会看到 Status: CREATING。轮询直到它变为 ACTIVE:

watch -n 10 "aws pcs get-cluster \
  --cluster-identifier hpc-cluster \
  --query 'cluster.status' \
  --output text"

一旦状态显示 ACTIVE,按 Ctrl+C

每个区域每个账户只能有 1 个处于 CREATING 状态的集群。如果我们收到 ServiceQuotaExceededException,请先等待任何其他集群创建完成。

image-20260803140224525

验证

集群变为活动状态后,检查完整详细信息:

aws pcs get-cluster \
  --cluster-identifier hpc-cluster \
  --output yaml

注意 id 字段 —— 在后续命令中,我们将使用集群名称(hpc-cluster)作为 --cluster-identifier

输出类似于:

cluster:
  arn: arn:aws:pcs:us-east-2:482528704118:cluster/pcs_e6l6a4pxms
  createdAt: '2026-08-03T05:43:40+00:00'
  endpoints:
  - port: '6817'
    privateIpAddress: 10.3.157.12
    type: SLURMCTLD
  - port: '6819'
    privateIpAddress: 10.3.157.12
    type: SLURMDBD
  id: pcs_e6l6a4pxms
  modifiedAt: '2026-08-03T05:43:40+00:00'
  name: hpc-cluster
  networking:
    securityGroupIds:
    - sg-0d5385da135efd836
    subnetIds:
    - subnet-0a6cb8d0096af78a3
  scheduler:
    type: SLURM
    version: '25.11'
  size: SMALL
  slurmConfiguration:
    accounting:
      defaultPurgeTimeInDays: 30
      mode: STANDARD
    authKey:
      secretArn: arn:aws:secretsmanager:us-east-2:482528704118:secret:pcs!slurm-secret-pcs_e6l6a4pxms-K50KoH
      secretVersion: 84832240-eea2-4d35-a05b-f037035e7fbc
    scaleDownIdleTimeInSeconds: 600
    slurmCustomSettings:
    - parameterName: MetricsType
      parameterValue: metrics/openmetrics
    - parameterName: CommunicationParameters
      parameterValue: enable_http
    slurmRest:
      mode: NONE
  status: ACTIVE

同时注意 endpoints 部分 —— 它显示了计算节点将连接到的 Slurm 控制器端点(slurmctld)。

export CLUSTER_ID=$(aws pcs get-cluster \
  --cluster-identifier hpc-cluster \
  --query "cluster.id" \
  --output text)
echo "Cluster ID: $CLUSTER_ID"

我们已经创建了一个带有 Slurm 控制器的 PCS 集群。该集群目前还没有计算节点 —— 我们将在接下来添加它们。