AWS ParallelClusterのクラスター開発を効率的に行うためのTIPS

2020.07.13

AWS ParallelClusterを使って新規HPC環境を構築する場合、開発中に何度も $ pcluster create を実行したり、トラブルシュートすることになるかと思います。

クラスターの構築には時間がかかるし、コンポーネントは複雑に絡み合っているし、インスタンスの利用費は高額です。

そこで、開発時のトライアル&エラーを効率的に回すためのTIPSをいくつかまとめてみました。

クラスター作成時のロールバックを無効化

AWS ParallelCluster を使ってクラスターを作成すると、裏では AWS CloudFormation を使ってリソースが作成されます。

クラスターcreate時にエラーが発生すると、デフォルトではCloudFormationスタックのロールバックが走ります。

エラー時にロールバックしないオプション--norollbackを渡しましょう。 エラー発生時点までのクラスター環境にアクセスし、エラー原因を調査できます。

$ pcluster create debug -c test.ini \
  --norollback
Beginning cluster creation for cluster: debug
Creating stack named: parallelcluster-debug
Status: parallelcluster-debug - CREATE_FAILED
Cluster creation failed.  Failed events:
  - AWS::CloudFormation::Stack parallelcluster-debug The following resource(s) failed to create: [MasterServerWaitCondition].
  - AWS::CloudFormation::WaitCondition MasterServerWaitCondition Received FAILURE signal with UniqueId i-09534da8fca4c924b

$ pcluster list
debug  CREATE_FAILED  2.7.0

ロールバックを無効化したおかげで、失敗時点のリソースが残っています。

AWS ParallelCluster 用の AMI を直接起動して動作確認

AWS ParallelClusterで起動するサーバーは、ジョブスケジューラーやコンパイラーなどHPC 向けのソフトウェア群がインストール済みの AMI から起動されています。

AMI は 「AWS ParallelCluster のバージョン」 x 「プラットフォーム」 の組み合わせごとに存在し、2.7.0 向けの Amazon Linux 2 の AMI であれば aws-parallelcluster-2.7.0-amzn2-hvm-202005172030 というようなAMI名です。

ノードに初期セットアップを検証したいときは、これら AMI を利用しましょう。

AWS ParallelCluster向けAMIの構成を把握

上述の通り、AWS ParallelClusterでサーバーを起動する場合、専用のソフトウェア群をインストールしたAMIから起動されます。

インストール済みパッケージ

gcc のような一般的なパッケージは、yumからそのままインストールしています。

ジョブスケジューラーなど特殊なプログラムは /opt 以下にインストールされています。

$ ls /opt/
amazon  aws  chef  intel  parallelcluster  rh  sge  slurm  torque

lustre クライアントのように、amazon-linux-extras でインストールされているものもあります。

$ amazon-linux-extras
...
 32  lustre2.10=latest        enabled      \
        [ =2.10.5  =2.10.8  =stable ]
...

環境変数の設定

/opt のようなイレギュラーなパスにインストールしたパッケージも正しく使えるように、環境変数をゴニョゴニョしています。

$ ls -1 /etc/profile.d/
256term.csh
256term.sh
bash_completion.sh
colorgrep.csh
colorgrep.sh
colorls.csh
colorls.sh
csh.local
efa.sh
flatpak.sh
lang.csh
lang.sh
less.csh
less.sh
modules.csh
modules.sh
pyenv.sh
qt.csh
qt.sh
sh.local
slurm.csh
slurm.sh
vim.csh
vim.sh
vte.sh
which2.csh
which2.sh

環境変数が正しく設定されているおかげで、起動直後からHPC系パッケージを利用できます。

$ module av

---------------------- /usr/share/Modules/modulefiles -----------------------
dot                        modules
libfabric-aws/1.9.0amzn1.1 null
module-git                 openmpi/4.0.3
module-info                use.own

-------------- /opt/intel/impi/2019.7.217/intel64/modulefiles/ --------------
intelmpi
$ which mpicc
/opt/amazon/openmpi/bin/mpicc

プロセスの起動方式によっては、環境変数がうまく設定されないケースもあるため、ご注意ください。

pre_install/post_install は CloudFormation の cfn-init を利用

設定ファイルの pre_install/post_install セクションを利用すると、ノードのブートストラップ時にスクリプトを実行させることができます。

cluster.ini

...
[cluster default]
...
pre_install = s3://BUCKET/install.sh
...

この処理は、内部的には AWS CloudFormation の cfn-init で実現されています。

この処理に起因するログは、ノード内の cfn-init のログファイル、Amazon Linux 2 であれば /var/log/cfn-init* を確認しましょう。

例として、post-install 処理が失敗すると、以下のようなログが出力されます。

/var/log/cfn-init-cmd.log

2020-07-12 15:59:57,479 P17932 [INFO] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2020-07-12 15:59:57,479 P17932 [INFO] Config shellRunPostInstall
2020-07-12 15:59:57,480 P17932 [INFO] ============================================================
2020-07-12 15:59:57,480 P17932 [INFO] Command runpostinstall
2020-07-12 16:00:00,265 P17932 [INFO] -----------------------Command Output-----------------------
2020-07-12 16:00:00,266 P17932 [INFO] 	hello from post-install
2020-07-12 16:00:00,266 P17932 [INFO] 	/tmp/tmp.VRgIMOUiLF: line 3: non-existent-command: command not found
2020-07-12 16:00:00,266 P17932 [INFO] 	parallelcluster: fetch_and_run - Failed to run boot_as_master postinstall, s3://BUCKET/install.sh failed with non 0 return code: 127
2020-07-12 16:00:00,266 P17932 [INFO] ------------------------------------------------------------
2020-07-12 16:00:00,266 P17932 [ERROR] Exited with error code 1

ノードログは CloudWatch Logs に転送される

AWS ParallelCluster 2.6.0 からノードの主要ログはデフォルトで CloudWatch Logsに転送されるようになっています。

Integration with Amazon CloudWatch Logs - AWS ParallelCluster

命名規則

  • ロググループ名 : /aws/parallelcluster/cluster-name (例:/aws/parallelcluster/testCluster)
  • ログストリーム名 : {hostname}.{instance_id}.{logIdentifier} (例:ip-172-31-10-46.i-02587cf29cc3048f3.nodewatcher)

ノードにログインせずにログを確認したい場合は、こちらをご利用ください。

なお、クラスター作成失敗時のロールバックが有効になっていると、失敗時にロググループも削除されます。ご注意ください。

最後に

AWS ParallelClusterの開発時に役に立ちそうなTIPSを紹介しました。

HPCはコンポーネントが複雑に絡み合っていてトラブルシュートが大変ですが、問題を一つ一つ分解して解決しましょう。