AWS ParallelCluster 既存クラスターを pcluster update-cluster コマンドで設定を変更する手順

2022.06.07

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

AWS ParallelCluster 3 のアップデートが許可されている設定項目を変更し、既存のクラスターに対して設定を反映させるための作業手順を紹介します。

本検証にあったては以下のクラスターを元に動作確認を行いました。

項目
ParallelCluster 3.1.4
OS Ubuntu 20.04
CPU Intel
HeadNode t3.micro

ParallelCluster アップデート方法まとめ

変更対象のクラスター名を確認。

pcluster list-clusters | jq -r '.clusters[] | [.clusterName,.version,.region] | @tsv'

クラスター名を変数に入れる。

CLUSTER_NAME=hoge

コンピュートフリートを停止しSTOPPED表示を確認する。

pcluster update-compute-fleet --cluster-name ${CLUSTER_NAME} --status STOP_REQUESTED
while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .computeFleetStatus;sleep 3; done

コンフィグファイルを指定してクラスターをアップデートしUPDATE_COMPLETE表示を確認する。

pcluster update-cluster --cluster-name ${CLUSTER_NAME} \
                        --cluster-configuration cluster-slumdb.yml
while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .clusterStatus; sleep 3; done

コンピュートフリートを開始しRUNNING表示を確認する。

pcluster update-compute-fleet --cluster-name ${CLUSTER_NAME} --status START_REQUESTED
while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .computeFleetStatus;sleep 3; done

前提知識

クラスターの設定変更する前にコンピュートフリートを停止の状態にする必要があります。コンピュートフリートの停止はヘッドノード(EC2 インスタンス)を停止することではありません。

コンピュートフリートとは

コンピュートフリートとはコンピュートノードの集まりのことを指しています。ParallelCluster で登場する EC2 インスタンスは大きく分けるとヘッドノードと、コンピュートノードの2種類あります。

ヘッドノードはジョブ管理をする EC2 インスタンスです。ユーザーからのジョブを受け付け計算リソースへ適切な割当を行いクラスターの管理をするのが役割です。

コンピュートノードは計算処理を実行する EC2 インスタンスです。ジョブスケジューラーにジョブがサブミットされるとヘッドノードからの指示で自動的に起動し計算処理を行い、計算が終わると終了(削除)されるインスタンス達です。

クラスターの設定変更する条件としてコンピュートノード達(コンピュートフリート)を利用できない状態にする必要があります。クラスターの設定変更でクラスター自体に処理更新かけている最中に計算処理を実行できないようになどの理由があるものかと思われます。

ParallelCluster 設定変更手順

前提事項として変更対象のクラスターのヘッドノードが起動している必要があります。ヘッドノードの停止状態だとこの先実行するコンピュートフリートの停止・開始コマンドが処理されません。

クラスター名の確認

更新対象のクラスター名を確認します。pcluster list-clustersコマンドで名前を確認します。クラスターが複数台あるときは対象を誤らないように注意してください。

pcluster list-clusters | jq -r '.clusters[] | [.clusterName,.version,.region] | @tsv'

今回は例としてクラスター名 test-slumdb-cluster の設定を変更しクラスターの更新かけます。

出力結果

test-centos-cluster	3.1.4	ap-northeast-1
test-slumdb-cluster	3.1.4	ap-northeast-1

この先、クラスター名の指定が頻出するため変数に入れます。

CLUSTER_NAME=test-slumdb-cluster

補足 コンピュートフリートの状態

クラスターを起動すると通常コンピュートフリートは RUNNING 状態です。

pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .computeFleetStatus

出力結果

RUNNING

ちなみにコンピュートフリートの状態は DynamoDB で管理されています。

コンピュートフリートの停止

コンピュートフリートの状態を停止に変更するコマンドを実行します。

pcluster update-compute-fleet --cluster-name ${CLUSTER_NAME} --status STOP_REQUESTED

実行結果

{
  "status": "STOP_REQUESTED",
  "lastStatusUpdatedTime": "2022-06-07T00:08:46.231Z"
}

コンピュートフリートの状態が STOP_REQUESTED から STOPPED になるのを待ちます。10秒も掛からずに状態が変わるはずです。

while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .computeFleetStatus;sleep 3; done

STOPPED の表示を確認できればコンピュートフリート停止作業の完了です。

実行結果

STOP_REQUESTED
STOP_REQUESTED
STOP_REQUESTED
STOPPED

これでクラスターの設定変更が可能な状態になりました。

補足 ヘッドノードからコンピュートノードを確認

コンピュートフリートを停止状態でヘッドノードから Slurm パーティションの状態を確認します。 inact と表示され、コンピュートノードが利用できない状態になっています。通常は up と表示されます。

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*    inact   infinite     10  idle~ debug-dy-debug-[1-10]
large     inact   infinite     10  idle~ large-dy-large-[1-10]

クラスターの設定変更(アップデート)

設定変更したコンフィグを引数にしてpclsuter update-clusterコマンドを実行します。今回指定した ParallelCluster のコンフィグファイル名はcluster-sludb.ymlです。

pcluster update-cluster --cluster-name ${CLUSTER_NAME} \
                        --cluster-configuration cluster-slumdb.yml

ParallelCluster のクラスターは CDK(Cloudformation)で管理されておりチェンジセットの結果が返ってきます。設定の変更内容は長いため折りたたみました。今回は新しいパーテションを追加したコンフィグで更新かけています。

折りたたみ

実行結果

{
  "cluster": {
    "clusterName": "test-slumdb-cluster",
    "cloudformationStackStatus": "UPDATE_IN_PROGRESS",
    "cloudformationStackArn": "arn:aws:cloudformation:ap-northeast-1:0123456789012:stack/test-slumdb-cluster/142d3320-de71-11ec-96f0-0e9102632057",
    "region": "ap-northeast-1",
    "version": "3.1.4",
    "clusterStatus": "UPDATE_IN_PROGRESS"
  },
  "changeSet": [
    {
      "parameter": "Scheduling.SlurmQueues",
      "requestedValue": {
        "Name": "large2",
        "ComputeResources": [
          {
            "Name": "large",
            "InstanceType": "c6i.large",
            "MinCount": 0,
            "MaxCount": 10,
            "DisableSimultaneousMultithreading": true
          }
        ],
        "ComputeSettings": {
          "LocalStorage": {
            "RootVolume": {
              "Size": 35,
              "Encrypted": false,
              "VolumeType": "gp3",
              "Iops": 3000,
              "Throughput": 125
            }
          }
        },
        "CapacityType": "SPOT",
        "Networking": {
          "SubnetIds": [
            "subnet-035be95eeaa091603"
          ],
          "PlacementGroup": {
            "Enabled": true
          }
        },
        "Iam": {
          "S3Access": [
            {
              "BucketName": "hpc-dev-postinstall-files",
              "EnableWriteAccess": false
            }
          ],
          "AdditionalIamPolicies": [
            {
              "Policy": "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
            }
          ]
        }
      }
    }
  ]
}

クラスターの状態が UPDATE_IN_PROGRESS から UPDATE_COMPLETE になるのを待ちます。待ち時間は変更内容に依りますが5〜10分程度はみておきましょう。

while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .clusterStatus; sleep 3; done

UPDATE_COMPLETE の表示を確認できればクラスター設定更新の完了です。

実行結果

UPDATE_IN_PROGRESS
UPDATE_IN_PROGRESS
UPDATE_IN_PROGRESS
UPDATE_COMPLETE

これでクラスターの設定変更が完了しました。

コンピュートフリートの開始

コンピュートフリートの状態を開始に変更するコマンドを実行します。

pcluster update-compute-fleet --cluster-name ${CLUSTER_NAME} --status START_REQUESTED

実行結果

{
  "status": "START_REQUESTED",
  "lastStatusUpdatedTime": "2022-06-07T00:44:35.409Z"
}

コンピュートフリートの状態が START_REQUESTED から RUNNING になるのを待ちます。10秒も掛からずに状態が変わるはずです。

while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .computeFleetStatus;sleep 3; done

RUNNING の表示を確認できればコンピュートフリート開始作業の完了です。

実行結果

START_REQUESTED
START_REQUESTED
START_REQUESTED
RUNNING

補足 ヘッドノードからコンピュートノードを確認

ヘッドノードから Slurm パーティションの状態を確認すると up と表示され、コンピュートノードが利用可能な状態に戻りました。

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ debug-dy-debug-[1-10]
large        up   infinite     10  idle~ large-dy-large-[1-10]
large2       up   infinite     10  idle~ large2-dy-large-[1-10]

クラスター設定変更の結果確認

今回は新しいパーティション(large2)を追加する更新を行いました。sinfoコマンドで確認するとlarge2というパーティションを確認できました。

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ debug-dy-debug-[1-10]
large        up   infinite     10  idle~ large-dy-large-[1-10]
large2       up   infinite     10  idle~ large2-dy-large-[1-10]

既存のクラスターに追加した設定ファイルの内容を反映することができました。

まとめ

ParallelCluster のクラスターの設定を変更するには以下のステップを踏みます。

  1. コンピュートフリートを停止
  2. クラスターのアップデートを実行
  3. コンピュートフリートを開始(元の状態に戻す)

おわりに

クラスターにはアップデートできる設定項目、できない設定項目があります。アップデートを計画する前にアップデートできる設定項目を先にご確認ください。

Configuration files - AWS ParallelCluster

各設定項目ごとにアップデートポリシーが明記されています。

参考