AWS ParallelClusterのコンピュートノード最小起動数設定

AWS ParallelClusterのv2.7とv2.8.1でのmaintain_initial_sizeパラメータ設定変更時の動作確認と、エラー対応方法
2020.10.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS ParallelClusterのコンピュートノードの最小起動数設定

  • maintain_initial_sizeの設定検証
  • 検証対象のParallelClusterのバージョンはv2.7とv2.8.1
  • 最小起動数0から最小起動数2に変更した際のv2.7のエラー対応方法

[cluster] section - AWS ParallelCluster

コンピュートノードの増減

本題に入る前にコンピュートノードのスケールイン・アウトを簡単に説明します。

よくあるParallelClusterの利用方法

ヘッドノードにSSH接続してジョブをジョブスケジューラに登録します。

ジョブスケジューラがジョブを管理し、ジョブを処理するのに必要な数のコンピュートノード(インスタンス)を起動してジョブを処理させます。

処理するジョブがなければコンピュートノードを削除してヘッドノードのみ起動している最初の状態に戻ります。

コンピュートノードを常時起動

演算処理提供するサービスなどでParallelClusterを利用する場合、ジョブ登録後すぐに演算したいといった要望もあります。通常、素の状態のコンピュートノードで起動までに約10分かかります。ブートストラップの処理を追加すると起動時間は更に長くなります。

コンピュートノードを都度起動させるのではなく一定台数のインスタンスを常時起動し待機させることもできます。

もちろんジョブが増えるとコンピュートノードをスケールアウトして処理できます。

処理するジョブがなくても最低起動数以下にはスケールインしません。

検証内容

「よくあるParallelClusterの利用方法」の状態から「コンピュートノードを常時起動」に設定を切り替えを行います。そのときに出くわしたエラーと対応方法を残します。

検証環境構成

項目
OS Amazon Linux2
ジョブスケジューラ Slurm
ParallelClusterバージョン 2.7 と 2.8.1

検証用コンフィグ

構築する環境に合わせて適時変更してください。とくに下記の項目は環境に依存します。

  • aws_region_name
  • key_name
  • vpc_id
  • master_subnet_id
  • compute_subnet_id

tagsはParallelClusterのバージョン合わせてNameタグのみ変更し2つのバージョンで検証しました。

v27-config

[aws]
aws_region_name = ap-northeast-1

[global]
cluster_template = default
update_check = true
sanity_check = true

[aliases]
ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}

[cluster default]
key_name = sandbox-key
base_os = alinux2
scheduler = slurm
vpc_settings = custom

# Instance Type
master_instance_type = m5.large
compute_instance_type = c5.large

# Use Spot Instance
cluster_type = spot

# Use Placemant Group
placement = compute
placement_group = DYNAMIC

# Cluster Size
maintain_initial_size = false
initial_queue_size = 0
max_queue_size = 4

# Enable CloudWatchLogs
cw_log_settings = cluster_log

# Tag
tags = { "Name" : "Cluster-v27" }

[vpc custom]
# VPC Setting
vpc_id = vpc-04dcdf74763d5c39d
master_subnet_id = subnet-04c8f3243a402645c
compute_subnet_id = subnet-03e507e27d135a555
use_public_ips = true

[cw_log cluster_log]
# CloudWatchLogs Setting
enable = true
retention_days = 7

クラスター作成

pcluster create [cluster-name] -c [config]コマンドで構築します。ParallelClusterのバージョンはvenvで切り替えてクラスターを作成しています。

ParallelCluster v2.8.1の作成

> pcluster create cluster-v28 -c v28-config
Beginning cluster creation for cluster: cluster-v28
Info: There is a newer version 2.9.1 of AWS ParallelCluster available.
Creating stack named: parallelcluster-cluster-v28
Status: parallelcluster-cluster-v28 - CREATE_COMPLETE
MasterPublicIP: 54.168.49.154
ClusterUser: ec2-user
MasterPrivateIP: 10.1.10.130

ParallelCluster v2.7の作成

> pcluster create cluster-v27 -c v27-config
Beginning cluster creation for cluster: cluster-v27
Info: There is a newer version 2.9.1 of AWS ParallelCluster available.
Creating stack named: parallelcluster-cluster-v27
Status: parallelcluster-cluster-v27 - CREATE_COMPLETE
MasterPublicIP: 54.178.19.101
ClusterUser: ec2-user
MasterPrivateIP: 10.1.10.252

AutoScalingGroupの状態

ParallelClusterののスケールアウト・インは内部的にはAutoScalingGruopで管理されています。AutoScalingGroupを確認することでParallelClusterの裏の動きを把握できます。

クラスターの設定変更

設定ファイルを編集しpcluster update [cluster-name] -c [config]コマンドで更新します。

設定ファイル編集箇所

コンピュートノード2台常時起動するべく以下の2箇所変更しました。

# Cluster Size
maintain_initial_size = true
initial_queue_size = 2
max_queue_size = 4

ParallelCluster v2.8.1の更新

v2.8.1では設定ファイル内でタグを指定の記述を書くと--forceをオプションを指定しないとupdateをかけられません。設定変更箇所の差分を検出して実行前に確認できます。タグ指定は差分検出ができなく毎回表示されてしまいます。

> pcluster update cluster-v28 -c v28-config --force
Validating configuration file v28-config...
Retrieving configuration from CloudFormation for cluster cluster-v28...
WARNING: Forced update applied. All safety checks will be skipped. Not all updates may be applied and your cluster may become unstable.
Found Configuration Changes:

#    parameter              old value    new value
---  ---------------------  -----------  -----------------------
     [cluster default]
01   initial_queue_size     -            2
02   maintain_initial_size  -            True
03   tags                   -            {'Name': 'Cluster-v28'}
Do you want to proceed with the update? - Y/N: y
Updating: cluster-v28
Calling update_stack
Status: parallelcluster-cluster-v28 - UPDATE_COMPLETE

なにごともなく正常に設定が反映されます。

AutoScalingGroupの状態

EC2の状態

常時2台のコンピュートノードが起動しています。

ParallelCluster v2.7の更新

同様にupdateをかけます。UPDATE_ROLLBACK_IN_PROGRESSで失敗します。

> pcluster update cluster-v27 -c v27-config
Updating: cluster-v27
Calling update_stack
Status: parallelcluster-cluster-v27 - UPDATE_ROLLBACK_IN_PROGRESS

原因切り分け

CloudFormationのイベントログから原因を切り分けます。

Desired capacity:0 must be between the specified min size:2 and max size:4 (Service: AmazonAutoScaling; Status Code: 400; Error Code: ValidationError; Request ID: c5e94df6-af90-41cf-a62c-ec479a18e885; Proxy: null)

Desired capacityが0だから最小数2に変更できないと...

エラー対応

AutoScalingGroupのDesired capacityを手動で変更して回避します。

希望する容量が0のところを

2に変更しました。

こうなります。

再度、updateコマンドを打つとUPDATE_COMPLETEで成功します。

> pcluster update cluster-v27 -c v27-config
Updating: cluster-v27
Calling update_stack
Status: parallelcluster-cluster-v27 - UPDATE_COMPLETE

AutoScalingGroupの状態

AutoScalingGroupは最終的にv2.8.1の結果と同じになります。

EC2の状態

v2.8.1同様に2台のコンピュートノードが常時起動します。

おわりに

v2.7のParallelClusterの設定変更時に調査しv2.8.1の結果も踏まえまとめました。ParallelCluster 2.7お使いでAutoScalingの動作に困った方の参考になれば幸いです。

ちなみにv2.9ではAutoScalingGroupは使われなくなりました。