AWS ParallelCluster 3.4.0 でコンピュートノードのマルチ AZ 起動をサポートしました

「コンピュートノード」がマルチ AZ で起動できるようになりました。ヘッドノードは引き続き1台構成のままですのでご注意ください。
2023.01.11

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

2022年12月22日に AWS ParallelCluster 3.4.0 がリリースされました。v3.3.0 のリリースから約1か月強と早い間隔でのマイナーアップデートです。

注目のアップデート紹介

個人的な注目ポイントと、アップデートの目玉(っぽいもの)をピックアップしました。アップデート前後の違いについてはリリースノートの情報から把握するのは難しいためわかる範囲で補足します。

アップデート詳細はリリースノートをご確認ください。

コンピュートノードのマルチ AZ 対応

コンピュートノードのサブネット(AZ)を複数指定ができるようになり、マルチ AZ 構成でコンピュートノードを起動できます。 可用性や、耐障害性という意味のマルチ AZ 対応というよりは複数の AZ を利用することで計算リソース(EC2 インスタンス)を確保しやすい構成を取れるようになったアップデートと捉えています。

通常ジョブをサブミットするときにキューを指定します。

今回のアップデートでキューの設定で複数のサブネットを指定ができるようになりました。具体的にはクラスターのコンフィグでSubnetsIdsの箇所で複数のサブミット ID を指定できます。

config抜粋

  SlurmQueues:
    # ------ Compute 1 ------
    - Name: queue-1
      ComputeResources:
        - Name: multiaz-queue
          Instances:
            - InstanceType: c6i.large
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 35
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      AllocationStrategy: lowest-price
      Networking:
        SubnetIds:
          - subnet-035be95eeaa091603
          - subnet-0ba7369f9caba6f93

設定方法と注意事項

今回検証に利用したサブネットを2つ設定したキューがあるクラスターのサンプルコンフィグです。

config全文

Region: ap-northeast-1
Image:
  Os: ubuntu2004
Tags:
  - Key: Name
    Value: MultiAZ-Cluster
# ----------------------------------------------------------------
# Head Node Settings
# ----------------------------------------------------------------
HeadNode:
  InstanceType: t3.micro
  Networking:
    ElasticIp: false
    SubnetId: subnet-035be95eeaa091603
  Ssh:
    KeyName: sandbox-key
  LocalStorage:
    RootVolume:
      Size: 35
      Encrypted: true
      VolumeType: gp3
      Iops: 3000
      Throughput: 125
  Iam:
    AdditionalIamPolicies:
      - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
    S3Access:
      - BucketName: hpc-dev-postinstall-files
        EnableWriteAccess: false
# ----------------------------------------------------------------
# Compute Node Settings
# ----------------------------------------------------------------
Scheduling:
  Scheduler: slurm
  SlurmSettings:
    ScaledownIdletime: 5
  SlurmQueues:
    # ------ Compute 1 ------
    - Name: queue-1
      ComputeResources:
        - Name: multiaz-queue
          Instances:
            - InstanceType: c6i.large
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 35
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      AllocationStrategy: lowest-price
      Networking:
        SubnetIds:
          - subnet-035be95eeaa091603
          - subnet-0ba7369f9caba6f93
        # PlacementGroup:
        #  Enabled: true
      # CustomActions:
      #   OnNodeConfigured:
      #     Script: s3://hpc-dev-postinstall-files/sample-ubuntu-docker/postinstall.sh
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        S3Access:
          - BucketName: hpc-dev-postinstall-files
            EnableWriteAccess: false

# ----------------------------------------------------------------
# Shared Storage Settings
# ----------------------------------------------------------------
# SharedStorage:
#   - MountDir: /mnt/efs-1zone
#     Name: efs-1zone
#     StorageType: Efs
#     EfsSettings:
#       FileSystemId: fs-0f1158ade79354809
# ----------------------------------------------------------------
#  Other Settings
# ----------------------------------------------------------------
Monitoring:
  Logs:
    CloudWatch:
      Enabled: true
      RetentionInDays: 30
      DeletionPolicy: "Delete"
  Dashboards:
    CloudWatch:
      Enabled: false

マルチ AZ 設定時の注意事項

設定時の注意事項です。ドキュメントに記載があった点と、見逃していたか見つけられなかったでクラスター作成時にわかったことをまとめます。

ドキュメントより

  • マルチ AZ 指定するときはComputeResources:Instances指定が必須
    • Instances指定は v3.3.0で追加になった設定項目です
  • サブネット設定は同一の AZ を複数する指定はできない
  • サブネットは異なる AZ を指定する必要がある

Scheduling section - AWS ParallelCluster

クラスターを作成してわかったこと

  • プレイスメントグループは有効化できない
    • 現状 ParallelCluster でのプレイスメントグループ有効はクラスタープレイスメントグループのみしか選択できないためと思われる
  • One Zone EFS はマウントできない

バリデーションエラー内容

{
  "configurationValidationErrors": [
    {
      "level": "ERROR",
      "type": "MultiAzPlacementGroupValidator",
      "message": "You have enabled PlacementGroups for the 'multiaz-queue' Compute Resource on the 'queue-1' queue. PlacementGroups are not supported across Availability zones. Either remove the PlacementGroup configuration to use multiple subnets on the queue or specify only one subnet to use a PlacementGroup for compute resources."
    },
    {
      "level": "ERROR",
      "type": "EfsIdValidator",
      "message": "Cluster has subnets located in different availability zones but EFS (fs-0f1158ade79354809) uses OneZone EFS storage class which works within a single Availability Zone. Please use subnets located in one Availability Zone or use a standard storage class EFS."
    },
    {
      "level": "INFO",
      "type": "MultiAzRootVolumeValidator",
      "message": "Your configuration for Queues 'queue-1' includes multiple subnets different from where HeadNode is located. Accessing a shared storage from different AZs can lead to increased storage network latency and inter-AZ data transfer costs."
    }
  ],
  "message": "Invalid cluster configuration."
}

ヘッドノードはマルチ AZ 非対応

ジョブスケジュラーのヘッドノードはマルチ AZ 構成非対応であり、コンピュートノードのみがマルチ AZ 対応です。

必ずしもマルチ AZ にする必要はない

MPI を利用してコンピュートノード上のメモリ間でデータ転送が頻繁に行われる場合ですとレイテンシーが悪くなるため同一 AZ に比べると不利です。仮に同一 AZ でコンピュートノードが起動してきもてプレイスメントグループを有効化できない仕様のためなおさら不利になります。

実際にジョブをサブミットしたところ同じ AZ で複数台起動しました。プレイスメントグループ(クラスタープレイスメント)が有効ではないためマルチ AZ 指定していない従来のキューと比べるとコンピュートノード間のレイテンシーは劣ります。

スポット単価優先の設定にしていたため同一 AZ で起動してきたのかと思ったのですが価格は同じでした。

FSx for Lustre の様なシングル AZ にしか ENI が作成されないストレージを利用する場合も同様です。レイテンシーが悪くなります。また AZ またぎで ENI(= FSx for Lustre)へアクセスする場合はデータ転送量で課金が発生することを認識しておいた方がよいです。

おわりに

プレイスメントグループについては ParallelCluster でプレイスメントグループを有効化すると自動的にクラスタープレイスメントグループが設定されます。複数 AZ 指定でプレイスメントグループ使えないのは仕様ですのでクラスターのコンフィグで無効化しておく必要がありました。

コンピュートノードだけではなくヘッドノードがマルチ AZ 対応になってくれると嬉しいので今後のアップデートに期待しています。

参考