HPC環境でのバッチジョブのテスト環境をRaspberry Piクラスタで作成する

> 本記事は Advent Calendar 2021 (Raspberry Pi) 参加記事です。

# HPC環境でのバッチジョブのテスト環境をRaspberry Piクラスタで作成する

![pugaku_outlook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/10f83216-ac52-56a3-c69f-c9ced506b72d.jpeg)


スーパーコンピュータなどの一般的なHPC(High Performance Computing)環境を使用する場合、複数の計算機ノードに対しバッチジョブスクリプトの実行要求を行います。

![科学技術計算vsビジネスシステム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/a6a1993b-9286-c6b0-ade0-ee15cc215bc1.png)


HPC環境下で実行されるプログラムは、いわゆるビジネスシステムと違い、バッチによるジョブ実行が一般的です。その際に使用される、ジョブ管理ソフトウェアもHPC環境向けのものとなります。

> 例えば、スーパーコンピュータ「富岳」は富士通社のFujitsu Software Technical Computing Suiteのpjsub/pjdel/pjstat/pjcancelコマンドを使用します。


HPC環境向けバッチプログラムは、ジョブ管理ソフトウェアごとに書式が決まっています。ジョブ操作コマンドのオプション指定がやや複雑で毎回指定するのが大変なので、先頭のシェルスクリプトコメント部にパラメータを記述する方法が一般的です。

![並列処理ジョブスクリプトサンプル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/01ab4bd2-4a49-fc7b-bf19-993c878c5173.png)


HPCの環境でプログラムを実行させたい場合は、実行プログラム本体だけでなく、バッチプログラムも記述する必要があります。

しかし国内のスーパーコンピュータを民間利用に開放している場合は、たいてい有償であり、しかも利用可能な計算リソースに制限が設けられています。
このため、なれていない開発者がスーパーコンピュータを使用する場合、何度もトライアンドエラーを繰り返す必要がありますが、スーパーコンピュータは利用者に決して優しい環境ではありません（ハード、ソフトだけでなく、サポートデスクの冷たさも）。ビジネス系クラウドのようなサポートすら受け付けてくれない場合もあります。


とすると、各自で自前の環境である程度対処する必要がありますが、複数の計算ノードを用意したテストを行いたい場合は、それなりにお金がかかってしまいます。

そこで、近年新しいバージョンが次々と登場し、あまり気味になったRaspberry Pi 3B+(1GBメモリ)を複数束にして、 *スーパーコンピュータもどき* をつくることにしました。

> 具体的な作り方(インストール手順)については、以下のGitHubリポジトリにまとめましたので、参考にしてください。
>
> - [貧岳 pugaku](https://github.com/coolerking/fugaku_sample/tree/main/pugaku)

<div align="right"><img src="./images/pugaku.png" alt="Pugaku: Pi Cluster for Proletariat" width="30%"/></div>

貧学 (pugaku: Pi Cluster for Proletariat) は、富岳上でテスト実行する前に事前に開発・テストするためのRaspberry Pi クラスタ環境です。

Spack 構築ベース環境やSlurmジョブスクリプトの開発・テストに活用可能です。

> 富岳は`pjsub`でジョブ実行する富士通社製ジョブ管理ソフトウェアにて管理しているが、Slurmバッチスクリプトは富岳環境のものに類似しているので、ある程度はテストに使用可能。

## ハードウェア構成

手持ちに、Raspberry Pi 4が1台、Raspberry Pi 3B+が3台あったので、4をログインノード、3B+を計算ノードとしました。

![貧岳 pugaku](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213774/643b551e-a44f-671f-0ecd-a9c64148bd96.png)


- ログインノード/NFSサーバ/NISマスタ/Slurmマスタ/NTPクライアント
  - Raspberry Pi 4/2GB x 1
  - 32GB SD-Card x 1
  - AC アダプタ x 1
  - LAN ケーブル x 1

- 計算ノード/NFSクライアント/NISクライアント/Slurmワーカ/NTPクライアント
  - Raspberry Pi 3B+/1GB x 3
  - 32GB SD-Card x 3
  - AC アダプタ x 3
  - LAN ケーブル x 3

## ネットワーク構成

Raspberry Pi3B+/4にはWiFiと有線LANの2口のNICが用意されているので、ジョブ実行やHPC環境内での作業には有線側を使った運用系LANを構築しました。NISやNFSなどのプロトコルもこちら側をつかって通信するようにしておきました。

そしてジョブ投入やOSやPythonなどのパッケージ管理には、WiFi経由でインターネットに接続できるようにサービス系LANを構成しました。

- 運用系(10.0.0.0/8)
 - 5ポートHUBを使った有線によるLAN接続
  - NFS/NIS/Slurm
 - サービス系(192.168.XX.0/24)
  - インターネットに接続可能なWiFiルータとの接続
  - apt/pip/ssh/scp/ntp

## ソフトウェア構成

HPC環境なのですべてのノードで同じOSを使用します。今回は、Raspberry Pi OS Buster Liteを使用しました。

Raspberry Pi OSは、すでに次のバージョンも登場していますが、導入時期の最新版がBusterであったためです。
先程紹介したGitHubリポジトリ上のインストール手順は Buster 準拠になっています。

> BusterではPython 3.7.x 系だったのが、Bullseye はPython 3.9.x に更新されているなど、簡単にバージョンアップできない理由があったりします。

ログインノードはNFSサーバとしての役割を与え、以下のディレクトリを全ノードで共用します。このため起動時は最初に、停止時は最後にログインノードをシャットダウンする必要があります。

- /home
- /opt/share

また、ログインノードは NISマスタの役割も担当させています。スレーブはなしです。

HPC環境向けジョブ管理ソフトウェアは、OSSであるSlurm Workload Manager を使用します。

- [Slurm Workload Manager公式ドキュメント（英語）](https://slurm.schedmd.com/documentation.html)

バッチジョブファイルの書式は、ターゲットとするスーパーコンピュータ環境とはちがうかもしれませんが、HPC系ジョブスケジューラは、Slurmによるジョブ操作に似ていることが多いので、それほどポータビリティで苦労することはないと思います。以下のリンクなどを参考にして使ってみてください。

- [Slurm チートシート](https://slurm.schedmd.com/pdfs/summary.pdf)

## 実行環境

一番厄介なのが実行環境です。近年はOSSを活用した科学技術計算が増えてきましたが、HPC環境のサポートは学者肌の人が多く、優しく対応してくれることはまれです。

このため、自分でOSS環境を構築する、つまり一般ユーザのホームディレクトリ内でOSSバイナリをコンパイル・インストールする必要があります。

OSSにあかるい人なら、それほど苦痛には感じないかもしれませんが、HPC環境では個別のベンダ提供コンパイラを使用することが多く、並列処理用コンパイラのオプションはいわゆるgccなどとくらべ複雑です。

このような複雑なHPC個別環境に対応するコンパイルやバイナリを提供するために、最近よく使われるのが Spack です。

- [Spack公式ドキュメント（日本語）](https://spack.readthedocs.io/ja/latest/)

spack は、デフォルトでgitやPython3が使用可能な環境であればすぐに使用できます。

```bash
cd ${HOME}
git clone https://github.com/spack/spack
. ${HOME}/spack/share/spack/setup-env.sh
spack compilers
spack find
```

各スーパーコンピュータ管理側が固有のリポジトリを提供していることがあり、これを利用することで複雑なオプション指定などをspackにまかせることもできます。

..が、リポジトリ整備をしっかりしてくれているHPC環境はそれほど多くありません。結局各自でリポジトリを育てていく必要があります。
その際には Spack を使い倒す必要があります。一応チュートリアルも提供されているのですが、日本語バージョンがないので、勝手に翻訳してみました。自分でリポジトリをそだてたいという人は、まずこのチュートリアルをすべて実行しておきましょう。

- [Spack v0.16.2 チュートリアル日本語勝手翻訳版](https://github.com/coolerking/spack_tutorial_v0.16.2_jpn)

## さいごに

実はまだ自分もトラリアンドエラーの繰り返しで、なかなかOSS環境の構築がうまくいっていなかったりします。

Spackをつかって、あらためてしるapt/yum/pipのありがたみ..



以下、ご参考まで。

- [富岳の使い方～富岳で機械学習](https://speakerdeck.com/coolerking/fu-yue-falseshi-ifang-fu-yue-deji-jie-xue-xi)