slurm: Simple Linux Utility for Resource Management
本家様 https://slurm.schedmd.com/

ジョブスケジューラ。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 とかで同期されている
2014y12m21d_132425146.png

役目ホスト名IPアドレスcore数GPUOScgroup備考
管理ノードslurm192.168.0.691-RockyLinux 9.4v1slurmctldが起動
計算ノードn1192.168.0.141A2000Ubuntu 20.04v1,v2(unified)slurmdが起動
n2192.168.0.152T600RockyLinux 9.1v2
n3192.168.0.164-ubuntu 22.04v2
s192.168.0.74GT710*2RockyLinux 9.1v2
ジョブ発行ノードslurm-client192.168.0.201-RockyLinux 9.1srun,sbatchの
他TORQUEコマンドも使用可能

cgroup v1 or v2 は「mount -l | grep cgroup」で見分けられる
queue構成

queue名対象ノード備考
workqn1,n2
gpun3GPUカード2枚

下拵え:共通アカウントの作成

共通アカウントslurmを用意します。samba/ユーザ登録とかNIS#df5a057bとかLDAP/dataとかで

ユーザ名UIDGIDホームディレクトリlogin shellコマンド(nisの場合)備考
slurm50005000/var/lib/slurm/sbin/nologingroupadd -g 5000 slurm
useradd -M -d /var/lib/slurm -s /sbin/nologin -u 5000 -g slurm slurm

mungeを使って管理ノードと計算ノードの信頼関係を結んでましたが、slurm内の機能でそれが代用可能になりましたので、mungeは使いません

slurmパッケージの構築とインストール

クラスターが単一のOSであるなら別途パッケージを製作してslurmの起点を「/opt/slurm」に集約させ共有するのもいいかなと思うが、
クラスターの各ノードのOSがまちまちであるならOS提供のパッケージをそのまま利用した方がいいかな
パッケージを作成するなら slurm/rpmbuild ubuntuでソースから作るslurm/ubuntu

各ノードでインストールするパッケージ(RHEL系)

パッケージ名称(RHEL系)Summary備考管理ノード計算ノードジョブ投入ノードSlurmdbdノード備考
slurmSlurm Workload Manager基本キットubuntuでは「slurm-client」かな
slurm-slurmctldSlurm controller daemon管理デーモン
slurmctld.service
---ubuntuでは「slurmctld」
slurm-slurmdSlurm compute node daemon計算ノードデーモン
slurmd.service
---ubuntuでは「slurmd」
slurm-pam_slurmPAM module for restricting access
to compute nodes via Slurm
pam_slurm.so
pam_slurm_adopt.so
---
slurm-torqueTorque/PBS wrappers for transitition
from Torque/PBS to Slurm
ラッパープログラム
qsub,qstatとか
slurm-perlapiが必須
---ubuntuでは「slurm-wlm-torque」
slurm-openlavaopenlava/LSF wrappers for transitition
from OpenLava/LSF to Slurm
ラッパープログラム
slurm-perlapiが必須
---
slurm-slurmdbdSlurm database daemonsystemctl対応
slurmdbd
---ubuntuでは「slurmdbd」
slurm-sqlSlurm SQL support----

ほかslurm-APIパッケージの「slurm-perlapi(libslurmdb-perl)」、開発環境向けの「slurm-devel(slurm-wlm-basic-plugins-dev)」、ツール類「slurm-contribs」がある.

恐らく複数台になると思うので ansible を作ってみた slurm/ansible

gpu対応slurm/gpu
アカウンティング対応slurm/accounting
torqueラッパーslurm/Torque
Prolog/epilog slurm/prolog
x11 slurm/x11
Slurm-web slurm/web

確認

[illya@slurm-client ~]$ sinfo -N -l
Sun Dec 25 20:56:52 2022
NODELIST   NODES PARTITION       STATE CPUS    S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
n1             1    workq*        idle 1       1:1:1  16001        0      1   (null) none
n2             1    workq*        idle 2       1:2:1  15732        0      1   (null) none
n3             1    workq*        idle 4       1:4:1  16000        0      1   (null) none
[illya@slurm-client ~]$

各ノードは 1CPU ソケットで、1core、2core、4core構成です

STATEがdownとかなっていたら「scontrol update nodename=node_name state=idle」でidleに変更できる
STATEがdown/draindedになった理由は「sinfo -R」で確認できます

実行テスト

簡単なテストを行ってみます。
job queuing systemなのでバッチファイルを作ってジョブを流してみます. 使うコマンドは「sbatch」です

[illya@slurm-client ~]$ vi a.sh
#!/bin/bash
hostname
echo "sleeping..."
sleep 10
echo "done!"
 
[illya@slurm-client ~]$ sbatch a.sh    <-- ジョブファイル「a.sh」を投入
Submitted batch job 41
 
[illya@slurm-client ~]$ squeue         <-- 確認
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                41     workq     a.sh    illya  R       0:01      1 n1
(結果確認)
[illya@slurm-client ~]$ cat slurm-41.out
n1
sleeping...
done!
[illya@slurm-client ~]$

な感じで動いている. 実際には「a.sh」の中に「#SBATCH」で始まるディレクティブを加えますが、ここは簡単に.

次にインターラクティヴでジョブを投げたいと思います. slurmは「srun」コマンドで

[illya@slurm-client ~]$ srun --pty bash
illya@n1:~$ 
illya@n1:~$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
workq*       up   infinite      1  alloc n1
workq*       up   infinite      2   idle n[2-3]
illya@n1:~$ exit
 
(n3を指定して)
[illya@slurm-client ~]$ srun --nodelist=n3 --pty bash
illya@n3:~$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
workq*       up   infinite      1    mix n3               <-- mixなのでまだ余裕がある
workq*       up   infinite      2   idle n[1-2]
illya@n3:~$ exit
 
(4coreを使うと宣言)
[illya@slurm-client ~]$ srun  --ntasks=4 --pty bash
illya@n3:~$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
workq*       up   infinite      1  alloc n3               <-- allocとなって全て払い下げられた.
workq*       up   infinite      2   idle n[1-2]
illya@n3:~$ exit
[illya@slurm-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    #これで実行される

GPUを使ってみる

[illya@slurm-client ~]$ sinfo -N -o "%N %G"
NODELIST GRES
n1 gpu:1(S:0)
n2 gpu:1(S:0)
n3 (null)
[illya@slurm-client ~]$
[illya@slurm-client ~]$ srun --gres=gpu:1  --pty nvidia-smi -L
GPU 0: NVIDIA RTX A2000 (UUID: GPU-23cc3ee7-31d3-a068-2f61-5aa00052d084)
 
[illya@slurm-client ~]$ srun --gres=gpu:1 -w n1 --pty bash
illya@n1:~$ nvidia-smi -L
GPU 0: NVIDIA RTX A2000 (UUID: GPU-23cc3ee7-31d3-a068-2f61-5aa00052d084)
illya@n1:~$ exit
exit
[illya@slurm-client ~]$ srun --gres=gpu:1 -w n2 --pty bash
[illya@n2 ~]$ nvidia-smi -L
GPU 0: NVIDIA T600 (UUID: GPU-01226552-df75-5989-c2f3-3550cdc3427d)
[illya@n2 ~]$ exit
exit
[illya@slurm-client ~]$

複数のGPUを持っているノードへのテスト

[illya@slurm-client ~]$ srun --gres=gpu:1 -w s --pty bash
[illya@s ~]$ nvidia-smi -L
GPU 0: NVIDIA GeForce GT 710 (UUID: GPU-f0753e20-06f7-695a-f325-b5b6342393ba)
[illya@s ~]$ exit
exit
[illya@slurm-client ~]$
[illya@slurm-client ~]$ srun --gres=gpu:2 -w s --pty bash
[illya@s ~]$ nvidia-smi -L
GPU 0: NVIDIA GeForce GT 710 (UUID: GPU-f0753e20-06f7-695a-f325-b5b6342393ba)
GPU 1: NVIDIA GeForce GT 710 (UUID: GPU-34c49ab7-b79d-e341-93e2-1659e9bd9e57)
[illya@s ~]$ exit
exit
[illya@slurm-client ~]$

と1枚指定したら1枚のみ。2枚指定したら2枚確保できた. そして2枚確保中に別のターミナルから再度GPUを確保するジョブを投げると待機状態になった.

めも

[illya@slurm-client ~]$ srun --gres=gpu:1 --pty nvidia-smi -L
slurmstepd: error: no gpu utilization TRES! This should never happen
GPU 0: NVIDIA GeForce GT 710 (UUID: GPU-f0753e20-06f7-695a-f325-b5b6342393ba)
 
[illya@slurm-client ~]$

と「slurmstepd: error: no gpu utilization TRES! This should never happen」が表示されるのはslurm.confで
「JobAcctGatherType=jobacct_gather/cgroup」とかを「JobAcctGatherType=jobacct_gather/none」にする

メモ

「STATE」が「completing」になる場合はslurmのuid/gidが異なる場合とか。同じに変更しましょう

最新の60件
2024-10-11 2024-10-10 2024-10-09 2024-10-08 2024-10-06 2024-10-05 2024-10-04 2024-10-03 2024-10-02 2024-10-01 2024-09-30 2024-09-29 2024-09-28 2024-09-27 2024-09-22 2024-09-20 2024-09-17 2024-09-12 2024-09-09 2024-09-08 2024-09-06 2024-09-05 2024-09-04 2024-09-02 2024-09-01 2024-08-31 2024-08-28 2024-08-18 2024-08-17 2024-08-16 2024-08-15 2024-08-14 2024-08-11

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-10-05 (土) 06:38:01