Simple Linux Utility for Resource Management 本家様 slurm
ジョブスケジューラ。SunGridEngineをいろいろ調整していたのだが、、、、良く分からん。
結局TORQUEを作ってみたが、ノード指定があるのに躊躇う。必要なコア数とメモリー量だけでノードが決まる代物が欲しくて調べてみた。
Torque:
queue名称 + node(マシン数) + ppn(processors per node)
Slurm:
queue名称 + ntasks(MPI数)
計算ノード/queue設定slurm/slurm.conf
参照先https://wiki.fysik.dtu.dk/niflheim/SLURM
全体像 †
TORQUEと同じようにsamba AD or NIS, LDAP/NFS環境で/home,/Applが共有され、計算ノードはn1,n2,n3の3台で、ジョブを投入するサイトが1台。
ジョブを管理するslurm管理ノードが1台とする。
各ノードはsamba(or nis, ldap)に登録されてホスト情報は共有する. アカウント情報も共有します. 登録方法はsamba/Linux参加とか参照
各マシンの時計は chrony or ntp とかで同期され、各マシンのOSは全てCentOS 7とします

役目 | ホスト名 | IPアドレス | core数 | 備考 |
管理ノード | slurm | 192.168.0.69 | 1 | slurmctldが起動 |
計算ノード | n1 | 192.168.0.52 | 1 | slurmdが起動 |
n2 | 192.168.0.53 | 2 |
n3 | 192.168.0.54 | 3 |
ジョブ発行ノード | slurm-client | 192.168.0.20 | 1 | srun,sbatchの 他TORQUEコマンドも使用可能 |
queue構成
queue名 | 対象ノード | 備考 |
workq | n1,n2,n3 | |
gpu | e GPUカード1枚 | gpuノード |
下拵え:共通アカウントの作成とmungeのインストール †
共通アカウントslurmとmungeを用意します。samba/ユーザ登録とかNIS#df5a057bとかLDAP/dataとかで
ユーザ名 | UID | GID | ホームディレクトリ | login shell | コマンド(nisの場合) |
slurm | 5000 | 5000 | /var/lib/slurm | /sbin/nologin | groupadd -g 5000 slurm useradd -d /var/lib/slurm -s /sbin/nologin -u 5000 -g slurm slurm |
munge | 5001 | 5001 | /var/lib/munge | /bin/bash | groupadd -g 5001 munge useradd -d /var/lib/munge -s /bin/bash -u 5001 -g munge munge |
*mungeはyumでインストールした際にUID 1000以下でアカウントを作りますが、インストール前に1000以上でアカウントを作ります
そして全てのクラスターノード(slurm,n1,n2,n3,client)にmungeパッケージをインストールする。
標準リポジトリでは提供されていないようで、epelリポジトリを有効にしてインストールを行う。
[root@slurm ~]# yum install epel-release
[root@slurm ~]# yum install munge munge-libs
次に、munge.key(/etc/munge/munge.key)を作成して、mungeデーモンを起動させる
[root@slurm ~]# /usr/sbin/create-munge-key
Generating a pseudo-random key using /dev/urandom completed.
[root@slurm ~]# ls -l /etc/munge/
total 4
-r--------. 1 munge munge 1024 Apr 18 16:21 munge.key
[root@slurm ~]# systemctl enable munge.service
[root@slurm ~]# systemctl start munge.service
この作成したmunge.keyをクラスターに参加する全てのマシンに配布します
*n1,n2,n3,clientも同様にmungeパッケージのインストールも行う
例えば n1.sybyl.local マシンに対して、
[root@slurm ~]# ssh -l root n1 'yum install epel-release -y && yum install munge munge-libs -y'
[root@slurm ~]# scp /etc/munge/munge.key root@n1:/etc/munge/munge.key
[root@slurm ~]# ssh -l root n1 chown munge:munge /etc/munge/munge.key
*munge.keyファイルの所有者に留意する事
slurmサーバにAnsibleを入れて全参加ノードを仕立てさせた方がいいかも
slurmパッケージの構築とインストール †
パッケージ作成 slurm/rpmbuild *epelリポジトリで公開済みなので作らなくてもいいみたい
パッケージインストール slurm/install
恐らく複数台になると思うので ansible を作ってみた slurm/ansible
gpu対応slurm/gpu
実行テスト †
簡単なテストを行ってみます。
まずclientにslurm-torqueをインストールしたため、基本TORQUEのコマンドは使用可能です。
[illya@client ~]$ pbsnodes
n1
state = free
np = 1
ntype = cluster
status = rectime=1506418902,state=free,slurmstate=idle,size=0kb:0kb,ncpus=1,boards=1,sockets=1,(略
n2
state = free
np = 2
ntype = cluster
status = rectime=1506418902,state=free,slurmstate=idle,size=0kb:0kb,ncpus=2,boards=1,sockets=2,(略
n3
state = free
np = 3
ntype = cluster
status = rectime=1506418902,state=free,slurmstate=idle,size=0kb:0kb,ncpus=3,boards=1,sockets=3,(略
[illya@client ~]$
[illya@client ~]$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
batch* up infinite 3 idle n[1-3]
debug inact 1:00:00 1 idle n1
[illya@client ~]$ sinfo -N -l
Tue Sep 26 18:42:47 2017
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
n1 1 debug idle 1 1:1:1 1 0 1 (null) none
n1 1 batch* idle 1 1:1:1 1 0 1 (null) none
n2 1 batch* idle 2 2:1:1 1 0 1 (null) none
n3 1 batch* idle 3 3:1:1 1 0 1 (null) none
[illya@client ~]$
な感じで。
バッチジョブファイルを作ってみます。
http://www.ceci-hpc.be/slurm_tutorial.html
このサイトが非常に分かりやすかったです。
slurmでの[task]はプロセスと読み替えて、1つのジョブを2MPIプロセスで処理させるのなら-ntasks=2。1つのジョブを2スレッドで処理させるのなら--cpus-per-task=2と定義する。
[illya@client ~]$ vi a.sh
#SBATCH -J test_run # --job-name=test_run
#SBATCH -o output_%j.txt # --output=output_test_run.txt
#SBATCH -e errors_%j.txt # --error=errors_test_run.txt
#SBATCH -p batch # いわゆる使用するキュー名
#SBATCH -n 4 # --ntasks=4 このジョブで4プロセスを実行する
#SBATCH -c 2 # --cpus-per-task=2 1プロセス当たり2core使用する
mpirun mpirun.exe
[illya@client ~]$
[illya@client ~]$ sbatch a.sh #これで実行される
Not responding †
上手く動かない場合
[root@client ~]# pbsnodes
n1
state = down
np = 1
ntype = cluster
status = rectime=1419919109,state=down,slurmstate=down,size=0kb:0kb,(略
note = Not responding
[root@client ~]#
と表示されるのなら
[root@slurm ~]# systemctl stop slurmctld
[root@slurm ~]# slurmctld -c -D
:
:
<Ctrl+C>で中断
[root@slurm ~]# systemctl start slurmctld
と実施してみる
*以前は「/etc/init.d/slurm startclean」でOKだったのに...
構築における留意点 †
mungeのuid/gidは「yum install」で行うと1000番以内で発行される. それはそれで構わないのだが、
他のノード、計算ノード、ジョブ発行ノードでも同じuid/gidとは限らない. なのでnis/samba-adで共通アカウントを
作ってそこで任せた方がいいかも知れない.
その際、既にmungeが入っている場合は「/var/lib/munge」、「/run/munge」、「/var/log/munge」のuid/gidに注意が必要.
firewall, SELinuxは有効でも実行できる.
SELinuxの場合は home が nfs な事で「setsebool -P use_nfs_home_dirs 1」を全ノードで有効にする必要がある.
PrologおよびEpilog †