はじめに
こんにちは、(株)日立製作所 研究開発グループ サービスコンピューティング研究部の小林です。
DockerやKubernetesに代表されるコンテナ技術がWebアプリ開発を始め様々な場面で使われるようになりました。最近ではHPC向けのコンテナランタイムとしてSingularity
が開発され、より一層コンテナ活用の幅が広がりそうですね。
本日のアドベントカレンダーでは、HPCジョブスケジューラの一つであるSlurm
クラスタとコンテナオーケストレータのKubernetes
クラスタを同居させSingularity
ベースのワークロードを双方から実行可能な環境を構築してみます。
アドベントカレンダーではHPCジョブスケジューラの一つであるPBS
に関する記事もあるので興味がある方は要チェックです。
なぜ同居させるのか
データ分析技術の多様化
従来のデータ分析に関するいくつかの主要な動向として、HPCクラスタを用いた大規模バッチ処理や並列同期型のシミュレーションなどが挙げられます。また、新しいデータ分析の潮流として機械学習や深層学習も一般的になりつつあります。
機械学習に関する技術開発は近年一層活発に行われ、開発技術がコンテナイメージとして公開されています。更にはコンテナのスケーラビリティや可搬性/再現性を最大化するコンテナオーケストレータ
としてKubernetesが台頭し、コンテナを用いた機械学習のワークフローを管理するKubeflowなどの便利技術なども続々と開発されています。
HPCジョブスケージューラへのコンテナ統合
一方で、従来のHPCクラスタを用いたバッチ/パラレルジョブにコンテナ技術
を取り入れる動きがあります。HPCジョブスケジューラの一つであるSlurmではコンテナ化されたジョブの実行をサポートし始めたり、HPCでの実行を想定したコンテナランタイムであるSingularityなども登場したことを受け、HPCジョブスケジューラとコンテナの距離は縮まっています。
HPCジョブとコンテナアプリのワークロード統合
更には、Kubernetes側からも従来のHPCジョブとコンテナベースの処理のワークロード統合を示唆するブログ記事や、Singularity用のKubernetes対応コンテナランタイムインターフェース(CRI)としてSingularity-CRIが開発されています。
特に、Singularity-CRIの登場により、HPCクラスタの多量のリソースの以下のような柔軟な活用が可能になります。
- 従来のHPCジョブ実行
- 実験作業の再現性確保が容易なコンテナベースのHPCジョブ実行
- GPUなどの潤沢なリソースを投入した高スケールなコンテナベースのデータ分析
構成
SlurmとKubernetes(K8s)の同居クラスタを作ります。UbuntuベースのマスタサーバにはSlurmとK8sのマスタとして役割を、ワーカサーバには同じくSlurmとK8sのワーカとしての役割を実行させます。
また、K8sのコンテナランタイムには、一般的なDocker(Containerd)ではなくSingularityを使います。
手順
概要
手順の概要を示します。マスタサーバとワーカサーバではデーモンや依存ソフトで共通するものも多いので、作業が分岐する場合は適宜言及します。
- Slurmクラスタを構築する
- Singularityを導入する(マスタ/ワーカ共通)
- Singularityの導入
- Singularity-CRI(Sycri)の導入
- K8sクラスタを構築する
- マスタ/ワーカ共通準備
- K8sマスタの構築
- K8sワーカの構築
- CNIの設定
1. Slurmクラスタを構築する
1.1. マスタ/ワーカ共通準備
Slurmサーバの構築方法は公式のQuickStartを参照します。
依存ツールのライブラリが足りないエラーが起きたのでこちらのサイトも参考にしています。
まずは認証用のMUNGEをインストールします。
sudo apt update
sudo apt install -y munge libmunge-dev libmunge2
sudo systemctl start munge && sudo systemctl enable munge
MUNGE
はデーモンを起動すると認証用の秘密鍵を/etc/munge/munge.key
に作成します。この秘密鍵はSlurmクラスタのマスタ・ワーカで共通のものを使うので1.3.
にてマスタの鍵をコピーします。また、MUNGE
は/var/log/munge
以下にログを出力しますが、フォルダ所有者がユーザMUNGE
でない場合起動に失敗する場合があります。
最新版のSlurmを入手してインストールします。執筆時点での最新版はslurm-19.05.4
です。
インストール前に、依存するライブラリ等を導入していきます。
sudo apt install -y build-essential python
続いてSlurmをソースコードからビルドします。ビルド後にMUNGE
のライブラリに参照できないエラーが出たのでconfigure
のフラグを追加しました。
wget https://download.schedmd.com/slurm/slurm-19.05.4.tar.bz2
tar --bzip -x -f slurm*tar.bz2
cd slurm-19.05.4
sudo ./configure --with-munge="/usr/bin/munge"
sudo make && sudo make install
Slurm
関連のサービスファイルを/etc/systemd/system/
以下にコピーします。
sudo cp /home/ubuntu/slurm-19.05.4/etc/*.service /etc/systemd/system/
また、公式のSuper Quick Startの7 NOTE
にあるように、Slurm用のユーザを作成します。
sudo adduser slurm
Slurmユーザは、/var/run/spool
, /var/log/syslog
への参照や書込権限が必要なのでグループなりユーザに権限を付与します。環境によってポリシーが異なると思いますが、root
グループなどにslurm
ユーザを加えて適宜必要なフォルダにグループ権限を与えるなどの対応があると思います。
1.2. Slurmマスタの構築
Slurm
マスタサーバを構築します。構築前にMUNGE
サービスが正常に動いていることをsystemctl status munge
などで確認しておきましょう。
マスタサーバ構築では、Slurmクラスタ
のコンフィグ作成が主な作業になります。コンフィグの作成はSlurmが提供するWebGUI
に必要事項を入力して出力されるファイルを/usr/local/etc/slurm.conf
に配置します。
私はUbuntuサーバ版を入れてしまったので、他のPCからブラウザアクセスして作成することにしました。設定のためだけにapache2
を入れてhttp://HOSTNAME:80/html2/configurator.easy.html
にアクセスします。
sudo apt install -y apache2
sudo ln -s /home/ubuntu/slurm-19.05.4/doc/html /var/www/html/html2
サーバの設定に必要なリソース情報は下記のコマンドで適宜取得します。
# CPU関連
lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
> CPU(s): 2
> Thread(s) per core: 1
> Core(s) per socket: 1
> Socket(s): 2
# メインメモリ関連
free -m
> total used free shared buff/cache available
> Mem: 7976 102 5514 0 2359 7570
> Swap: 0 0 0
ひとしき入力し終えたらsubmit
ボタンを押して得られる情報を/usr/local/etc/slurm.conf
として出力します。
マスタサーバではslurmctld
をサービスとて起動します。
sudo systemctl start slurmctld && sudo systemctl enable slurmctld
起動後にCan't open PID file /var/run/slurmctld.pid (yet?) after start: No such file or directory
などのエラーが出る場合がありますが、適宜ユーザやフォルダの権限を見直します。
1.3. Slurmワーカの構築
ワーカで実施するべき作業は大きく2つです。
-
MUNGE
の秘密鍵をマスタサーバから入手し利用 -
Slurm
のコンフィグをマスタサーバから入手し利用
作業がうまく行かない場合は、マスタサーバとワーカサーバのMUNGE
サービスやslurm
関連サービスがキチンとActive
になっているか適宜確認します。
MUNGE
インストール後、マスタサーバのmunge.key
をコピーしてMUNGE
サービスを再起動します。
sudo scp SOME_USER@SLURM_MASTER:/etc/munge/munge.key SONE_USER@SLURM_WORKER:/ect/munge/munge.key
sudo systemctl restart munge
エラー無くサービスが起動できたことを確認します。
Slurmをインストール(サービスファイルのコピー含め)したのち、Slurmコンフィグ
をコピーして利用します。
sudo scp SOME_USER@SLURM_MASTER:/usr/local/etc/slurm.conf SONE_USER@SLURM_WORKER:/usr/local/etc/slurm.conf
sudo chown root:root /usr/local/etc/slurm.conf
sudo start slurmd && sudo systemctl enable slurmd
ここまで完了し、Slurm
マスタサーバでMUNGE
とSlurmCtld
が、ワーカサーバでMUNGE
とSlurmd
が正常稼働していること確認してからマスタサーバでsinfo
を実行します。AVAIL
がup
ならSlurmクラスタの起動完了です。
sinfo
> PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
> debug* up infinite 1 idle test-slurm2
前編のおわりに
本日の投稿ではSlurm
とKubernetes
の同居クラスタ構築に関して、システム構成とSlurmクラスタの構築手順を紹介しました。後編の投稿ではSingularity
とSingularity-CRIを利用して稼働するKubernetes
クラスタの構築手順とクラスタのサンプル実行を紹介したいと思います。