この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS 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 にはマルチキュー以外にも様々なアップデートがあります。詳細はチェンジログをご確認ください。