本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用按需容量预留(ODCR)启动实例
通过按需容量预留 (ODCR),您可以在特定可用区为集群 Amazon EC2 实例预留容量。通过这种方式,您可以独立于由节省计划
您可以配置open
或targeted
ODCR。开放式 ODCR 涵盖与 ODCR 属性匹配的所有实例。这些属性包括实例类型、平台和可用区。您必须在集群配置中显式定义定向 ODCR。要确定 ODC open
R 是还是targeted
,请运行 AWS CLI
Amazon EC2 describe-capacity-reservation
命令。
您还可以在集群置放群组中创建 ODCR,称为集群置放群组按需容量预留 (CPG ODCR)。
ODCRs 可以将多个资源分组到一个资源组中。这可以在集群配置文件中定义。有关资源组的更多信息,请参阅 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 开始,您可以在集群配置文件 ODCRs 中进行定义,而无需指定 Amazon EC2 运行实例替代。
您首先使用各自链接文档中描述的方法创建容量预留和资源组。您必须使用这些 AWS CLI 方法来创建容量预留组。如果您使用 AWS Management Console,则只能创建基于标签或基于堆栈的资源组。启动带有容量预留的实例 AWS CLI 时, AWS ParallelCluster 或不支持基于标签和基于堆栈的资源组。
创建容量预留和资源组后,在 SlurmQueues/CapacityReservationTarget 或 SlurmQueues/ComputeResources/CapacityReservationTarget 中指定它们,如以下集群配置示例所示。用您的有效值替换以红色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 AWS ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。
-
此方法与 Slurm 的多实例类型分配不兼容。
AWS ParallelCluster 3.1.1 中增加了targeted
ODCRs 对 Support 的支持。在此版本中,引入了一种机制,该机制可以覆盖 EC2RunInstances
参数并传递有关预留的信息,以用于中 AWS ParallelCluster配置的每个计算资源。该机制与targeted
ODCR 兼容。但在使用targeted
ODCR 时,必须指定 run-instances
覆盖配置。 ODCRs 必须在 AWS CLI Amazon EC2 run-instances
命令中明确定义@@ 目标。要确定 ODCR 是open
还是targeted
运行 AWS CLI Amazon EC2 命令describe-capacity-reservation
。
ODCRs 可以将多个资源分组到一个资源组中。这可以用在运行实例覆盖中,以同时定位多个 ODCRs 实例。
如果您使用的是 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 存储桶。
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 -
创建本地集群配置,将占位符替换为您自己的值。
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
-
创建集群。
使用以下命令来创建集群。
替换为配置文件名、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