Slurm resursihaldur
Sisukord
Sissejuhatus
Slurm (Simple Linux Utility for Resource Management) on arvutiklastri jaoks mõeldud rakendus mille ülesandeks on jagada etteantud töid mööda arvutiresursse laiali, monitoorida töötavaid protsesse ja pidada tööde üle järjekorda.
Üldiselt näeb slurmi arhidektuur välja sarnane allolevale pildile. On keskne haldusserver, kuhu kasutajad logivad ja käske käivitavad ning terve hulk arvutusnodesid-servereid, milledele slurm töid edastab.
Slurmi klustri paigaldus
Slurmi server koosneb kolmest suuremast komponendist
- munge - autentimiseks
- slurmctl - mis juhib selle küljes olevaid kliente
- slurmdbd - mis tegeleb kasutusstatistika kogumisega ning vajab omakorda mingit andmebaasi, näiteks Mariadb'd
Munge paigaldamiseks Debianis
# apt-get install libmunge-dev libmunge2 munge
Munge võtme loomine
# sudo dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key # chown munge:munge /etc/munge/munge.key # chmod 400 /etc/munge/munge.key
See tekkinud fail tuleb kopeerida ka kõigisse klientidesse
# scp /etc/munge/munge.key <node-user>@<node-ip>:/etc/munge/munge.key
Munge käivitamine
# sudo systemctl enable munge # sudo systemctl start munge
Paigaldame Mariadb sulrmdb jaoks
# apt-get install mariadb-server
Slurm on andmebaasi parameetrite osas üsna nõudlik ning vajab innodb seadistamist
Debianis tuleb avada /etc/mysql/mariadb.conf.d/50-server.cnf ning lisada
innodb_buffer_pool_size=1024M innodb_log_file_size=64M innodb_lock_wait_timeout=900
Stardime mariadb
# systemctl start mariadb # systemctl enable mariadb
Logime sinna sisse ning tekitame Slurmi kasutaja
# CREATE USER 'slurm2'@'localhost' IDENTIFIED BY 'parool'; # GRANT ALL ON slurm_acct_db.* TO 'slurm'@'localhost';
Seejärel võime paigaldada slurmdb, nii andmebaasi enda kui kõik vajalikud andmetabelid tektiab ta seejuures ise
# apt-get install slurmdb
Tekitame slurmdbd seadistusfaili /etc/slurm-llnl/slurmdbd.conf
AuthType=auth/munge AuthInfo=/var/run/munge/munge.socket.2 StorageHost=localhost DbdHost=server-hostname StoragePort=3306 StorageUser=slurm StoragePass=parool StorageType=accounting_storage/mysql StorageLoc=slurm_acct_db LogFile=/var/log/slurm-llnl/slurmdbd.log PidFile=/run/slurmdbd.pid SlurmUser=slurm DebugLevel=1
Paneme slurmdbd käima
# systemctl enable slurmdbd # systemctl start slurmdbd
Paigaldame slurmctrli. See seadistuse osa on ühine nii peaserveril kui ka kliendil
# apt-get install slurm-wlm
Tekitame talle seadistusfaili, kus defineerime ära ühtlasi ka slurmdb ning esimese kliendi. Selleks lisame faili /etc/slurm-llnl/slurm.conf
ClusterName=slurm ControlMachine=server-hostname ControlAddr=localhost # SlurmUser=slurm SlurmctldPort=6817 SlurmdPort=6818 AuthType=auth/munge StateSaveLocation=/var/spool/slurm/ctld SlurmdSpoolDir=/var/spool/slurm/d SwitchType=switch/none MpiDefault=none SlurmctldPidFile=/run/slurmctld.pid SlurmdPidFile=/run/slurmd.pid ProctrackType=proctrack/pgid ReturnToService=0 # # Timers SlurmctldTimeout=300 SlurmdTimeout=300 InactiveLimit=0 MinJobAge=300 KillWait=30 Waittime=0 # # Accounting AccountingStorageType=accounting_storage/slurmdbd AccountingStoreJobComment=YES JobAcctGatherFrequency=30 JobAcctGatherType=jobacct_gather/linux # # Logging DebugFlags=NO_CONF_HASH SlurmctldDebug=3 SlurmctldLogFile=/var/log/slurm-llnl/slurmctld.log SlurmdDebug=3 SlurmdLogFile=/var/log/slurm-llnl/slurmd.log SlurmSchedLogFile= /var/log/slurm-llnl/slurmschd.log SlurmSchedLogLevel=3 JobCompType=jobcomp/none # # Compute nodes NodeName=slurm-test NodeAddr=10.40.0.10 Port=17000 Procs=1 State=UNKNOWN PartitionName=test Nodes=ALL Default=YES MaxTime=INFINITE State=UP
Slurmctrld käivitamiseks
# systemctl enable slurmctld # systemctl start slurmctld
Tekitame test clustri ning esimese kasutaja
# sacctmgr -i add cluster cluster # sacctmgr -i add account test Cluster=cluster # sacctmgr -i add user test Account=test
Kasutajale admin õiguste lisamiseks
# sacctmgr modify user test set adminlevel=admin
Kliendi käivitamine
# systemctl enable slurmd # systemctl start slurmd
Testimiseks võib kasutada käsku
$ srun uname -a
Lingid
https://southgreenplatform.github.io/trainings/hpc/slurminstallation/
https://gist.github.com/asmateus/301b0cb86700cbe74c269b27f2ecfbef
https://implement.pt/2018/09/slurm-in-ubuntu-clusters-pt1/
Tööde käivitamine
Saadame slurmi töö mis käivitatakse neli korda ja mis väljastab masina kerneli versiooni.
# srun --ntasks=4 uname -a srun: job 561700 queued and waiting for resources srun: job 561700 has been allocated resources idu08 idu08 idu08 idu08
Või soovides käivitada lihtsalt kokku 24 tööd kõigil nodedel ja ja lasta slurmil ise nad jagada laiali
# srun --ntasks=24 --partition=gpu hostname
Tasub muidugi tähele panna, et srun sobib peamiselt testimiseks või väga lihtsateks töödeks ning keerukamatel kasutusjuhtudel tuleks kasutada käske salloc või sbatch Põhimõtteliselt sama esimene näide skriptiga tehtuna, tekitame parallel_uname.sh
#!/bin/bash
#SBATCH –J test # Seadistab töö nime mida näeb squeue käsuga
#SBATCH –N=4 # Määrab mitut füüsilist serverit kasutatakse
#SBATCH --ntasks-per-node=4 # Määrab, mitu ülesannet ühel serveril käivitatakse
#SBATCH --output=kontroll.out # Väljundfaili nimi – programm ei edastada väljundit kohe ekraanile vaid faili.
uname -a # käsk, mida käivitatakse. Antud juhul uname -a
Lisaks võib seadistada e-maili saatmise töö lõpu korral
#SBATCH --mail-type=END # Type of email notification- BEGIN,END,FAIL,ALL #SBATCH --mail-user=ajk@123.com # Email to which notifications will be sent
Paneme käima
# sbatch parallel_uname.sh Submitted batch job 65918
Ja väljund
# cat slurm-65918.out Linux stage59 2.6.32-431.17.1.el6.x86_64 #1 SMP Wed May 7 14:14:17 CDT 2014 x86_64 x86_64 x86_64 GNU/Linux
MPI tööde käivitamine
Message Passing Interface ehk MPI on paraleelsete programmide loomiseks
Kasutamiseks on vaja laadida moodulid
module load intel module load openmpi
Slurm skript võiks näha välja järgnev
#!/bin/bash
#SLURM -J myjob
#SLURM -p mpi-core8
#SLURM -t 01:00:00
#SLURM -o myjob-%J.out
#SLURM -N 4
#SLURM --ntasks-per-node=8
module load gcc
module load openmpi
cd subdir
mpirun -np 32 ./myapp
exit 0
https://computing.llnl.gov/tutorials/mpi/
http://brazos.tamu.edu/software/openmpi.html
Tööde haldus
Tööde nimekirja näeb
# squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 561555 gpu python hpc_tane R 4-22:47:46 1 idu41 561544 gpu punct2 ottokar R 5-02:52:19 1 idu40 561538 gpu punct2 ottokar R 5-03:06:09 1 idu39 561528 gpu train_HO hpc_tane R 6-07:54:01 1 idu40 561490 gpu train_HO hpc_tane R 7-06:15:40 1 idu39 561795 long EUWEST_6 elmer R 10:09:00 1 idu30 561802 long EESTI1_7 elmer R 4:01:17 1 idu02 561801 long EESTI1_4 elmer R 4:01:18 1 idu01 561800 long EUWEST_7 elmer R 4:01:19 1 idu12 561794 long SLOVAK_6 elmer R 10:13:23 1 idu06 561793 long EESTI1_2 elmer R 16:04:42 1 idu05 561792 long EESTI1_6 elmer R 16:09:14 1 idu03 561647 long bash hpc_kuz R 3-19:32:13 1 idu04 561810 long run_R-1- hpc_eero R 1:58:03 1 idu34 561811 long run_R-1- hpc_eero R 1:58:03 1 idu31 561813 long run_R-1- hpc_eero R 1:58:03 1 idu32 561809 long run_R-1- hpc_eero R 2:08:03 1 idu29 561806 long run_R-1- hpc_eero R 2:18:03 1 idu33 561808 long run_R-1- hpc_eero R 2:18:03 1 idu35
Töö staatuse nägemiseks tuleb scontrolile anda ette JOBID
# scontrol show job 561581 JobId=561581 Name=SLOVAK_6 UserId=elmer(10010) GroupId=elmer(10010) Priority=1503 Account=(null) QOS=(null) JobState=RUNNING Reason=None Dependency=(null) Requeue=1 Restarts=0 BatchFlag=0 ExitCode=0:0 RunTime=09:06:37 TimeLimit=12:00:00 TimeMin=N/A SubmitTime=2016-02-25T06:26:02 EligibleTime=2016-02-25T06:26:02 StartTime=2016-02-25T06:26:02 EndTime=2016-02-25T18:26:02 PreemptTime=None SuspendTime=None SecsPreSuspend=0 Partition=long AllocNode:Sid=juur:22238 ReqNodeList=(null) ExcNodeList=(null) NodeList=idu38 BatchHost=idu38 NumNodes=1 NumCPUs=8 CPUs/Task=8 ReqS:C:T=2:4:1 MinCPUsNode=8 MinMemoryNode=18G MinTmpDiskNode=0 Features=(null) Gres=(null) Reservation=(null) Shared=OK Contiguous=0 Licenses=(null) Network=(null) Command=/storage/jobs/g-9.sh WorkDir=/cluster/elmer
Töö lõppu on muidugi võimatu ette teada/ennustada. Võib-olla umbes töö alustaja ise teab, kaua see VÕIKS aega võtta.
idu seisu vaatamiseks juurest või suvalisest idust anda käsk
# scontrol show node idu38 NodeName=idu38 Arch=x86_64 CoresPerSocket=6 CPUAlloc=8 CPUErr=0 CPUTot=12 CPULoad=5.82 Features=K20 Gres=gpu:2 NodeAddr=idu38 NodeHostName=idu38 OS=Linux RealMemory=48000 AllocMem=18432 Sockets=2 Boards=1 State=MIXED ThreadsPerCore=1 TmpDisk=200000 Weight=100 BootTime=2015-01-21T00:23:33 SlurmdStartTime=2015-01-21T00:24:09 CurrentWatts=0 LowestJoules=0 ConsumedJoules=0 ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/ s
Slurmi partitsioonid
Tööde paremaks halduseks on mõistlik erinevad masinad jagada erinevatesse partitsioonide gruppidesse.
Partitsioonide konfiguratsiooni nägemiseks
# sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST short* up 30:00 4 idle~ idu[08-11] short* up 30:00 16 mix idu[01-06,12,29-37] short* up 30:00 1 down idu07 long up infinite 4 idle~ idu[08-11] long up infinite 16 mix idu[01-06,12,29-37] long up infinite 1 down idu07 gpu up infinite 5 idle~ idu[08-11,38] gpu up infinite 10 mix idu[01-06,12,39-41] gpu up infinite 1 down idu07
Partitsioonide täpsem info
# scontrol show partition PartitionName=short AllocNodes=ALL AllowGroups=ALL Default=YES DefaultTime=NONE DisableRootJobs=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=00:30:00 MinNodes=1 MaxCPUsPerNode=UNLIMITED Nodes=idu[01-12],idu[29-37] Priority=100 RootOnly=NO ReqResv=NO Shared=YES:4 PreemptMode=OFF State=UP TotalCPUs=204 TotalNodes=21 SelectTypeParameters=N/A DefMemPerCPU=2048 MaxMemPerCPU=12288 PartitionName=long AllocNodes=ALL AllowGroups=ALL Default=NO DefaultTime=NONE DisableRootJobs=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=1 MaxCPUsPerNode=UNLIMITED Nodes=idu[01-12],idu[29-37] Priority=150 RootOnly=NO ReqResv=NO Shared=YES:4 PreemptMode=OFF State=UP TotalCPUs=204 TotalNodes=21 SelectTypeParameters=N/A DefMemPerCPU=2048 MaxMemPerCPU=12288 PartitionName=gpu AllocNodes=ALL AllowGroups=ALL Default=NO DefaultTime=NONE DisableRootJobs=NO GraceTime=0 Hidden=NO MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=1 MaxCPUsPerNode=UNLIMITED Nodes=idu[01-12],idu[38-41] Priority=1000 RootOnly=NO ReqResv=NO Shared=YES:4 PreemptMode=OFF State=UP TotalCPUs=144 TotalNodes=16 SelectTypeParameters=N/A DefMemPerCPU=2048 MaxMemPerCPU=12288
Näiteks antud juhul asuvad GPUsid sisalduvad noded "long" partitsioonist väljaspool, et neile muid arvutusi ei antaks.
Nodede liigutamiseks partitsoonide vahel. /etc/slurm/slurm.conf lõpus on see partitsioonide konf Muuda vastavalt partitsioone, mida tahad ja siis slurmi servisele restart (käivad tööd sellest katki ei lähe).
/etc/init.d/slurm restart
Veateated ja probleemid
Mälulimiit on programmi poolt ületatud
slurmd[n1]: error: Job 60204 exceeded 10240 KB memory limit, being killed slurmd[n1]: error: *** JOB 60204 CANCELLED AT 2011-05-27T19:34:34 ***
Mälulimiit on seadistatud liiga kõrge olemasoleva mälu jaoks
$ sbatch run.slurm sbatch: error: Batch job submission failed: Requested node configuration is not available
http://www.umbc.edu/hpcf/resources-tara-2013/scheduling-policy.php
Node staatus on "down"
Esmalt võiks proovida seda manuaalselt muuta, näiteks:
scontrol update state=MIXED nodename=node84
Lingid
http://www.schedmd.com/slurmdocs/quickstart.html