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 つを確認できました。根本的な原因の特定に繋がるメッセージは以下でした。
errMessage
のMax 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 を使うときはよく見るエラーではないでしょうか。この記事がどなたかのお役にたてば幸いです。