AWS ParallelCluster のコンピュートノードでベアメタルインスタンスを使ってみた

ベアメタルインスタンスもありかも。
2023.08.17

AWS ParallelCluster でベアメタルインスタンスをコンピュートノードとして利用できるのか検証する機会がありましたので紹介します。

確認結果

  • ベアメタルインスタンスをコンピュートノードで起動できる
  • スポットインスタンス起動もサポートしている
  • ベアメタルインスタンスと通常のインスタンスの性能差はほぼない(AWSブログより)

検証環境

AWS ParallelCluster はバージョン 3.6.1 を利用しています。

# pcluster version
{
  "version": "3.6.1"
}

動作確認してみる

事の発端は 96vCPU のインスタンスのスポット起動確率を高めるために、同じ vCPU 数のインスタンスタイプを 1 つのキューに登録しようと考えていました。.24xlarge の C 系、M 系、R 系インスタンスかなと思いながらスポット料金をチェックしていたら、ベアメタルインスタンス(.metal)の存在に気づきました。スポット料金も大差ないし、.24xlarge と併用するならベストチョイスなのでは?と思ったのですが、ParallelCluster で動作するのか不明でした。疑問を解消するべくコンピュートノードにベアメタルインスタンスを採用したクラスターを作成して確認してみます。

$ spotinfo --region ap-northeast-1 --sort price --cpu 96 | head -n 20
┌─────────────────┬──────┬────────────┬────────────────────────┬───────────────────────────┬──────────┐
│ INSTANCE INFO   │ VCPU │ MEMORY GIB │ SAVINGS OVER ON-DEMAND │ FREQUENCY OF INTERRUPTION │ USD/HOUR │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ c5a.24xlarge    │   96 │        192 │                    65% │ 5-10%                     │   1.5968 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ c5.24xlarge     │   96 │        192 │                    69% │ 5-10%                     │   1.5968 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ c5.metal        │   96 │        192 │                    69% │ 5-10%                     │   1.5968 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ c5d.24xlarge    │   96 │        192 │                    73% │ 5-10%                     │   1.5968 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ c5d.metal       │   96 │        192 │                    73% │ 10-15%                    │   1.5968 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ c6a.24xlarge    │   96 │        192 │                    64% │ 10-15%                    │   1.6766 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m5dn.24xlarge   │   96 │        384 │                    80% │ <5%                       │   1.6766 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m5n.24xlarge    │   96 │        384 │                    77% │ 5-10%                     │   1.6766 │
├─────────────────┼──────┼────────────┼────────────────────────┼───────────────────────────┼──────────┤
│ m5a.24xlarge    │   96 │        384 │                    69% │ 5-10%                     │   1.6766 │

クラスターコンフィグの作成

.metalタイプのインスタンスをコンピュートノードで起動できるコンフィグを作成しました。以下のコンフィグからクラスターを作成します。

Region: ap-northeast-1
Image:
  Os: ubuntu2004
Tags:
  - Key: Name
    Value: BareMetalCluster
# ----------------------------------------------------------------
# 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
   # CustomActions:
    # OnNodeConfigured:
  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: queue1
      ComputeResources:
        - Name: queue1
          Instances:
            - InstanceType: c5d.metal
            - InstanceType: c5.metal
            - InstanceType: m5.metal
            - InstanceType: m5n.metal
            - InstanceType: m5dn.metal
          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
        PlacementGroup:
          Enabled: false
      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

コンピュートノードの確認

ヘッドノードからテストジョブを投げてコンピュートノードを起動させました。

ベアメタルインスタンスもスポットインスタンスで起動できました。

コンピュートノードを起動させるにあたりlscpuコマンドを実行するジョブを投げていました。実行結果からVirtualization: VT-xの表示を確認でき、ハイバーバイザーが間にないことがわかります。

lscpuの実行結果

rchitecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   46 bits physical, 48 bits virtual
CPU(s):                          96
On-line CPU(s) list:             0-47
Off-line CPU(s) list:            48-95
Thread(s) per core:              1
Core(s) per socket:              24
Socket(s):                       2
NUMA node(s):                    2
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           85
Model name:                      Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz
Stepping:                        7
CPU MHz:                         3000.000
CPU max MHz:                     3900.0000
CPU min MHz:                     1200.0000
BogoMIPS:                        6000.00
Virtualization:                  VT-x
L1d cache:                       1.5 MiB
L1i cache:                       1.5 MiB
L2 cache:                        48 MiB
L3 cache:                        71.5 MiB
NUMA node0 CPU(s):               0-23
NUMA node1 CPU(s):               24-47
Vulnerability Itlb multihit:     KVM: Mitigation: VMX disabled
Vulnerability L1tf:              Not affected
Vulnerability Mds:               Not affected
Vulnerability Meltdown:          Not affected
Vulnerability Mmio stale data:   Mitigation; Clear CPU buffers; SMT disabled
Vulnerability Retbleed:          Mitigation; Enhanced IBRS
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:        Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Mitigation; TSX disabled
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pnipclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single intel_ppin ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req pku ospke avx512_vnni md_clear flush_l1d arch_capabilities

ユースケースを考えてみた

ベアメタルインスタンスのスポット起動を ParallelCluster がサポートしていることを確認しました。ベアメタルインスタンスを使うケースを考えみました。

同じ vCPU 数のインスタンスタイプの代用

1 台のインスタンスで 96vCPU 以上を使うような大規模計算をする際、ベアメタルインスタンスを使うまたは併用する。

マルチ AZ 対応で複数インスタンスタイプを指定したキューを作成するとき、vCPU 数をあわせる必要があります。.metal も組み込むことでスポットインスタンスの起動確率を向上させる際にも良い手だと考えています。

ライセンス要件の回避

商用 HPC アプリケーションのライセンス要件によって仮想化環境で制限がある場合、非仮想化環境のインスタンスで実行できる。

商用アプリの場合は、仮想化、非仮想の前にクラウドで利用できるか?の確認で手こずることが多い印象があります。

Nitro Hypervisor がない分、性能は有利ですか?

Nitro Hypervisor が優秀でオーバーヘッドがほぼほぼなく、性能差は極僅かでした。詳細は性能比較している以下のブログをご確認ください。

おわりに

ベアメタルインスタンスは利用する機会がなくて存在を希薄でした。ParallelCluster でも利用できることが確認できたため、大きなインスタンスタイプを利用するときは検討対象に入れたいと思います。

ベアメタルインスタンスは Dedicated Hosts と混同しがちですが、ハイバーバイザーの有無の違いがあります。

Q: 専有ホストはベアメタル製品とどのように異なりますか?

A: 専有ホストには仮想化ソフトウェア (Xen または Nitro Hypervisor) が事前インストールされていますが、ベアメタルサーバーには仮想化ソフトウェアが事前インストールされていません。ベアメタルサーバーは、独自のハイパーバイザーを使用したいお客様、または仮想化されていない環境で実行する必要のあるアプリケーションを対象としています。

Amazon EC2 専有ホストのよくある質問 - アマゾン ウェブ サービス

その他には M1 Mac の Decdicated Hosts の様に最低でも 24 時間の利用料が発生するものもあります。

参考