
東京リージョンで「C6id」「M6id」「R6id」の EC2 インスタンスが利用可能になったので AWS ParallelCluster から使ったみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
第6世代の EC2 インスタンスタイプに NVMe ベースの SSD ブロックレベルインスタンスストレージを搭載したdの付くインスタンスタイプが東京リージョンで利用可能になりました。AWS ParallelCluster のクラスターに組み込んで起動確認してみました。
2022年5月26日から一部リージョンでは利用可能でしたので東京リージョンは4か月遅れの提供となりました。
dの特徴である高速なローカルストレージはインスタンスストアと呼ばれる非永続的なストレージです。
AWS ParalelCluster とインスタンスストア
AWS ParalelCluster でインスタンスストアを持つインスタンスを利用するときは疎結合なHPC ワークロードで単一のコンピュートノードで実行するアプリケーション向きです。

画像引用: サービスアップデート Compute 編:HPC on AWS アップデート - YouTube
ひとつのジョブが多数のインスタンスをまたいで共通のストレージへアクセスが必要な場合ですと、ローカルストレージであるインスタンスストアへの他ノードからのアクセスが問題になります。
密結合 HPC ワークロードでも他のノードと共有しない一時ファイル、中間ファイルを大量にローカルに生成するようなワークロードでしたら有効活用はできるかもしれません。
複数のノードから共通でアクセスするストレージが必要な場合は、ヘッドノードから共有する EBS や、ストレージサービス(EFS、FSx シリーズ)をご利用を検討ください。
クラスター作成準備
c6idインスタンスがどこの AZ で起動できるか確認しておきましょう。
試しにc6id.largeを検索すると 2AZ での提供でした。large ですと実際にはスペック不足でしょうからコンピュートノードで利用したいインスタンスタイプを指定して確認してください。
$ aws ec2 describe-instance-type-offerings --location-type availability-zone-id --region ap-northeast-1 --filters Name=instance-type,Values=c6id.large
{
    "InstanceTypeOfferings": [
        {
            "InstanceType": "c6id.large",
            "LocationType": "availability-zone-id",
            "Location": "apne1-az4"
        },
        {
            "InstanceType": "c6id.large",
            "LocationType": "availability-zone-id",
            "Location": "apne1-az2"
        }
    ]
}
現時点では128vCPU、256GB メモリのc6id.32xlargeも 2AZ で提供でした。※ 多くのケースでは Hyper-Threading を無効化して計算するため、物理コア換算ですと64core です。
$ aws ec2 describe-instance-type-offerings --location-type availability-zone-id --region ap-northeast-1 --filters Name=instance-type,Values=c6id.32xlarge
{
    "InstanceTypeOfferings": [
        {
            "InstanceType": "c6id.32xlarge",
            "LocationType": "availability-zone-id",
            "Location": "apne1-az4"
        },
        {
            "InstanceType": "c6id.32xlarge",
            "LocationType": "availability-zone-id",
            "Location": "apne1-az2"
        }
    ]
}
ゾーン ID のマッピング
Locationで表示されたゾーン IDはap-northeast-1?でいうとなに?
AWS アカウントごとにマッピングが異なっています。ご自身の AWS アカウントでご確認いただく必要があります。。私の AWS アカウントではap-northeast-1aと、ap-northeast-1dでc6idが提供されていました。
$ aws ec2 describe-availability-zones --region ap-northeast-1
{
    "AvailabilityZones": [
        {
            "State": "available",
            "OptInStatus": "opt-in-not-required",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1a",
            "ZoneId": "apne1-az4",
            "GroupName": "ap-northeast-1",
            "NetworkBorderGroup": "ap-northeast-1",
            "ZoneType": "availability-zone"
        },
        {
            "State": "available",
            "OptInStatus": "opt-in-not-required",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1c",
            "ZoneId": "apne1-az1",
            "GroupName": "ap-northeast-1",
            "NetworkBorderGroup": "ap-northeast-1",
            "ZoneType": "availability-zone"
        },
        {
            "State": "available",
            "OptInStatus": "opt-in-not-required",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1d",
            "ZoneId": "apne1-az2",
            "GroupName": "ap-northeast-1",
            "NetworkBorderGroup": "ap-northeast-1",
            "ZoneType": "availability-zone"
        }
    ]
}
クラスターのコンフィグ作成
c6id.largeをコンピュートノードで起動できるコンフィグを作成しました。こちらのコンフィグからクラスターを作成します。
| 項目 | 値 | 
|---|---|
| ParallelCluster | 3.2.0 | 
| OS | Ubuntu 20.04 | 
| CPU | Intel | 
| Head Node | t3.micro | 
| Compute Node | c6id.large | 
| Simultaneous Multi-Threading | 無効 | 
| Placement group | 有効 | 
Region: ap-northeast-1
Image:
  Os: ubuntu2004
Tags:
  - Key: Name
    Value: UbuntuCluster
# ----------------------------------------------------------------
# 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:
    # ------ Debug 1 without Postinstall ------
    - Name: debug-1
      ComputeResources:
        - Name: debug-without-postinstall
          InstanceType: t3.micro
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: false
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 35
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      Networking:
        SubnetIds:
          - subnet-035be95eeaa091603
        PlacementGroup:
          Enabled: false
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        S3Access:
          - BucketName: hpc-dev-postinstall-files
            EnableWriteAccess: false
    # ------ Debug 2 with Postinstall ------
    - Name: debug-2
      ComputeResources:
        - Name: debug-run-postinstall
          InstanceType: t3.micro
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: false
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 35
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      Networking:
        SubnetIds:
          - subnet-035be95eeaa091603
        PlacementGroup:
          Enabled: false
      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
    # ------ Compute 1 ------
    - Name: c6idlarge
      ComputeResources:
        - Name: c6idlarge
          InstanceType: c6id.large
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 35
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      Networking:
        SubnetIds:
          - subnet-035be95eeaa091603
        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: true
コンピュートノードの確認
ヘッドノードからテストジョブを投げてコンピュートノードを起動させました。

コンピュートノードへログイン
インスタンスストアは/scratchにマウントされています。ジョブを投げて計算するときは/scratchを指定して一時ファイルを書き込みしたり、計算前に S3 からデータをダウンロードして保存して利用できます。
計算結果を/scratchに書き出した場合はコンピュートノード停止ともに/scratch上のデータは削除されますので注意してください。ジョブの最後で共有ストレージや、S3 へアップロードなどの永続的なストレージへ退避処理を忘れずに。
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 34G 18G 16G 53% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 385M 972K 384M 1% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/loop4 62M 62M 0 100% /snap/core20/1581 /dev/loop5 26M 26M 0 100% /snap/amazon-ssm-agent/5656 /dev/loop3 47M 47M 0 100% /snap/snapd/16292 /dev/nvme0n1p15 105M 5.2M 100M 5% /boot/efi /dev/loop6 68M 68M 0 100% /snap/lxd/22753 /dev/loop1 56M 56M 0 100% /snap/core18/2538 /dev/loop7 48M 48M 0 100% /snap/snapd/17029 10.0.1.27:/home 34G 18G 17G 52% /home 10.0.1.27:/opt/parallelcluster/shared 34G 18G 17G 52% /opt/parallelcluster/shared /dev/mapper/vg.01-lv_ephemeral 108G 61M 103G 1% /scratch 10.0.1.27:/opt/intel 34G 18G 17G 52% /opt/intel fs-0f1158ade79354809.efs.ap-northeast-1.amazonaws.com:/ 8.0E 0 8.0E 0% /mnt/efs-1zone 10.0.1.27:/opt/slurm 34G 18G 17G 52% /opt/slurm /dev/loop8 64M 64M 0 100% /snap/core20/1623 /dev/loop9 56M 56M 0 100% /snap/core18/2566 tmpfs 385M 0 385M 0% /run/user/0
確認できたこと
c6idインスタンスの提供 AZ は要確認- AWS ParalelCluster 3.2.0 で
c6id.largeをコンピュートノードとして起動成功 - インスタンスストアは
/scratchに自動マウントされる 
おわりに
第5世代(C5,M5,R5)と比べ第6世代(C6i,M5i,R6i)は15%優れたコストパフォーマンスとなっています。オンデマンド料金は若干値上がりしているのですが、スポットインスタンスなら誤差の範囲ですので、スポットインスタンスの割引率を見て積極的に利用を検討してもよろしいのではないでしょうか。
現時点では C5d も C6id もスポットインスタンス料金は70%割引きでした。時間とともに第5世代の在庫が増えて割引率が良くなり、第6世代は割引率が渋くなる可能性はあります。計算するタイミングでスポットインスタンスの料金を確認してみると、よりコストパフォーマンス良くお使いいただけるかと思います。
スポットインスタンスの料金履歴 - Amazon Elastic Compute Cloud









