AWS ParallelCluster で M7i / M7a インスタンスは利用可能なのか確認してみた

AWS ParallelClusterはM7i/M7aインスタンスタイプの起動をサポートしています。インスタンスストア付きのインスタンスタイプは未提供のため、シングルノードでスクラッチ領域を利用するHPCワークロードの場合は最新世代のインスタンスタイプの利用はお預けです。
2024.02.06

東京リージョンで「M7i」「M7i-flex」「M7a」「R7a」が利用可能になりました。AWS ParallelCluster でこれら最新のインスタンスタイプの Intel CPU, AMD CPU を利用できるのか確認してみました。

確認結果

実行環境は AWS ParallelCluster 3.8 で確認しています。

  • AWS ParallelCluster は M7i と M7a インスタンスタイプの起動に対応していた
  • M7a インスタンスタイプはマルチレディングを無効化してもコア数に変化はなくコスパ良好である
  • M7i / M7a インスタンスタイプともにインスタンスストア付きのdタイプは未提供(2024/2/6 現在)

スポットインスタンスを活用していく

最近の世代のインスタンスタイプは前世代と比べると最新 CPU により性能が向上しますが、オンデマンド利用費も高く設定される傾向にあります。一般的には費用対効果を見て採用を検討することにならいます。ですが、ParallelCluster で計算リソースとして利用する場合は積極的にスポットインスタンスを活用していきたいところです。なぜなら、登場して間もない頃は利用者も少なく安く使えるからです。

例えば Graviton を除く、C 系、M 系のインスタンスタイプで 16vCPU 以上、64GB メモリ以上のスペックでスポット利用費を安い順に表示してみます。

$ spotinfo --region ap-northeast-1 --sort price --type "^[m|c][^g]*\." --cpu 16 --memory 64
┌──────────────────┬──────┬────────────┬────────────────────────┬───────────────────────────┬──────────┐
│ INSTANCE INFO    │ VCPU │ MEMORY GIB │ SAVINGS OVER ON-DEMAND │ FREQUENCY OF INTERRUPTION │ USD/HOUR │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m7i-flex.4xlarge │   16 │         64 │                    77% │ <5%                       │   0.2303 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m7i.4xlarge      │   16 │         64 │                    77% │ <5%                       │    0.239 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m7a.4xlarge      │   16 │         64 │                    78% │ <5%                       │   0.2599 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m6a.4xlarge      │   16 │         64 │                    70% │ <5%                       │   0.2707 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m4.10xlarge      │   40 │        160 │                    89% │ 5-10%                     │     0.29 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m5a.4xlarge      │   16 │         64 │                    65% │ <5%                       │   0.3142 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m6i.4xlarge      │   16 │         64 │                    68% │ <5%                       │    0.317 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m4.4xlarge       │   16 │         64 │                    67% │ <5%                       │    0.338 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m6in.4xlarge     │   16 │         64 │                    76% │ <5%                       │   0.3408 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m5zn.6xlarge     │   24 │         96 │                    86% │ <5%                       │   0.3577 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m6id.4xlarge     │   16 │         64 │                    70% │ <5%                       │   0.3694 │
├──────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤

執筆時点での価格ではありますが新規インスタンスタイプの登場直後は安価に利用できる傾向にあります。性能が向上してかつ、スポット利用費も前世代よりも安いとお得です。

-flexサフィックス付きのインスタンスタイプの特徴については以下の記事を参照ください。

ParallelCluster で使ってみる

東京リージョンで使用可能になったインスタンスタイプの中で今後もよく使いそうなm7im7aの起動を試してみました。

    # ------ Compute 1 ------
    - Name: queue1
      ComputeResources:
        - Name: queue1
          Instances:
            - InstanceType: m7i.8xlarge
            - InstanceType: m7a.4xlarge
          MinCount: 0
          MaxCount: 20
          DisableSimultaneousMultithreading: true

マルチ AZ 起動時は同じ vCPU 数に揃えること

マルチ AZ 起動設定する場合はvCPU 数が同じ数のインスタンスタイプで合わせる必要があります。そして、マルチレッディング(ハイパースレッディング)を無効化することがよくあります。

DisableSimultaneousMultithreading: true

ここで注意したいのは

  • AMD の m7a は物理 16 コアでマルチレディング有効でも 16 スレッド
  • Intel の m7i は仮想 16 コアでマルチレディングを無効にすると 8 コア

そのため、物理 16 コアでインスタンスタイプを揃えるために、m7i.8xlargem7a.4xlargeの選択となりました。 AMD の m7a はマルチレディングを無効化にする環境であれば費用対効果が高いです。

ちなみに何も知らずにどちらも4xlargeの設定でクラスター作成したところ、バリデーションエラーで作成失敗しました。

    {
      "level": "ERROR",
      "type": "InstancesCPUValidator",
      "message": "Instance types listed under Compute Resource queue1 must have the same number of CPU cores when Simultaneous Multithreading is disabled ({'m7i.4xlarge': 8, 'm7a.4xlarge': 16})."
    }

M7a の特徴については以下の記事を参照ください。

インスタンスストアありますか?

シングルノードで計算時に一時的な利用する高速なストレージ領域としてインスタンスストアを利用するときがあります。現時点ではd付きのインスタンスタイプは未提供でした。海外リーションでも提供されていなかったため、東京リージョンで利用可能になるのはまだ先になりそうです。

サンプルコンフィグ

以下のコンフィグからクラスターを作成しました。

項目
AWS ParallelCluster 3.8.0
OS Ubuntu 22.04 LTS
CPU Arch Intel, AMD(x86_64)
HeadNode t3.micro
ComputeNode m7i.8xlarge, m7a.4xlarge
折りたたみ
Region: ap-northeast-1
Image:
  Os: ubuntu2204
Tags:
  - Key: Name
    Value: v380-cluster
# ----------------------------------------------------------------
# Head Node Settings
# ----------------------------------------------------------------
HeadNode:
  InstanceType: t3.micro
  Networking:
    ElasticIp: false
    SubnetId: subnet-0c82bb28e119e2aa8
  Ssh:
    KeyName: org-sandbox-keypair
  LocalStorage:
    RootVolume:
      Size: 40
      Encrypted: true
      VolumeType: gp3
      Iops: 3000
      Throughput: 125
  Iam:
    AdditionalIamPolicies:
      - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
    S3Access:
      - BucketName: hpc-dev-custom-boostrap-files-for-parallelcluster
        EnableWriteAccess: false
# ----------------------------------------------------------------
# Compute Node Settings
# ----------------------------------------------------------------
Scheduling:
  Scheduler: slurm
  SlurmSettings:
    ScaledownIdletime: 5
  SlurmQueues:
    # ------ Test 1 ------
    - Name: test1
      ComputeResources:
        - Name: test1
          Instances:
            - InstanceType: t3.micro
            - InstanceType: t3a.micro
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 40
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      AllocationStrategy: capacity-optimized
      Networking:
        SubnetIds:
          - subnet-0c82bb28e119e2aa8
          - subnet-0296a0c8515ed3bdc
          - subnet-0089ff187d1f54258
        PlacementGroup:
          Enabled: false
#      CustomActions:
#        OnNodeConfigured:
#          Script: s3://hpc-dev-custom-boostrap-files-for-parallelcluster/install/apptainer.sh
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        S3Access:
          - BucketName: hpc-dev-custom-boostrap-files-for-parallelcluster
            EnableWriteAccess: false
    # ------ Compute 1 ------
    - Name: queue1
      ComputeResources:
        - Name: queue1
          Instances:
            - InstanceType: m7i.8xlarge
            - InstanceType: m7a.4xlarge
          MinCount: 0
          MaxCount: 20
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 40
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      AllocationStrategy: capacity-optimized
      Networking:
        SubnetIds:
          - subnet-0c82bb28e119e2aa8
          - subnet-0296a0c8515ed3bdc
          - subnet-0089ff187d1f54258
        PlacementGroup:
          Enabled: false
#      CustomActions:
#        OnNodeConfigured:
#          Script: s3://hpc-dev-custom-boostrap-files-for-parallelcluster/install/apptainer.sh
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        S3Access:
          - BucketName: hpc-dev-custom-boostrap-files-for-parallelcluster
            EnableWriteAccess: false

# ----------------------------------------------------------------
# Shared Storage Settings
# ----------------------------------------------------------------
SharedStorage:
  - MountDir: /mnt/hpc-dev-efs-for-parallelcluster
    Name: efs1
    StorageType: Efs
    EfsSettings:
      FileSystemId: fs-0846dc947572a66a1

# ----------------------------------------------------------------
#  Other Settings
# ----------------------------------------------------------------
Monitoring:
  Logs:
    CloudWatch:
      Enabled: true
      RetentionInDays: 180
      DeletionPolicy: "Delete"
  Dashboards:
    CloudWatch:
      Enabled: true

テストジョブ

m7i.8xlargem7a.4xlargeが起動してくるパーティションで 10 台のコンピュートノードを要求するジョブを実行してみます。

ubuntu@ip-10-0-1-112:~$ cat echo.sh
#! /bin/bash

#SBATCH -p queue1
#SBATCH -N 10

echo "hello"

実行結果

ジョブ投げて放置していたらコンピュートノードの終了しており、すべてが終わったあとのキャプチャになります。m7i.8xlargem7a.4xlargeは ParallelCluster からの起動を確認できました。AZ はまばらに分散されていますね。

3 台のコンピュートノード指定でジョブ投げた結果を一応載せておきます。ちゃんと起動できていますね。

まとめ

  • AWS ParallelCluster は M7i と M7a インスタンスタイプの起動に対応していた
  • M7a インスタンスタイプはマルチレディングを無効化してもコア数に変化はなくコスパ良好である
  • M7i / M7a インスタンスタイプともにインスタンスストア付きのdタイプは未提供(2024/2/6 現在)

おわりに

最近クラスターのコンフィグを更新して設定を反映させることが多いです。今回もコンピュートノードの設定を変更して更新かけました。手間味噌ですが以下の記事が大変重宝しています。