AWS ParallelCluster ジョブをサブミット後にスポットインスタンスが起動してこない原因と対処方法 – サービスクォータ編

2024.02.12

AWS ParallelCluster のクラスター環境を作成して、はじめてジョブを投げたあとにコンピュートノードが起動してこなかった経験はないでしょうか?私は数えきれないほどあるのですが AWS 特有の設定漏れによる凡ミスで失敗したときの事例を紹介します。

  • 新規に発行した AWS アカウントまたは、普段使わないリージョンでクラスター環境を構築
  • ジョブをサブミットするとスポットインスタンスのコンピュートノードが起動しない
  • squeue コマンドから確認すると Status(ST)が Pending(PD)表示
$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                29    queue1  echo.sh   ubuntu PD       0:00     50 (BeginTime)

原因と対処方法早見

スポットインスタンスのサービスクォータの値を確認してください。

All Standard(A,C,D,H,I,M,R,T,Z)Spot Instance Requestsのサービスクォータを確認します。起動予定のスポットインスタンスの合計 vCPU 数が「適用されたクォータ値」を超えていないか確認してください。

この例ですと現在値は 32 です。これですと 32vCPU のスポットインスタンス 1 台しか起動できないことになります。

必要に応じて制限値を引き上げるリクエストを行ってください。

これ以外の場合は他の原因が考えられますので本記事では取り扱いません。ヘッドノードの/var/log/parallelcluster配下のログを確認するなどして切り分けしてください。

状況

新規発行の AWS アカウントに AWS ParallelCluster のクラスター環境を構築しました。

項目 バージョン
AWS ParallelCluster 3.8.0
OS Ubuntu 22.04 LTS
CPU Arch Intel(x86_64)
Head node t3.micro

切り分け

EC2 の起動状況

コンピュートノードの EC2 がまったく起動しないため、マネージメントコンソールの EC2 の画面からはヘッドノードの起動しか確認できません。

Slrum コマンドから確認

squeueコマンドで確認すると以下の結果でした。

Status(ST)が Pending(PD)表示になっています。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                29    queue1  echo.sh   ubuntu PD       0:00     50 (BeginTime)

sinfoコマンドで詳細を確認しすると以下のメッセージを確認できました。

Code:InsufficientIn...メッセージが見切れていますね。Slurm のログを確認してみましょう。

$ sinfo -Rl
Tue Feb 06 02:12:12 2024
REASON               USER         TIMESTAMP           STATE  NODELIST
(Code:InsufficientIn root(0)      2024-02-06T02:11:29 down#  queue1-dy-queue1-[4-10]
(Code:InsufficientIn root(0)      2024-02-06T02:12:04 down~  queue1-dy-queue1-[11-20]

Slurm のログ確認

ヘッドノードから Slurm のログを確認します。

パス: /var/log/parallelcluster/slurm_resume.log

以下のメッセージを確認しました。スポットインスタンスのキャパシティ不足とのことです。

2024-02-06 02:26:01,972 - 2497 - [slurm_plugin.fleet_manager:_launch_instances] - WARNING - JobID 28 - Error in CreateFleet request (0b46f287-937d-4d16-9187-bb7e76d5b647): InsufficientInstanceCapacity - There is no Spot capacity available that matches your request.

スポットインスタンスのキャパシティ不足なら時間を置いて改めて起動を試すしかありません。念のため CloudTrail のログも確認してみましょう。

CloudTrail のログ確認

ジョブをサブミットした時間帯に以下のイベント 2 つを確認できました。根本的な原因の特定に繋がるメッセージは以下でした。

errMessageMax spot instance count exceededは、現在のクォータで許可されているよりも多くのスポットインスタンスを起動を要求した場合に発生します。

項目
イベント名 RunInstances
イベントソース ec2.amazonaws.com
エラーコード Client.MaxSpotInstanceCountExceeded
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROATXZ233RSPURJZWO2J:i-0e7dec03d739b8301",
        "arn": "arn:aws:sts::123456789012:assumed-role/v380-RoleHeadNode-SAjUEgcnuI2G/i-0e7dec03d739b8301",
        "accountId": "123456789012",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROATXZ233RSPURJZWO2J",
                "arn": "arn:aws:iam::123456789012:role/parallelcluster/v380/v380-RoleHeadNode-SAjUEgcnuI2G",
                "accountId": "123456789012",
                "userName": "v380-RoleHeadNode-SAjUEgcnuI2G"
            },
            "attributes": {
                "creationDate": "2024-02-06T02:04:33Z",
                "mfaAuthenticated": "false"
            },
            "ec2RoleDelivery": "2.0"
        },
        "invokedBy": "ec2fleet.amazonaws.com"
    },
    "eventTime": "2024-02-06T02:11:26Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "RunInstances",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "ec2fleet.amazonaws.com",
    "userAgent": "ec2fleet.amazonaws.com",
    "errorCode": "Client.MaxSpotInstanceCountExceeded",
    "errorMessage": "Max spot instance count exceeded",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "minCount": 1,
                    "maxCount": 3
                }
            ]
        },
        "instanceType": "m7i.8xlarge",
        "blockDeviceMapping": {},
        "availabilityZone": "ap-northeast-1a",
        "monitoring": {
            "enabled": false
        },
        "disableApiTermination": false,
        "disableApiStop": false,
        "clientToken": "fleet-441f3e0d-2b07-6c9c-2e10-27a0351d37f1-0",
        "networkInterfaceSet": {
            "items": [
                {
                    "deviceIndex": 0,
                    "subnetId": "subnet-0c82bb28e119e2aa8"
                }
            ]
        },
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "instance",
                    "tags": [
                        {
                            "key": "aws:ec2:fleet-id",
                            "value": "fleet-441f3e0d-2b07-6c9c-2e10-27a0351d37f1"
                        }
                    ]
                }
            ]
        },
        "launchTemplate": {
            "launchTemplateId": "lt-09a8648cce0c88b46",
            "version": "1"
        },
        "instanceMarketOptions": {
            "marketType": "spot",
            "spotOptions": {
                "spotInstanceType": "one-time"
            }
        }
    },
    "responseElements": null,
    "requestID": "12fd4aee-ee5b-4830-a524-908a30a85064",
    "eventID": "e55fd6a1-66b2-4676-b7ad-05af90b11ac6",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
}

errMessageに Slurm で確認したメッセージと同じメッセージを確認できました。

項目
イベント名 RunInstances
イベントソース ec2.amazonaws.com
エラーコード Server.InsufficientInstanceCapacity
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROATXZ233RSPURJZWO2J:i-0e7dec03d739b8301",
        "arn": "arn:aws:sts::123456789012:assumed-role/v380-RoleHeadNode-SAjUEgcnuI2G/i-0e7dec03d739b8301",
        "accountId": "123456789012",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROATXZ233RSPURJZWO2J",
                "arn": "arn:aws:iam::123456789012:role/parallelcluster/v380/v380-RoleHeadNode-SAjUEgcnuI2G",
                "accountId": "123456789012",
                "userName": "v380-RoleHeadNode-SAjUEgcnuI2G"
            },
            "attributes": {
                "creationDate": "2024-02-06T02:04:33Z",
                "mfaAuthenticated": "false"
            },
            "ec2RoleDelivery": "2.0"
        },
        "invokedBy": "ec2fleet.amazonaws.com"
    },
    "eventTime": "2024-02-06T02:11:27Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "RunInstances",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "ec2fleet.amazonaws.com",
    "userAgent": "ec2fleet.amazonaws.com",
    "errorCode": "Server.InsufficientInstanceCapacity",
    "errorMessage": "There is no Spot capacity available that matches your request.",
    "requestParameters": {
        "instancesSet": {
            "items": [
                {
                    "minCount": 1,
                    "maxCount": 1
                }
            ]
        },
        "instanceType": "m7a.4xlarge",
        "blockDeviceMapping": {},
        "availabilityZone": "ap-northeast-1a",
        "monitoring": {
            "enabled": false
        },
        "disableApiTermination": false,
        "disableApiStop": false,
        "clientToken": "fleet-441f3e0d-2b07-6c9c-2e10-27a0351d37f1-1",
        "networkInterfaceSet": {
            "items": [
                {
                    "deviceIndex": 0,
                    "subnetId": "subnet-0c82bb28e119e2aa8"
                }
            ]
        },
        "tagSpecificationSet": {
            "items": [
                {
                    "resourceType": "instance",
                    "tags": [
                        {
                            "key": "aws:ec2:fleet-id",
                            "value": "fleet-441f3e0d-2b07-6c9c-2e10-27a0351d37f1"
                        }
                    ]
                }
            ]
        },
        "launchTemplate": {
            "launchTemplateId": "lt-09a8648cce0c88b46",
            "version": "1"
        },
        "instanceMarketOptions": {
            "marketType": "spot",
            "spotOptions": {
                "spotInstanceType": "one-time"
            }
        }
    },
    "responseElements": null,
    "requestID": "054112b1-7866-4804-b820-0fc50f969f54",
    "eventID": "755a5d32-1da3-45d5-8f26-00b140eb872d",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
}

原因と対処方法

原因

スポットインスタンスを同時実行可能な vCPU数の制限値を上回る vCPU数のリクエストを行った。

この制限はスポットインスタンスのサービスクォータで管理されています。

Spot Instance クォータ - Amazon Elastic Compute Cloud

対処

スポットインスタンスのサービスクォータを引き上げるリクエストをします。

サービスクォータの現在値を確認

All Standard(A,C,D,H,I,M,R,T,Z)Spot Instance Requestsのサービスクォータを確認します。現在地は 32 でした。これですと 32vCPU のインスタンス 1 台でしか起動できません。

サービスクォータの上限緩和リクエスト

今回は 100vCPU 以上使う予定があったため、制限値を 160 まで引き上げるリクエストを行いました。

サービスクォータの上限緩和リクエスト承認後

しばらく待つと AWS 側の承認が終わり、リクエストした 160vCPU までスポットインスタンスを同時起動できるようになりました。

スポットインスタンス起動確認

インスタンス終了後のキャプチャしかなく恐縮ですがスポットインスタンスを起動できるようになりました。

おわりに

スポットインスタンス起動時にサービスクォータの制限値によって、コンピュートノードが起動できない場合の確認ポイントをまとめました。新しい AWS アカウントや、普段使わないリージョンで ParallelCluster を使うときはよく見るエラーではないでしょうか。この記事がどなたかのお役にたてば幸いです。

参考