本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用按需容量预留 (ODCR) 启动实例
通过按需容量预留 (ODCR),您可以在特定可用区为集群 Amazon EC2 实例预留容量。通过这种方式,您可以独立于由节省计划
您可以配置open
或 targeted
ODCR。打开 ODCR 涵盖与 ODCR 属性匹配的所有实例。这些属性包括实例类型、平台和可用区。您必须在群集配置中明确定义目标 ODCR。要确定 ODC open
R 是还是targeted
,请运行 AWS CLI
Amazon EC2 describe-capacity-reservation
命令。
您还可以在集群置放群组中创建 ODCR,称为集群置放群组按需容量预留 (CPG ODCR)。
可以在一个资源组中对多个 ODCR 进行分组。这可以在集群配置文件中定义。有关资源组的更多信息,请参阅 Resource Groups and Tags User Guide 中的 What are resource groups?。
将 ODCR 与 AWS ParallelCluster
AWS ParallelCluster 支持开放式 ODCR。使用开放式 ODCR 时,您不需要在 AWS ParallelCluster中指定任何内容。系统会自动为集群选择实例。您可以指定现有的置放群组或为您 AWS ParallelCluster 创建一个新的置放群组。
集群配置中的 ODCR
从 AWS ParallelCluster 版本 3.3.0 开始,您可以在集群配置文件中定义 ODCR,而无需指定 Amazon EC2 运行实例替代。
您首先使用各自链接文档中描述的方法创建容量预留和资源组。您必须使用这些 AWS CLI 方法来创建容量预留组。如果您使用 AWS Management Console,则只能创建基于标签或基于堆栈的资源组。启动带有容量预留的实例 AWS CLI 时, AWS ParallelCluster 或不支持基于标签和基于堆栈的资源组。
创建容量预留和资源组后,在 SlurmQueues/CapacityReservationTarget 或 SlurmQueues/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
警告
-
从 3.3.0 AWS ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。
-
此方法与 Slurm 的多实例类型分配不兼容。
3.1.1 中增加了targeted
对 ODCR 的 AWS ParallelCluster 支持。此版本中引入了一种机制,可覆盖 EC2 RunInstances
参数并传递有关要对 AWS ParallelCluster中配置的每个计算资源使用的预留的信息。该机制与 targeted
ODCR 兼容。但是,使用 targeted
ODCR 时,必须指定run-instances
替代配置。必须在 AWS CLI Amazon EC2 run-instances
命令中明确定义@@ 目标 ODCR。要确定 ODCR 是open
还是targeted
运行 AWS CLI Amazon EC2 命令describe-capacity-reservation
。
可以在一个资源组中对多个 ODCR 进行分组。可以在运行实例覆盖中使用此功能来同时定向多个 ODCR。
如果您使用的是 targeted
ODCR,则可以指定置放群组。但您还需要指定 run-instances
覆盖配置。
假设为您 AWS 创建了一个 targeted
ODCR,或者您有一组特定的预留实例。则您无法指定置放群组。由配置的规则 AWS 可能与置放群组设置冲突。因此,如果您的应用程序需要置放群组,请使用 CPG ODCR。在任何一种情况下,您还必须指定 run-instances
覆盖配置。
如果您使用的是 CPG ODCR,则必须指定 run-instances
覆盖配置,并且必须在集群配置中指定相同的置放群组。
将预留实例与 AWS ParallelCluster
预留实例不同于容量预留 (ODCR)。预留实例有两种类型。区域性预留实例不预留容量。分区预留实例可在指定可用区中预留容量。
如果您有区域性预留实例,则没有容量预留,可能会出现容量不足错误。如果您有分区预留实例,则有容量预留,但没有 run-instances
API 参数可以用来指定容量预留。
任何 AWS ParallelCluster 版本都支持预留实例。您无需在中指定任何内容 AWS ParallelCluster ,实例就会自动选中。
使用分区预留实例时,您可以不在集群配置中指定置放群组,从而避免潜在的容量不足错误。
警告
-
从 3.3.0 AWS ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。
-
此方法与 Slurm 的多实例类型分配不兼容。
您可以为在集群队列中配置的每个计算资源覆盖 Amazon EC2 RunInstances
参数。为此,请在集群的头节点上创建包含以下代码片段内容的 /opt/slurm/etc/pcluster/run_instances_overrides.json
文件:
-
${queue_name}
是要对其应用覆盖的队列的名称。 -
${compute_resource_name}
是要对其应用覆盖的计算资源。 -
${overrides}
是包含用于队列和实例类型特定组合的RunInstances
覆盖列表的任意 JSON 对象。覆盖语法必须遵循与 run_instancesboto3 调用中记录的规范相同的规范。
{ "${queue_name}": { "${compute_resource_name}": { ${overrides} }, ... }, ... }
例如,以下 JSON 将 ODCR 组 group_arn
配置为用于 my-queue
和 my-compute-resource
中配置的 p4d.24xlarge
实例。
{
"my-queue"
: {"my-compute-resource"
: { "CapacityReservationSpecification": { "CapacityReservationTarget": { "CapacityReservationResourceGroupArn":"group_arn"
} } } } }
生成此 JSON 文件后,负责集群扩展的 AWS ParallelCluster 守护程序会自动使用覆盖配置启动实例。要确认实例预置是否使用了指定的参数,请查看以下日志文件:
-
/var/log/parallelcluster/clustermgtd
(对于静态容量) -
/var/log/parallelcluster/slurm_resume.log
(对于动态容量)
如果参数正确,您会发现包含以下内容的日志条目:
Found RunInstances parameters override. Launching instances with: <parameters_list>
警告
-
从 3.3.0 AWS ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。
-
此方法与 Slurm 的多实例类型分配不兼容。
-
创建资源组以对容量分组。
$
aws resource-groups create-group --name
EC2CRGroup
\ --configuration '{"Type":"AWS::EC2::CapacityReservationPool"}' '{"Type":"AWS::ResourceGroups::Generic", "Parameters": [{"Name": "allowed-resource-types", "Values": ["AWS::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 时,请将其添加到群组预留中。
替换为您的账户 ID、ACCOUNT_ID
容量预留 ID 和PLACEHOLDER_CAPACITY_RESERVATION
您的 AWS 区域 ID(例如 us-east-1)。REGION_ID
$
aws resource-groups group-resources --region
REGION_ID
--groupEC2CRGroup
\ --resource-arns arn:aws:ec2:REGION_ID
:ACCOUNT_ID
:capacity-reservation/PLACEHOLDER_CAPACITY_RESERVATION
在本地计算机中创建策略文档。
替换为您的账户 ID 和ACCOUNT_ID
AWS 区域 ID(例如 us-east-1)。REGION_ID
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 -
AWS 账户 使用您创建的 json 文件在您的上创建 IAM 策略。
$
aws iam create-policy --policy-name
RunInstancesCapacityReservation
--policy-document file://policy.json -
在实例上本地创建以下安装后脚本并将其命名为
postinstall.sh
。
替换为你的 AWS 账户 身份证和ACCOUNT_ID
你的 AWS 区域 身份证(例如 us-east-1)。REGION_ID
#!/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 -
创建本地集群配置,将占位符替换为您自己的值。
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
-
创建集群。
使用以下命令来创建集群。将
替换为您的配置文件名称,将cluster-config.yaml
替换为您的集群名称,并将cluster-dl
REGION_ID
替换为您的区域 ID(例如 us-east-1)。$
pcluster create-cluster --cluster-configuration
cluster-config.yaml
--cluster-namecluster-dl
--regionREGION_ID
创建集群后,安装后脚本将在头节点中运行。该脚本将会创建
run_instances_overrides.json
文件并覆盖对RunInstances
的调用,以将分区强制预置为完成按需容量预留。负责集群扩展的 AWS ParallelCluster 守护程序会自动将此配置用于启动的新实例。要确认是否将指定的参数用于预置实例,您可以查看以下日志文件:
-
/var/log/parallelcluster/clustermgtd
(对于静态容量 - MinCount> 0
) -
/var/log/parallelcluster/slurm_resume.log
(对于动态容量)
如果参数正确,您会发现包含以下内容的日志条目。
Found RunInstances parameters override. Launching instances with: <parameters_list>
-
更新 RunInstances
覆盖
您可以随时更新生成的 JSON 配置,而无需停止计算实例集。应用更改后,所有新实例都将使用更新的配置启动。如果您需要将更新的配置应用于正在运行的节点,请通过强制终止实例 AWS ParallelCluster 来回收节点,然后等待替换这些节点。为此,您可以从 Amazon EC2 控制台终止实例 AWS CLI,或者将Slurm节点设置为DOWN
或DRAIN
状态。
使用以下命令将 Slurm 节点设置为 DOWN
或 DRAIN
。
$
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