AWS ParallelCluster Slurmのジョブ実行履歴を保存するデータベース(Aurora Serverless v1)を構築、Slurmと連携させてみた

AWS ParallelClusterとAurora Serverless v1の組み合わせでSlurmのジョブ実行履歴を保存する仕組みを構築します。DBはAWSのマネージドサービスを使える分、オンプレHPC環境より運用負担軽減できます。来てるぞクラウドHPCの時代
2021.06.08

Slurm(ジョブスケジューラー)のジョブ実行状態の詳細と履歴を保存したいケースの対応方法です。 たとえば計算ノードに投げたジョブが成功した、失敗した、実行時間は何分だったというジョブの実行履歴を保存したいとしましょう。保存するにはMySQLか、MariaDBのRDBが必要です。これはAWS ParallelClusterの仕様ではなく、Slurmの仕様としてデータベースが必要になります。

クラウドHPCでAWSを利用しているのでデータベースはマネージドサービスを活用し運用負担を軽減したいです。今回はAWS ParallelClusterにマネージドサービスのAurora Serverless v1 MySQL互換を利用して、Slurmのジョブ実行履歴を保存できる環境を構築します。

Aurora Serverless

今回はRDBのマネージドサービスの中でも制限事項の多いAurora Serverless v1を採用します。

データベースの使用用途はSlurmのジョブ実行履歴を記録するだけです。WEBサーバのように24時間365日起動している必要もなく、演算中(ParallelClusterが稼働中)の間だけデータベースを起動していればことは足ります。

Aurora Serverless v1はデータベースへの接続がないと自動的に停止状態に設定できます。実行時間に対する従量課金を抑えることが容易です。Aurora Servelessの採用で気がかりな停止状態からの開始までに1分程度かかる点については、後述するslurmdbdデーモンにより、ParallelCluster(ヘッドノード)起動中、Aurora Serverless v1は停止状態(OACU)にならない。ParallelClusterが起動中はAurora Serverless v1も起動状態(1ACU以上)を維持することが検証してわかりました。そのため、検証目的や24時間365日演算する環境でなければ安価にRDBのマネージドサービスを利用できます。

ユースケースによりますので以下の記事を参考に非ServerlessのAurora MySQLも評価対象に含めご検討ください。

検証環境

項目
ParallelCluster 2.10.4
Slurm(sinfo -V) 20.02.7
OS Ubuntu 18.04 LTS
CPU Intel
HeadNode t3.micro
ComputeNode c5.large
MySQL 5.7互換

設定手順

ヘッドノードの設定追加、変更が必要です。コンピュートノードに設定する項目はありません。データベースはMySQLかMariaDBが必要です。今回データベースはマネージドサービスのAurora Serverless v1を利用して環境構築します。

下記の設定を手順を参考にすすめます。

Slurmのアーキテクチャから見るとヘッドノードでslurmdbdを有効化し、DatabaseはAurora Serverless v1で新規作成することになります。

Slurm Workload Manager - Quick Start User Guideより引用

Aurora Serverless v1の準備

Aurora Serverless v1でMySQLを作成する場合は下記を参考にしてください。RDS、AuroraでMySQLを作成する場合はAWS Compute Blogの手順を参考に作成してください。

Auroraのセキュリティグループのインバウンドにヘッドノードから接続を許可しましょう。

ParallelClusterヘッドノードの設定

MySQLクライアントをインストールします。

sudo apt update
sudo apt search mysql-client
sudo apt install mysql-client -y

ヘッドノードからMySQLの設定

DBのホスト名はご自身の環境に置き換えてください。

mysql -h database-1.cluster-cql5tgylta2m.us-east-1.rds.amazonaws.com -u admin -p

必要な権限を付与します。

mysql> GRANT ALL ON `%`.* TO admin@`%`;

MySQLの設定は以上です。設定という設定はないに等しい。

mysql> quit

ヘッドノードのSlurm設定ファイル編集

新規に設定ファイル作成します。

sudo vi /opt/slurm/etc/slurmdbd.conf

サンプルで下記のコンフィグを作成しました。DBのホスト名、ユーザ名、パスワード(ベタ書き)、ポート番号はご自身の環境に合わせて修正してください。Archiveシリーズでジョブ履歴関係の保持期限を設定できます。すべてのnoを指定し一定期間後に履歴を破棄しない設定にしました。

ファイル内容

ArchiveEvents=no
ArchiveJobs=no
ArchiveResvs=no
ArchiveSteps=no
ArchiveSuspend=no
ArchiveTXN=no
ArchiveUsage=no
AuthType=auth/munge
DbdHost=localhost
DbdPort=6819
DebugLevel=info
SlurmUser=slurm
LogFile=/var/log/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
StorageType=accounting_storage/mysql
StorageUser=admin  # 環境に合わせて変更箇所
StoragePass=password  # 環境に合わせて変更箇所
StorageHost=database-1.cluster-cql5tgylta2m.us-east-1.rds.amazonaws.com  # 環境に合わせて変更箇所
StoragePort=3306  # 環境に合わせて変更箇所

次に既存の設定ファイルを編集します。

sudo vi /opt/slurm/etc/slurm.conf

末尾に以下の内容を追記します。

追記内容

# ACCOUNTING
JobAcctGatherType=jobacct_gather/linux
JobAcctGatherFrequency=30
#
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageHost=localhost
AccountingStorageUser=admin  # 環境に合わせて変更箇所
AccountingStoragePort=6819  # 環境に合わせて変更箇所

参考元の手順では下記コマンドを実行してslurmdbdを起動しています。動作確認したところslurmdbdが起動しないとヘッドノードはデータベースと接続しません。つまり、ヘッドノード停止/開始のたびにこのコマンドを実行しないといけません。この問題はslurmdbdをデーモン化して解決します。

# オリジナルの手順
sudo /opt/slurm/sbin/slurmdbd

slumdbdデーモンを新規作成します。

sudo vi /etc/systemd/system/slurmdbd.service

ファイル内容

[Unit]
Description=slurmdbd
After=network.target
[Service]
Type=forking
User=root
ExecStart=/opt/slurm/sbin/slurmdbd
Restart = always
[Install]
WantedBy=multi-user.target

slumdbdデーモンを自動起動設定します。

sudo systemctl daemon-reload
sudo systemctl enable slurmdbd
sudo systemctl start slurmdbd
sudo systemctl status slurmdbd

slurmdbdがActiveで起動していれば成功です。オリジナルの手順にない作業は以上です。

出力結果

● slurmdbd.service - slurmdbd
   Loaded: loaded (/etc/systemd/system/slurmdbd.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) since Thu 2021-06-03 05:33:42 UTC; 70ms ago
  Process: 21811 ExecStart=/opt/slurm/sbin/slurmdbd (code=exited, status=0/SUCCESS)
 Main PID: 21818 (code=exited, status=0/SUCCESS)

Jun 03 05:33:42 ip-10-1-11-236 systemd[1]: Started slurmdbd.

最後にslurmctldデーモンを再起動します。

sudo systemctl restart slurmctld

ヘッドノードの設定は以上です。これでSlurmとAurora Serverlessが連携できるようになりました。

ジョブ実行履歴の確認

sacctコマンドの結果からジョブの実行履歴を確認してみます。まずテストジョブを投げました。

$ sbatch -n1 test.sh

squeueコマンドでジョブキューを確認します。StatusがCF(CONFIGURING)になっており、コンピューティングリソースを使えるの待ち状態です。要は必要台数のコンピュートノード起動待ちです。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                 5     spot1  test.sh   ubuntu CF       0:33      1 spot1-dy-c5large-1

sacctコマンドで確認するとRUNNING表記です。

$ sacct
       JobID    JobName  Partition    Account  AllocCPUS      State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
5               test.sh      spot1                     1    RUNNING      0:0

squeueで再度確認するとジョブは捌けたことがわかります。しかし、コンピュートノードでの処理は実行中なのか、正常に終わったのか、失敗だったのかはわからないですね。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

sacctコマンドで実行結果を確認するとCOMPLETED表記でExitCode 0により、ジョブが正常終了していることがわかります。ExitCodeはO以外だと異常があったことを示します。

$ sacct
       JobID    JobName  Partition    Account  AllocCPUS      State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
5               test.sh      spot1                     1  COMPLETED      0:0
5.batch           batch                                1  COMPLETED      0:0

sacctコマンドにオプションをつけるとジョブ開始時刻(Start)、終了時刻(End)、実行時間(Elapsed)も確認できます。ちなみにテストジョブはsleep 60を実行するシェルスクリプトでした。実行時間は1分と記録されています。

$ sacct -o User,JobID,Partition,NNodes,Submit,Start,End,Elapsed,State -X
     User        JobID  Partition   NNodes              Submit               Start                 End    Elapsed      State
--------- ------------ ---------- -------- ------------------- ------------------- ------------------- ---------- ----------
   ubuntu 5                 spot1        1 2021-06-08T04:02:21 2021-06-08T04:04:54 2021-06-08T04:05:55   00:01:01  COMPLETED

Aurora ServerlessとSlurmを連携することでsacctコマンドが利用でき、ジョブ履歴を保存できることが確認できました。

DBのテーブルを覗いてみる

sacctの参照元DBを直接参照したらどうなのか気になったので試しました。ヘッドノードからデータベースへ接続します。slurm_acct_dbsacctで参照しているDBです。

折り畳み
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| slurm              |
| slurm_acct_db      |
| sys                |
+--------------------+

mysql> use slurm_acct_db;

mysql> show tables;
+-----------------------------------------+
| Tables_in_slurm_acct_db                 |
+-----------------------------------------+
| acct_coord_table                        |
| acct_table                              |
| clus_res_table                          |
| cluster_table                           |
| convert_version_table                   |
| federation_table                        |
| parallelcluster_assoc_table             |
| parallelcluster_assoc_usage_day_table   |
| parallelcluster_assoc_usage_hour_table  |
| parallelcluster_assoc_usage_month_table |
| parallelcluster_event_table             |
| parallelcluster_job_table               |
| parallelcluster_last_ran_table          |
| parallelcluster_resv_table              |
| parallelcluster_step_table              |
| parallelcluster_suspend_table           |
| parallelcluster_usage_day_table         |
| parallelcluster_usage_hour_table        |
| parallelcluster_usage_month_table       |
| parallelcluster_wckey_table             |
| parallelcluster_wckey_usage_day_table   |
| parallelcluster_wckey_usage_hour_table  |
| parallelcluster_wckey_usage_month_table |
| qos_table                               |
| res_table                               |
| table_defs_table                        |
| tres_table                              |
| txn_table                               |
| user_table                              |
+-----------------------------------------+

ジョブ履歴が格納されていそうな名前のテーブルparallelcluster_job_tableを覗いてみます。sacctコマンドにオプション付けて表示できた開始時刻などの値が格納されていました。

mysql> select * from parallelcluster_job_table;
+------------+------------+---------+---------+---------------+----------------+-----------------+--------------------+-------------+----------+------------+------------+-----------+-------+------------+----------+--------------+---------------+----------+--------+--------+---------+----------+---------+----------+------------+----------------+-------------+-------------------+-----------+---------+--------------------+-------------+----------+-----------+------------+-------+------------+-------------+---------------+------------+------------+----------------+----------+------------+-----------+-------+--------------+----------------+-------------+------------------------------------+-------------+
| job_db_inx | mod_time   | deleted | account | admin_comment | array_task_str | array_max_tasks | array_task_pending | constraints | cpus_req | derived_ec | derived_es | exit_code | flags | job_name   | id_assoc | id_array_job | id_array_task | id_block | id_job | id_qos | id_resv | id_wckey | id_user | id_group | het_job_id | het_job_offset | kill_requid | state_reason_prev | mcs_label | mem_req | nodelist           | nodes_alloc | node_inx | partition | priority   | state | timelimit  | time_submit | time_eligible | time_start | time_end   | time_suspended | gres_req | gres_alloc | gres_used | wckey | work_dir     | system_comment | track_steps | tres_alloc                         | tres_req    |
+------------+------------+---------+---------+---------------+----------------+-----------------+--------------------+-------------+----------+------------+------------+-----------+-------+------------+----------+--------------+---------------+----------+--------+--------+---------+----------+---------+----------+------------+----------------+-------------+-------------------+-----------+---------+--------------------+-------------+----------+-----------+------------+-------+------------+-------------+---------------+------------+------------+----------------+----------+------------+-----------+-------+--------------+----------------+-------------+------------------------------------+-------------+
|          1 | 1620979907 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        1 |          0 | NULL       |         0 |     4 | test.sh    |        0 |            0 |    4294967294 | NULL     |      2 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901759 |     3 | 4294967295 |  1620979720 |    1620979720 | 1620979846 | 1620979907 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 |
|          2 | 1620980171 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        2 |          0 | NULL       |         0 |     4 | test.sh    |        0 |            0 |    4294967294 | NULL     |      3 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901758 |     3 | 4294967295 |  1620980110 |    1620980110 | 1620980111 | 1620980171 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=2,3=18446744073709551614,4=1,5=2 | 1=2,4=1,5=2 |
|          3 | 1620984607 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        1 |          0 | NULL       |         0 |     4 | test.sh    |        0 |            0 |    4294967294 | NULL     |      4 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901759 |     3 | 4294967295 |  1620984086 |    1620984086 | 1620984221 | 1620984282 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 |
|          4 | 1620987272 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        1 |          0 | NULL       |         0 |     8 | test.sh    |        0 |            0 |    4294967294 | NULL     |      5 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901759 |     3 |     525600 |  1620987053 |    1620987053 | 1620987211 | 1620987272 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 |
|          5 | 1621991638 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        1 |          0 | NULL       |         0 |     8 | test.sh    |        0 |            0 |    4294967294 | NULL     |      6 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901759 |     3 |     525600 |  1621991435 |    1621991435 | 1621991578 | 1621991638 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 |
|          6 | 1622699299 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        1 |          0 | NULL       |         0 |     4 | test.sh    |        0 |            0 |    4294967294 | NULL     |      2 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901759 |     3 | 4294967295 |  1622699122 |    1622699122 | 1622699238 | 1622699299 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 |
|          7 | 1622708042 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        2 |          0 | NULL       |         0 |     4 | test120.sh |        0 |            0 |    4294967294 | NULL     |      3 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901758 |     3 | 4294967295 |  1622699506 |    1622699506 | 1622699507 | 1622699627 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=2,3=18446744073709551614,4=1,5=2 | 1=2,4=1,5=2 |
|          8 | 1622766465 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        1 |          0 | NULL       |         0 |     4 | test.sh    |        0 |            0 |    4294967294 | NULL     |      4 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901759 |     3 | 4294967295 |  1622766234 |    1622766234 | 1622766404 | 1622766465 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 |
|          9 | 1623125155 |       0 | NULL    | NULL          | NULL           |               0 |                  0 | NULL        |        1 |          0 | NULL       |         0 |     8 | test.sh    |        0 |            0 |    4294967294 | NULL     |      5 |      1 |       0 |        0 |    1000 |     1000 |          0 |     4294967294 |          -1 |                 0 | NULL      |       0 | spot1-dy-c5large-1 |           1 | 0        | spot1     | 4294901759 |     3 |     525600 |  1623124941 |    1623124941 | 1623125094 | 1623125155 |              0 |          |            |           |       | /home/ubuntu | NULL           |           0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 |
+------------+------------+---------+---------+---------------+----------------+-----------------+--------------------+-------------+----------+------------+------------+-----------+-------+------------+----------+--------------+---------------+----------+--------+--------+---------+----------+---------+----------+------------+----------------+-------------+-------------------+-----------+---------+--------------------+-------------+----------+-----------+------------+-------+------------+-------------+---------------+------------+------------+----------------+----------+------------+-----------+-------+--------------+----------------+-------------+------------------------------------+-------------+

おわりに

Slurmのジョブ実行履歴を保存するにはデータベースが必要でした。そして、データベースにはAWSのマネージドサービスを活用できることを確認できました。Slurmのジョブ履歴を保存する必要がある、ジョブの実行結果を確認したいというときはRDS, Auroraの利用もご検討ください。

参考