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

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

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

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

您可以配置opentargetedODCR。打开ODCR所有与ODCR属性匹配的实例。这些属性包括实例类型、平台和可用区。您必须在群集配置ODCR中明确定义目标。要确定是open还是ODCR是targeted,请运行 Amazon CLI Amazon EC2 describe-capacity-reservation命令。

您还可以在集群ODCR中创建名为集群置放群组按需容量预留 (CPGODCR) 的置放群组

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

ODCR与一起使用 Amazon ParallelCluster

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

ODCR在集群配置中

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

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

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

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

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

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

ODCRs可以将多个资源分组到一个资源组中。这可以用在运行实例覆盖中,以同时定位多个ODCRs实例。

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

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

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

将预留实例与 Amazon ParallelCluster

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

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

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

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

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

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

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

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

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

  • ${overrides}是一个任意JSON对象,其中包含用于队列和实例类型的特定组合的RunInstances替代列表。覆盖语法必须遵循与 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>
警告
  • 从 3.3.0 Amazon ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。

  • 此方法与 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,都要将其添加到群组预约中。Replace(替换) ACCOUNT_ID 使用您的账户 ID,PLACEHOLDER_CAPACITY_RESERVATION 使用您的容量预留 ID,以及 REGION_ID 使用你的 Amazon Web Services 区域 身份证(例如 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

    在本地计算机中创建策略文档。Replace(替换) ACCOUNT_ID 使用您的账户 ID 和 REGION_ID 使用你的 Amazon Web Services 区域 身份证(例如 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. Amazon Web Services 账户 使用您创建的 json 文件在您的上创建IAM策略。

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

    ACCOUNT_ID替换为你的 Amazon Web Services 账户 身份证和REGION_ID你的 Amazon Web Services 区域 身份证(例如 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 存储桶。Replace(替换) amzn-s3-demo-bucket 使用您的特定 S3 存储桶名称。

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

    Region: REGION_ID Image:   Os: alinux2 HeadNode:   InstanceType: c5.2xlarge   Ssh:     KeyName: YOUR_SSH_KEY   Iam:     S3Access:       - BucketName: amzn-s3-demo-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://amzn-s3-demo-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. 创建集群。

    使用以下命令来创建集群。Replace(替换) 集群配置.yaml 用你的配置文件名,集群-dl 使用您的集群名称,以及 REGION_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 来回收节点,然后等待替换这些节点。为此,您可以从 Amazon 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