Használati dokumentáció
SLURM ütemező használata
A szuperszámítógépen CPU óra (gépidő) alapú ütemezés működik. A felhasználóhoz tartozó Slurm projektek (Account) állapotáról a következő parancs ad információt:
sbalance A második oszlopban (Usage) az egyes felhasználók elhasznált gépideje, a negyedik oszlopban pedig a számla összesített gépideje látható. Az utolsó két oszlop a maximális (Account Limit) és a még elérhető (Available) gépidőről ad tájékoztatást.
User |
Usage |
Account |
Usage |
Account Limit |
Available (CPU hrs) |
bob * |
7 |
foobar |
7 |
1000 |
993 |
alice |
0 |
foobar |
7 |
1000 |
993 |
A gépidő becslése
Nagyüzemi (production) futtatások előtt gépidőbecslést érdemes végezni. Ehhez a következő parancs használható:
sestimate -N NODES -t WALLTIME
ahol a NODES a lefoglalni kívánt node-ok száma, a WALLTIME pedig a futás maximális ideje.
Fontos, hogy a lefoglalni kívánt gépidőt a lehető legpontosabban adjuk meg, mivel az ütemező ez alapján is rangsorolja a futtatásra váró feladatokat. Általában igaz, hogy a rövidebb job hamarabb sorra kerül. Érdemes minden futás idejét utólag az sacct paranccsal is ellenőrizni.
Állapotinformációk
Az ütemezőben lévő jobokról az squeue, a klaszter általános állapotáról az sinfo parancs ad tájékoztatást. Minden beküldött jobhoz egy egyedi azonosítószám (JOBID) rendelődik. Ennek ismeretében további információkat kérhetünk. Feladott vagy már futó job jellemzői:
scontrol show job JOBID
Minden job egy ún. számlázási adatbázisba (accounting) is bekerül. Ebből az adatbázisból visszakereshetők a lefuttatott feladatok jellemzői és erőforrás-felhasználás statisztikái. A részletes statisztikát a következő paranccsal tudjuk megnézni:
sacct -l -j JOBID
A felhasznált memóriáról a következő parancs ad tájékoztatást:
smemory JOBID
A lemezhasználatról pedig a
sdisk JOBID
Slurm figyelmeztető üzenetek
Resources/AssociationResourceLimit - Erőforrásra vár
AssociationJobLimit/QOSJobLimit - Nincs elég CPU idő vagy a maximális CPU szám le van foglalva
Piority - Alacsony prioritás miatt várakozik
Az utóbbi esetben, csökkenteni kell a job által lefoglalni kívánt időt. Egy adott projekt részére maximálisan 512 CPU-n futhatnak jobok egy adott időben.
Licencek ellenőrzése
Az elérhető és éppen használt licencekről a következő parancs ad információt:
slicenses
Karbantartás ellenőrzése
A karbantartási időablakban az ütemező nem indít új jobokat, de beküldeni lehet. A karbantartások időpontjairól a következő parancs ad tájékoztatást:
sreservations
Összesített felhasználás
Egy hónapra visszamenőleg az elfogyasztott CPU perceket a következő paranccsal kérhetjük le:
susage
Teljes fogyasztás Ha szeretnénk tájékozódni arról, hogy egy bizonyos idő óta mennyi a CPU idő felhasználásunk akkor azt ezzel a paranccsal tudjuk lekérdezni:
sreport -t Hours Cluster AccountUtilizationByUser Accounts=ACCOUNT Start=2015-01-01
Feladatok futtatása Alkalmazások futtatása a szupergépeken kötegelt (batch) üzemmódban lehetséges. Ez azt jelenti, hogy minden futtatáshoz egy job szkriptet kell elkészíteni, amely tartalmazza az igényelt erőforrások leírását és a futtatáshoz szükséges parancsokat. Az ütemező paramétereit (erőforrás igények) a #SBATCH direktívával kell megadni.
Kötelező paraméterek
A következő paramétereket minden esetben meg kell adni:
#!/bin/bash
#SBATCH -A ACCOUNT
#SBATCH --job-name=NAME
#SBATCH --time=TIME
ahol az ACCOUNT a terhelendő számla neve (elérhető számláinkról az sbalance parancs ad felvilágosítást), a NAME a job rövid neve, a TIME pedig a maximális walltime idő (DD-HH:MM:SS). A következő időformátumok használhatók: „minutes”, „minutes:seconds”, „hours:minutes:seconds”, „days-hours”, „days-hours:minutes” és „days-hours:minutes:seconds”.
GPU-k lefoglalása
A GPU-k lefoglalása a következő direktívával történik:
#SBATCH --gres=gpu:N
Az N a GPU-k/node számát adja meg, ami partíciótól függően 1-4 vagy 1-8 lehet.
Interaktív használat
Rövid interaktív feladatokat az «srun» paranccsal tudunk beküldeni, pl.:
srun -l -p gpu -n 1 -t TIME --gres=gpu:1 -A ACCOUNT APP
Interaktív terminál kérése CPU partíción 8 CPU core-ral, core-onként 2000MB RAM-mal a default account-ra:
srun -p cpu -c 8 --mem-per-cpu=2000 --pty bash
Batch job-ok indítása
A jobok feladását a következő parancs végzi:
sbatch slurm.sh
Sikeres feladás esetén a következő kimenetet kapjuk:
Submitted batch job JOBID
ahol a JOBID a feladat egyedi azonosítószáma.
A feladat leállítását a következő parancs végzi:
scancel JOBID
Nem újrainduló jobok
Nem újrainduló jobokhoz a következő direktívát kell használni:
#SBATCH --no-requeue
Feladat sorok
A szuperszámítógépen négy, egymást nem átfedő, sor (partíció) áll rendelkezésre, a CPU, a GPU, az AI, és a BigData sor. Mind a négy éles számolásokra való.
A cpu első olyan CN gépeket tartalmaz amelyben 2 db AMD CPU van
A gpu-ban 1 db AMD CPU és 4 db A100 GPU van.
Az ai-ban 2 db AMD CPU és 8 db A100 GPU van.
A bigdata-ban összesen 12 db Intel CPU és összesen 12 TB memória található.
Az alapértelmezett sor a CPU. A GPU partíciót a következő direktívával lehet kiválasztani:
#SBATCH --partition=gpu
A szolgáltatás minősége (QOS) A szolgáltatást alapértelmezett minősége normal, azaz nem megszakítható a futás.
Magas prioritás A magas prioritású jobok maximum 24 óráig futhatnak, és kétszer gyorsabb időelszámolással rendelkeznek, cserébe az ütemező előre sorolja ezeket a feladatokat.
#SBATCH --qos=fast
Alacsony prioritás
Lehetőség van alacsony prioritású jobok feladására is. Az ilyen feladatokat bármilyen normál prioritású job bármikor megszakíthatja, cserébe az elhasznált gépidő fele számlázódik csak. A megszakított jobok automatikusan újra ütemeződnek. Fontos, hogy olyan feladatokat indítsunk alacsony prioritással, amelyek kibírják a véletlenszerű megszakításokat, rendszeresen elmentik az állapotukat (checkpoint) és ebből gyorsan újra tudnak indulni.
#SBATCH --qos=lowpri
Memória foglalás
Alapértelmezetten 1 CPU core-hoz 1000 MB memória van rendelve, ennél többet a következő direktívával igényelhetünk:
#SBATCH --mem-per-cpu=MEMORY
ahol MEMORY MB egységben van megadva. A maximális memória/core partíciónként eltér:
CPU: 2000 MB / core
GPU: 4000 MB / core
ai: 4000 MB / core
bigdata: 42000 MB / core
Email értesítés
Levél küldése job állapotának változásakor (elindulás,leállás,hiba):
#SBATCH --mail-type=ALL
#SBATCH --mail-user=EMAIL
ahol az EMAIL az értesítendő email cím.
Tömbfeladatok (arrayjob)
Tömbfeladatokra akkor van szükségünk, egy szálon futó (soros) alkalmazást szeretnénk egyszerre sok példányban (más-más adatokkal) futtatni. A példányok számára az ütemező a SLURM_ARRAY_TASK_ID környezeti változóban tárolja az egyedi azonosítót. Ennek lekérdezésével lehet az arrayjob szálait elkülöníteni. A szálak kimenetei a slurm-SLURM_ARRAY_JOB_ID-SLURM_ARRAY_TASK_ID.out fájlokba íródnak. Az ütemező a feltöltést szoros pakolás szerint végzi. Ebben az esetben is érdemes a processzorszám többszörösének választani a szálak számát. Bővebb ismertető
#!/bin/bash
#SBATCH -A ACCOUNT
#SBATCH --job-name=array
#SBATCH --time=24:00:00
#SBATCH --array=1-96
srun envtest.sh
OpenMPI feladatok
MPI feladatok esetén meg kell adnunk az egy node-on elinduló MPI processzek számát is (#SBATCH –ntasks-per-node=). A leggyakoribb esetben ez az egy node-ban található CPU core-ok száma. A párhuzamos programot az mpirun paranccsal kell indítani.
#!/bin/bash
#SBATCH -A ACCOUNT
#SBATCH --job-name=mpi
#SBATCH -N 2
#SBATCH --ntasks-per-node=8
#SBATCH --time=12:00:00
mpirun --report-pid ${TMPDIR}/mpirun.pid PROGRAM
OpenMPI FAQ: http://www.open-mpi.org/faq
OpenMP (OMP) feladatok
OpenMP párhuzamos alkalmazásokhoz maximum 1 node-ot lehet lefoglalni. Az OMP szálák számát az OMP_NUM_THREADS környezeti változóval kell megadni. A változót vagy az alkalmazás elé kell írni (ld. példa), vagy exportálni kell az indító parancs előtt: export OMP_NUM_THREADS=8
A következő példában egy taskhoz 8 CPU core-t rendeltüunk, a 8 CPU core-nak egy node-on kell lennie. A CPU core-ok számát a SLURM_CPUS_PER_TASK változó tartalmazza, és ez állítja be az OMP szálak számát is.
Alice felhasználó a foobar számla terhére, maximum 6 órára indít el egy 8 szálas OMP alkalmazást.
#!/bin/bash
#SBATCH -A foobar
#SBATCH --job-name=omp
#SBATCH --time=06:00:00
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK ./a.out
Hibrid MPI-OMP feladatok
Hibrid MPI-OMP módról akkor beszélünk, ha a párhuzamos alkalmazás MPI-t és OMP-t is használ. Érdemes tudni, hogy az Intel MKL-el linkelt programok MKL hívásai OpenMP képesek. Általában a következő elosztás javasolt: az MPI processzek száma 1-től az egy node-ban található CPU foglalatok száma, az OMP szálak ennek megfelelően az egy node-ban található összes CPU core szám vagy annak fele, negyede (értelem szerűen). A jobscript-hez a fenti két mód paramétereit kombinálni kell.
A következő példában 2 node-ot, és node-onként 1-1 taskot indítunk taskonként 10 szállal. Alice felhasználó a foobar számla terhére, 8 órára, 2 node-ra küldött be egy hibrid jobot. Egy node-on egyszerre csak 1 db MPI procesz fut ami node-onként 8 OMP szálat használ. A 2 gépen összesen 2 MPI procesz és 2 x 8 OMP szál fut.
#!/bin/bash
#SBATCH -A foobar
#SBATCH --job-name=mpiomp
#SBATCH --time=08:00:00
#SBATCH -N 2
#SBATCH --ntasks=2
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=8
#SBATCH -o slurm.out
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
mpirun ./a.out