使用 ODCR(按需容量预留)启动实例 - Amazon ParallelCluster
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 ODCR(按需容量预留)启动实例

使用按需容量预留 (ODCR),您可以为特定可用区中的集群 Amazon EC2 实例预留容量。通过这种方式,您可以独立于由节省计划区域性预留实例提供的账单账户创建和管理容量预留。

您可以配置 opentargeted 按需容量预留 (ODCR)。开放式 ODCR 涵盖与 ODCR 属性匹配的所有实例。这些属性包括实例类型、平台和可用区。您必须在集群配置中显式定义定向 ODCR。要确定 ODCR 是 open 还是 targeted,请运行 Amazon CLI EC2 describe-capacity-reservation 命令。

您还可以在集群置放群组中创建 ODCR,称为集群置放群组按需容量预留 (CPG ODCR)

可以在一个资源组中对多个 ODCR 进行分组。这可以在集群配置文件中定义。有关资源组的更多信息,请参阅 Resource Groups and Tags User Guide 中的 What are resource groups?

将 ODCR 与 Amazon ParallelCluster 结合使用

Amazon ParallelCluster 支持开放式 ODCR。使用开放式 ODCR 时,您不需要在 Amazon ParallelCluster 中指定任何内容。系统会自动为集群选择实例。您可以指定现有置放群组或让 Amazon ParallelCluster 创建新群组。

集群配置中的 ODCR

从 Amazon ParallelCluster 版本 3.3.0 开始,您可以在集群配置文件中定义 ODCR,而无需指定 EC2 运行实例覆盖。

您首先使用各自链接文档中描述的方法创建容量预留资源组。您必须使用 Amazon CLI 方法来创建容量预留组。如果您使用 Amazon Web Services Management Console,则只能创建基于标签或基于堆栈的资源组。启动带有容量预留的实例时,Amazon ParallelCluster 或 Amazon CLI 不支持基于标签和基于堆栈的资源组。

创建容量预留和资源组后,在 SlurmQueues/CapacityReservationTargetSlurmQueues/ComputeResources/CapacityReservationTarget 中指定它们,如以下集群配置示例所示。将红色突出显示的替换为您的有效值。

Image: Os: os HeadNode: InstanceType: head_node_instance Networking: SubnetId: public_subnet_id Ssh: KeyName: key_name Scheduling: Scheduler: scheduler SlurmQueues: - Name: queue1 Networking: SubnetIds: - private_subnet_id ComputeResources: - Name: cr1 Instances: - InstanceType: instance MaxCount: max_queue_size MinCount: max_queue_size Efa: Enabled: true CapacityReservationTarget: CapacityReservationResourceGroupArn: capacity_reservation_arn
警告
  • 从 Amazon ParallelCluster 版本 3.3.0 开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。

  • 此方法与 Slurm 的多实例类型分配不兼容。

在 Amazon ParallelCluster 版本 3.1.1 中添加了对 targeted ODCR 的支持。此版本中引入了一种机制,可覆盖 EC2 RunInstances 参数并传递有关要对 Amazon ParallelCluster 中配置的每个计算资源使用的预留的信息。该机制与 targeted ODCR 兼容。但在使用 targeted ODCR 时,必须指定 run-instances 覆盖配置。必须在 Amazon CLI EC2 run-instances 命令中显式定义定向 ODCR。要确定 ODCR 是 open 还是 targeted,请运行 Amazon CLI EC2 命令 describe-capacity-reservation

可以在一个资源组中对多个 ODCR 进行分组。可以在运行实例覆盖中使用此功能来同时定向多个 ODCR。

如果您使用的是 targeted ODCR,则可以指定置放群组。但您还需要指定 run-instances 覆盖配置。

假设 Amazon 为您创建了一个 targeted ODCR,或者您有一组特定的预留实例,则您无法指定置放群组。由 Amazon 配置的规则可能与置放群组设置冲突。因此,如果您的应用程序需要置放群组,请使用 CPG ODCR。在任何一种情况下,您还必须指定 run-instances 覆盖配置。

如果您使用的是 CPG ODCR,则必须指定 run-instances 覆盖配置,并且必须在集群配置中指定相同的置放群组。

将预留实例与 Amazon ParallelCluster 结合使用

预留实例不同于容量预留 (ODCR)。预留实例有两种类型区域性预留实例不预留容量。分区预留实例可在指定可用区中预留容量。

如果您有区域性预留实例,则没有容量预留,可能会出现容量不足错误。如果您有分区预留实例,则有容量预留,但没有 run-instances API 参数可以用来指定容量预留。

任何 Amazon ParallelCluster 版本都支持预留实例。您无需在 Amazon ParallelCluster 中指定任何内容,系统会自动选择实例。

使用分区预留实例时,您可以不在集群配置中指定置放群组,从而避免潜在的容量不足错误。

警告
  • 从 Amazon ParallelCluster 版本 3.3.0 开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。

  • 此方法与 Slurm 的多实例类型分配不兼容。

您可以覆盖集群队列中配置的每个计算资源的 EC2 RunInstances 参数。为此,请在集群的头节点上创建包含以下代码片段内容的 /opt/slurm/etc/pcluster/run_instances_overrides.json 文件:

  • ${queue_name} 是要对其应用覆盖的队列的名称。

  • ${compute_resource_name} 是要对其应用覆盖的计算资源。

  • ${overrides} 是包含用于队列和实例类型特定组合的 RunInstances 覆盖列表的任意 JSON 对象。覆盖语法必须遵循与 run_instances boto3 调用中记录的规范相同的规范。

{     "${queue_name}": {         "${compute_resource_name}": {             ${overrides}         },         ...     },     ... }

例如,以下 JSON 将 ODCR 组 group_arn 配置为用于 my-queuemy-compute-resource 中配置的 p4d.24xlarge 实例。

{     "my-queue": {         "my-compute-resource": {             "CapacityReservationSpecification": {                 "CapacityReservationTarget": {                     "CapacityReservationResourceGroupArn": "group_arn"                 }             }         }     } }

生成此 JSON 文件后,负责集群扩展的 Amazon ParallelCluster 进程守护程序会自动使用覆盖配置启动实例。要确认实例预置是否使用了指定的参数,请查看以下日志文件:

  • /var/log/parallelcluster/clustermgtd(对于静态容量)

  • /var/log/parallelcluster/slurm_resume.log(对于动态容量)

如果参数正确,您会发现包含以下内容的日志条目:

Found RunInstances parameters override. Launching instances with: <parameters_list>
警告
  • 从 Amazon ParallelCluster 版本 3.3.0 开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。

  • 此方法与 Slurm 的多实例类型分配不兼容。

  1. 创建资源组以对容量分组。

    $ aws resource-groups create-group --name EC2CRGroup \   --configuration '{"Type":"Amazon::EC2::CapacityReservationPool"}' '{"Type":"Amazon::ResourceGroups::Generic", "Parameters": [{"Name": "allowed-resource-types", "Values": ["Amazon::EC2::CapacityReservation"]}]}'
    注意

    资源组不支持由其他账户共享的资源。

    如果目标 ODCR 由其他账户共享,则无需创建资源组。在步骤 3 中使用 CapacityReservationId 代替资源组。

    #!/bin/bash set -e # Override run_instance attributes cat > /opt/slurm/etc/pcluster/run_instances_overrides.json << EOF {     "my-queue": {         "my-compute-resource": {             "CapacityReservationSpecification": {                 "CapacityReservationTarget": {                     "CapacityReservationId": "cr-abcdef01234567890"                 }             }         }     } } EOF

    向资源组中添加容量预留。每次创建新的 ODCR 时,请将其添加到群组预留中。将 ACCOUNT_ID 替换为您的账户 ID,将 PLACEHOLDER_CAPACITY_RESERVATION 替换为您的容量预留 ID,并将 REGION_ID 替换为您的 Amazon Web Services 区域 ID(例如 us-east-1)。

    $ aws resource-groups group-resources --region REGION_ID --group EC2CRGroup \   --resource-arns arn:aws:ec2:REGION_ID:ACCOUNT_ID:capacity-reservation/PLACEHOLDER_CAPACITY_RESERVATION

    在本地计算机中创建策略文档。将 ACCOUNT_ID 替换为您的账户 ID,并将 REGION_ID 替换为您的 Amazon Web Services 区域 ID(例如 us-east-1)。

    cat > policy.json << EOF {     "Version": "2012-10-17",     "Statement": [         {             "Sid": "RunInstancesInCapacityReservation",             "Effect": "Allow",             "Action": "ec2:RunInstances",             "Resource": [                 "arn:aws:ec2:REGION_ID:ACCOUNT_ID:capacity-reservation/*",                 "arn:aws:resource-groups:REGION_ID:ACCOUNT_ID:group/*"             ]         }     ] } EOF
  2. 使用您创建的 json 文件在您的 Amazon Web Services 账户上创建 IAM 策略。

    $ aws iam create-policy --policy-name RunInstancesCapacityReservation --policy-document file://policy.json
  3. 在实例上本地创建以下安装后脚本并将其命名为 postinstall.sh

    ACCOUNT_ID 替换为您的 Amazon Web Services 账户 ID,并将 REGION_ID 替换为您的 Amazon Web Services 区域 ID(例如 us-east-1)。

    #!/bin/bash set -e # Override run_instance attributes cat > /opt/slurm/etc/pcluster/run_instances_overrides.json << EOF {     "my-queue": {         "my-compute-resource": {             "CapacityReservationSpecification": {                 "CapacityReservationTarget": {                     "CapacityReservationResourceGroupArn": "arn:aws:resource-groups:REGION_ID:ACCOUNT_ID:group/EC2CRGroup"                 }             }         }     } } EOF

    将该文件上传到 Amazon S3 存储桶。将 S3_NAME_BUCKET 替换为您的特定 S3 存储桶名称。

    $ aws s3 mb s3://S3_NAME_BUCKET aws s3 cp postinstall.sh s3://S3_NAME_BUCKET/postinstall.sh
  4. 创建本地集群配置,将占位符替换为您自己的值。

    Region: REGION_ID Image:   Os: alinux2 HeadNode:   InstanceType: c5.2xlarge   Ssh:     KeyName: YOUR_SSH_KEY   Iam:     S3Access:       - BucketName: S3_NAME_BUCKET     AdditionalIamPolicies:       - Policy: arn:aws:iam::ACCOUNT_ID:policy/RunInstancesCapacityReservation   ## This post-install script is executed after the node is configured.   ## It is used to install scripts at boot time and specific configurations   ## In the script below we are overriding the calls to RunInstance to force   ## the provisioning of our my-queue partition to go through   ## the On-Demand Capacity Reservation   CustomActions:     OnNodeConfigured:       Script: s3://S3_NAME_BUCKET/postinstall.sh   Networking:     SubnetId: YOUR_PUBLIC_SUBNET_IN_TARGET_AZ Scheduling:   Scheduler: slurm   SlurmQueues:     - Name: my-queue       ComputeResources:         - MinCount: 0           MaxCount: 100           InstanceType: p4d.24xlarge           Name: my-compute-resource           Efa:             Enabled: true       Networking:         ## PlacementGroup:         ##   Enabled: true ## Keep PG disabled if using targeted ODCR         SubnetIds:           - YOUR_PRIVATE_SUBNET_IN_TARGET_AZ
  5. 创建集群。

    使用以下命令来创建集群。将 cluster-config.yaml 替换为您的配置文件名称,将 cluster-dl 替换为您的集群名称,并将 REGION_ID 替换为您的区域 ID(例如 us-east-1)。

    $ pcluster create-cluster --cluster-configuration cluster-config.yaml --cluster-name cluster-dl --region REGION_ID

    创建集群后,安装后脚本将在头节点中运行。该脚本将会创建 run_instances_overrides.json 文件并覆盖对 RunInstances 的调用,以将分区强制预置为完成按需容量预留。

    负责集群扩展的 Amazon ParallelCluster 进程守护程序会自动将此配置用于启动的新实例。要确认是否将指定的参数用于预置实例,您可以查看以下日志文件:

    • /var/log/parallelcluster/clustermgtd(对于静态容量 - MinCount > 0

    • /var/log/parallelcluster/slurm_resume.log(对于动态容量)

    如果参数正确,您会发现包含以下内容的日志条目。

    Found RunInstances parameters override. Launching instances with: <parameters_list>

更新 RunInstances 覆盖

您可以随时更新生成的 JSON 配置,而无需停止计算实例集。应用更改后,所有新实例都将使用更新的配置启动。如果您需要将更新的配置应用于正在运行的节点,请通过强制终止实例来回收这些节点,然后等待 Amazon ParallelCluster 替换这些节点。为此,您可以从 EC2 控制台或 Amazon CLI 中终止实例,或者将 Slurm 节点设置为 DOWNDRAIN 状态。

使用以下命令将 Slurm 节点设置为 DOWNDRAIN

$ scontrol update nodename=my-queue-dy-my-compute-resource-1 state=down reason=your_reason scontrol update nodename=my-queue-dy-my-compute-resource-1 state=drain reason=your_reason