ODCR (オンデマンドキャパシティ予約) を使用してインスタンスを起動する - AWS ParallelCluster

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ODCR (オンデマンドキャパシティ予約) を使用してインスタンスを起動する

オンデマンドキャパシティ予約 (ODCR) は、特定のアベイラビリティーゾーンのクラスター Amazon EC2 インスタンスに対してキャパシティ予約を提供します。これにより、Savings Plans またはリージョンリザーブドインスタンスが提供する請求アカウントとは関係なく、キャパシティの予約を作成および管理できます。

open または targeted オンデマンドキャパシティ予約 (ODCR) を設定できます。オープン ODCR は、ODCR 属性に一致するすべてのインスタンスを対象としています。これらの属性はインスタンスタイプ、プラットフォーム、およびアベイラビリティーゾーンです。ターゲット ODCR はクラスター設定で明示的に定義する必要があります。ODCR が opentargeted かどうかを確認するには、AWS CLI EC2 describe-capacity-reservation コマンドを実行します。

クラスタープレイスメントグループオンデマンドキャパシティ予約 (CPG ODCR) と呼ばれるクラスタープレイスメントグループに ODCR を作成することもできます。

複数の ODCR を 1 つのリソースグループにまとめることができます。これはクラスター設定ファイルで定義できます。リソースグループの詳細については、「Resource Groups とタグのユーザーガイド」の「What are resource groups?」を参照してください。

AWS ParallelCluster で ODCR を使用する

AWS ParallelCluster はオープン ODCR をサポートします。オープン ODCR を使用する場合は、AWS ParallelCluster で何も指定する必要はありません。インスタンスはクラスター用に自動的に選択されます。既存のプレイスメントグループを選択するか、AWS ParallelCluster に新しいプレイスメントグループを作成させることができます。

クラスター設定の ODCR

AWS ParallelCluster バージョン 3.3.0 以降、クラスター設定ファイルで ODCR を定義できるようになり、EC2 実行インスタンスのオーバーライドを指定する必要がなくなりました。

まず、それぞれのリンク先のドキュメントで説明されている方法を使用して、キャパシティ予約リソースグループを作成します。AWS CLI メソッドを使用してキャパシティ予約グループを作成する必要があります。AWS Management Console を使用する場合、タグベースまたはスタックベースのリソースグループしか作成できません。キャパシティ予約でインスタンスを起動する場合、AWS ParallelCluster または AWS CLI では、タグベースおよびスタックベースのリソースグループはサポートされません。

キャパシティ予約とリソースグループを作成したら、以下のクラスター設定例に示すように、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
警告
  • AWS ParallelCluster バージョン 3.3.0 以降では、この方法はお勧めしません。このセクションは、以前のバージョンを使用した実装のリファレンスとして残しています。

  • このメソッドは Slurm による複数インスタンスタイプ割り当てとは互換性がありません。

targeted ODCRのサポートは AWS ParallelCluster 3.1.1 で追加されました。このリリースでは、EC2 の RunInstances パラメータをオーバーライドして、設定されている AWS ParallelCluster の各コンピューティングリソースに使用する予約に関する情報を渡すメカニズムが導入されました。このメカニズムは targeted ODCR と互換性があります。ただし、targeted ODCR を使用する場合は run-instances オーバーライド設定を指定する必要があります。ターゲット ODCR は AWS CLI EC2 run-instances コマンドで明示的に定義する必要があります。ODCR が opentargeted どうかを判断するには、AWS CLI EC2 describe-capacity-reservation コマンドを実行します。

複数の ODCR を 1 つのリソースグループにまとめることができます。これを実行インスタンスオーバーライドで使用すると、同時に複数の ODCR をターゲットにすることができます。

targeted ODCR を使用している場合は、プレイスメントグループを指定できます。ただし、run-instances オーバーライド設定も指定する必要があります。

AWS が targeted ODCR を作成したとします。または、特定のリザーブドインスタンスセットがあるとします。そうなると、プレイスメントグループを指定できなくなります。AWS によって設定されるルールは、プレイスメントグループの設定と競合する可能性があります。そのため、アプリケーションにプレイスメントグループが必要な場合は、CPG ODCR を使用してください。いずれの場合も、run-instances オーバーライド設定を指定する必要があります。

CPG ODCR を使用している場合は、run-instances オーバーライド設定を指定し、クラスター設定でも同じプレイスメントグループを指定する必要があります。

AWS ParallelCluster でのリザーブドインスタンスの使用

リザーブドインスタンスはキャパシティ予約 (ODCR) とは異なります。リザーブドインスタンスには 2 つのタイプがあります。リージョンのリザーブドインスタンスでは、キャパシティは予約されません。ゾーンのリザーブドインスタンスでは、指定されたアベイラビリティーゾーンでキャパシティが予約されます。

リージョンのリザーブドインスタンスがある場合、キャパシティが予約されず、容量不足エラーが発生する可能性があります。ゾーンのリザーブドインスタンスがある場合、キャパシティ予約はできますが、その指定に使用できる run-instances API パラメータはありません。

リザーブドインスタンスはどの AWS ParallelCluster バージョンでもサポートされています。AWS ParallelCluster では何も指定する必要はなく、インスタンスは自動的に選択されます。

ゾーンのリザーブドインスタンスを使用するときは、クラスター設定でプレイスメントグループの指定を省略することで、発生する可能性のある容量不足エラーを回避できます。

警告
  • AWS 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 は、my-queuemy-compute-resource で設定された p4d.24xlarge インスタンスに ODCR グループ group_arn を使用するように設定します。

{     "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>
警告
  • AWS ParallelCluster バージョン 3.3.0 以降では、この方法はお勧めしません。このセクションは、以前のバージョンを使用した実装のリファレンスとして残しています。

  • このメソッドは Slurm による複数のインスタンスタイプの割り当て と互換性がありません。

  1. リソースグループを作成し、容量をグループ化します。

    $ 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 を作成するたびに、それをグループ予約に追加します。ACCOUNT_ID はアカウント ID に、PLACEHOLDER_CAPACITY_RESERVATION はキャパシティ予約 ID に、REGION_ID は AWS リージョン 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 を AWS リージョン ID (us-west-2 など) に置き換えます。

    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 ファイルを使用して、AWS アカウント に IAM ポリシーを作成します。

    $ aws iam create-policy --policy-name RunInstancesCapacityReservation --policy-document file://policy.json
  3. 次のポストインストールスクリプトをインスタンス上でローカルに作成し、postinstall.sh という名前を付けます。

    ACCOUNT_ID をAWS アカウント ID に、REGION_ID を AWS リージョン 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 の呼び出しをオーバーライドして、パーティションのプロビジョニングがオンデマンドキャパシティ予約を経由するように強制します。

    クラスタースケーリングを担当する 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 がそれらのノードを置き換えるのを待ちます。そのためには、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