AWS ParallelCluster Slurmが複数キュー(パーティション)に対応しました

AWS ParallelClusterのジョブスケジューラーにSlurmを指定すると、複数のキュー(パーティション)を利用できるようになりました。 CPU・GPUそれぞれのキューを用意し、対応するインスタンスタイプを割り当てるといった運用ができます。
2020.09.14

WS ParallelCluster がマルチキュー(パーティション)に対応

ジョブスケジューラーのSlurmでは、コンピュートノードをパーティションとして単位でグルーピングでき、ジョブ投入時に実行するパーティションを指定することができます。

AWS ParallelClusterのジョブスケジューラー 2.9 以降で Slurm を指定すると、複数のパーティションを作成できるようになった上、パーティションに使用するインスタンスタイプを柔軟に指定できるようになりました。

この機能を利用すると、1クラスター内に C 系インスタンスで構成されれる CPU 系パーティションと G4 系インスタンスで構成される GPU 系パーティションを構成できます。

同じことを従来の AWS ParallelCluster で実現しようとすると、CPU系、GPU系それぞれでクラスターを構築する必要がありました。

マルチキュー機能は、ヘッドノードを集約して複数パーティション運用したいケースやオンプレで複数パーティション運用されているSlurmクラスターをそのまま AWS に lift and shift(リホスト)したいケースに適用できます。

ドキュメントのChange Log から引用します。

Added support for multiple queues and multiple instance types in the compute fleet when used with Slurm Workload Manager. When using queues, Auto Scaling groups are no longer used on Slurm. An Amazon Route 53 hosted zone is now created with the cluster and is used for DNS resolution of compute nodes when the Slurm scheduler is used. For more information, see Multiple queue mode.

設定ファイルの変更

従来のシングルキュー向けの設定方法は有効です。

その上で、マルチキューを利用したい場合、は コンピュートノード情報やクラスターの組み方を

  • queue
  • compute_resource

セクションに分割します。

マルチキューに関連する設定項目と記述するセクションの対応関係は次の表の通りです。

項目 シングル マルチ
queue_settings N.A. cluster q1, q2
compute_resource_settings N.A. queue i1,i2
placement_group cluster queue DYNAMIC
enable_efa cluster queue TRUE
disable_hyperthreading cluster queue FALSE
compute_type cluster queue spot
instance_type cluster compute_resource c5.xlarge
min_count cluster compute_resource 0
initial_count cluster compute_resource 1
max_count cluster compute_resource 10
spot_price cluster compute_resource 0.5

cluster : queue は 1:M、 queue : compute_resource は N:M の関係です。

やってみた

  • c5.xlarge インスタンスを利用した CPU キュー
  • g4.xlarge インスタンスを利用した GPU キュー

の2つのキューがあるクラスターを実際に構築します。

設定ファイル

次の様な設定ファイルを用意し、 $ pcluster crate test -c multi.conf を実行します。

パラメーター(特にVPC関連)は適宜読み替えてください。

multi.conf

[aws]
aws_region_name = ap-northeast-1

[global]
cluster_template = default

[cluster default]

key_name = xxx
base_os = alinux2
scheduler = slurm

vpc_settings = dev

master_instance_type = c5.xlarge
s3_read_write_resource = *
queue_settings = cpu, gpu

[vpc dev]

vpc_id = vpc-123
master_subnet_id = subnet-123
compute_subnet_id = subnet-123

[queue cpu]
compute_resource_settings = cpu
placement_group = DYNAMIC
disable_hyperthreading = true
compute_type = spot

[queue gpu]
compute_resource_settings = gpu
placement_group = DYNAMIC
disable_hyperthreading = false

[compute_resource cpu]
instance_type = c5.xlarge
min_count = 1
initial_count = 1
max_count = 2

[compute_resource gpu]
instance_type = g4dn.xlarge
min_count = 1
initial_count = 1
max_count = 2

クラスターを確認

クラスターの構築完了後、Slurm コマンドでクラスターを確認します。

sinfo

マルチキューの場合

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu*         up   infinite      1  idle# cpu-dy-c5xlarge-1
cpu*         up   infinite      1   idle cpu-st-c5xlarge-1
gpu          up   infinite      1  idle~ gpu-dy-g4dnxlarge-1
gpu          up   infinite      1   idle gpu-st-g4dnxlarge-1

PARTITION 列は cpu と gpu の2種類があります。

シングルキューのときの PARTITION は compute 固定でした。

シングルキューの場合

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
compute*     up   infinite      3    mix ip-10-1-21-[30,95,179]

scontrol

$ scontrol show partition
PartitionName=cpu
   AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
   AllocNodes=ALL Default=YES QoS=N/A
   DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
   MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED
   Nodes=cpu-st-c5xlarge-[1-1],cpu-dy-c5xlarge-[1-1]
   PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO
   OverTimeLimit=NONE PreemptMode=OFF
   State=UP TotalCPUs=4 TotalNodes=2 SelectTypeParameters=NONE
   JobDefaults=(null)
   DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED

PartitionName=gpu
   AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
   AllocNodes=ALL Default=NO QoS=N/A
   DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
   MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED
   Nodes=gpu-st-g4dnxlarge-[1-1],gpu-dy-g4dnxlarge-[1-1]
   PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO
   OverTimeLimit=NONE PreemptMode=OFF
   State=UP TotalCPUs=8 TotalNodes=2 SelectTypeParameters=NONE
   JobDefaults=(null)
   DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED

キュー(パーティション)を指定してジョブを実行

Slurm では、ジョブ実行時にキューを指定できます。

srunの場合は --partition 引数にパーティション名を指定します。

$ srun --partition gpu -l hostname
0: gpu-st-g4dnxlarge-1
$ srun --partition cpu -l hostname
0: cpu-dy-c5xlarge-1

それぞれのパーティションで実行できていますね。

制約

マルチプルキューモードには以下の制限があります。

  • AWS ParallelCluster 2.9 以降に対応
  • ジョブスケジューラー : Slurm のみ
  • queue の最大数 : 5
  • queue を構成する compute_resource の最大数 : 3
  • 各 compute_resource のインスタンスタイプは異なること

最後に

AWS parallelCluster 2.9 の Slurm マルチキューモードを利用すると、CPU・GPUのようにワークロードの種類ごとにキューを分けたり、キューを複数のインスタンスタイプで構成することができます。

Slurmでは様々な背景により複数のキューを運用しているケースが多々あるので、オンプレに近い構成のままAWS ParallelClusterに移植(リホスト)できる選択肢ができたのは喜ばしいことではないかと思います。

AWS parallelCluster にはマルチキュー以外にも様々なアップデートがあります。詳細はチェンジログをご確認ください。

参考