NIIF szuperszámítógépek használata
Ez a wiki oldal a NIIF Intézet (Nemzeti Információs Infrastruktúra Fejlesztési Intézet) szuperszámítógépes szolgáltatásához kapcsolódó információkat tartalmazza.
For PRACE Users: please follow this link: PRACE_User_Support
A szuperszámítógépekről
Az NIIF Intézet szuperszámítógép szolgáltatása tudományos számítási feladatok futtatására, valamint tudományos célú adattárolásra szolgál. A jelenleg integrált szuperszámítógép-rendszer komponensei négy helyszínen találhatók:
- Debreceni Egyetem
- NIIFI központ
- Pécsi Tudományegyetem
- Szegedi Tudományegyetem
A tudományos számítási feladatok különböző típusainak minél szélesebb körű lefedettsége érdekében az egyes helyszíneken különböző felépítésű gépek találhatók: egy helyszínen SMP/ccNUMA, három helyszínen pedig "fat-node" fürtözött megoldás. Az alrendszereket az NIIFI nagy sávszélességű, alacsony késleltetésű HBONE+ adathálózatán keresztül, ARC grid köztesréteg, valamint harmonizált felhasználói azonosítás segítségével integráljuk egységes elvek mentén elérhető számítási egységgé. Az erőforrás jelenleg Magyarország legnagyobb tudományos számítás céljára felhasználható erőforrása, amely összesen 50 billió lebegőpontos művelet elvégzését teszi lehetővé másodpercenként. A szuperszámítógép-rendszert az NIIFI üzemelteti és fejleszti. A rendszerhez regisztrációt követően, minden olyan személy vagy kutatócsoport hozzáférhet, amely tagintézményi szerződéses kapcsolatban áll az NIIF Intézettel. A gépen megtalálhatók és futtathatók a legkorszerűbb fejlesztőeszközök és tudományos számításra szolgáló alkalmazások, valamint, az NIIF adatközpontban elhelyezett alrendszer kivételével, valamennyi alrendszer kiegészül a számítási feladatok eredményeit megjelenítő vizualizációs eszközökkel.
Magyar Szuperszámítógépek összehasonlítása
Helyszín | Budapest | Szeged | Debrecen | Pécs |
Típus | HP CP4000BL | HP CP4000BL | SGI ICE8400EX | SGI UV 1000 |
CPU-k / node | 2 | 4 | 2 | 2 |
Core-ok / CPU | 12 | 12 | 6 | 6 |
Memória / node | 66 GB | 132 GB | 47 GB | 6 TB |
Memória / core | 2.75 GB | 2.75 GB | 3.9 GB | 5 GB |
CPU | AMD Opteron 6174 @ 2.2GHz | AMD Opteron 6174 @ 2.2GHz | Intel Xeon X5680 @ 3.33 GHz | Intel Xeon X7542 @ 2.66 GHz |
Scheduler | SGE | SGE | SGE | SGE |
MPI | OpenMPI (ompi) | OpenMPI (ompi) | SGI MPT (mpt) | SGI MPT (mpt) |
Hozzáférés a szuperszámítógépekhez
A szuperszámítógépekhez kulcsos SSH használatával lehet hozzáférni. Ajánlott UTF-8 képes terminált használ az ékezetes betűk megjeelenítése érdekében. PUTTY terminál esetén a Window/Translation beállítás alatt a character set-et kell UTF-8-ra állítani.
SSH belépés
ssh USER@login.SITE.hpc.niif.hu
ahol a USER
a felhasználónév, a SITE
pedig a belépéshez használt szupergép neve: budapest, debrecen, pecs, szeged. Nem alapértelmezett kulcs használata a -i KULCS
kapcsolóval lehetséges.
Példa
Belépés a szegedi gépre, nem alapértelmezett kulccsal foobar felhasználóként:
ssh -i keys/szeged foobar@login.szeged.hpc.niif.hu
Fájl másolás SCP segítségével
Letöltés a HOME könyvtárból és feltöltés a HOME könyvtárba:
scp USER@login.SITE.hpc.niif.hu:FILE FILE scp FILE USER@login.SITE.hpc.niif.hu:FILE
Példa
A szegedi gép HOME könyvtárában lévő stuff.tgz
fájl letöltése a helyi gép aktuális könyvtárába:
scp foobar@login.szeged.hpc.niif.hu:stuff.tgz .
Adatátvitel rsync segítségével
Nagyobb fájlok ill. könyvtárstruktúrák szinkronizálásához az SSH-t és az rsync-et együtt kell használni. Fel- és leszinkronizálás:
rsync -a -e ssh DIRECTORY USER@login.budapest.hpc.niif.hu:/home/USER rsync -a -e ssh USER@login.budapest.hpc.niif.hu:/home/USER/DIRECTORY
Példa
A budapesti gépre szinkronizálom a helyi src
könyvtár tartalmát nem az alapértelmezett kulcsot használva, és a másolást nyomonkövetve:
rsync -a -h --progress -e "ssh -i keys/budapest" ./src foobar@login.budapest.hpc.niif.hu:/home/foobar
Felhasználói felület
A szupergépek elsődleges felhasználói felülete a Bash shell. Az automatikusan betöltődő NIIF Common Environment (NCE) a PS1 promptot a következőképp állítja be:
rövid CWD | BUDAPEST[login] ~ (0)$ | | | HPC állomás | | rövid gép név | korábbi parancs exit kódja
Az ütemező használata
A szupergépeken CPU óra (gépidő) alapú ütemezés működik. Ez azt jelenti, hogy a fogyasztási időtartamra (hónap) az elérhető maximális gépidő fel van osztva a felhasználók között, ez ún. Account Limit. Minden UNIX felhasználó egy vagy több számlához (Account) tartozhat és szupergépes feladatokat csak az egyes számlák terhére futtathat. A CPU óra az elhasznált gépidő (Walltime) és az igényelt processzor szám szorzata. Például a budapesti gépen 2 db node (48 processzor mag) foglalása 30 percre 48 * 30 = 1440 CPU perc = 24 CPU óra.
A CPU órát az ütemező a futás kezdetétől a befejezésig méri, ezért rendkívül fontos arról meggyőződni, hogy a futtatandó alkalmazás rendesen kihasználja-e a processzorokat. Egy üres vagy rosszul futó job hamar elhasználja a rendelkezésre álló gépidőt! Elfogyasztott gépidő esetén új jobokat már nem lehet indítani és meg kell várni a számlázási időszak végét. Minden hónap elején a gépidő limitek jóváíródnak.
Számláink állapotáról a következő paranccsal kapunk információt:
sbalance
Példa
A parancs Bob számára a következő táblázatot jeleníti meg. A felhasználó két számlához (foobar,barfoo) is hozzáfér. Saját magát megcsillagozva látja a listában. Bobbal mindkét számlán (Account oszlop) Alice is osztozik. A második oszlopban (Usage) az egyes felhasználók elhasznált gépideje, a negyeik 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 alérhető (Available) gépidőről ad tájékoztatást.
sbalance Scheduler Account Balance ---------- ----------- + ---------------- ----------- + ------------- ----------- User Usage | Account Usage | Account Limit Available (CPU hrs) ---------- ----------- + ---------------- ----------- + ------------- ----------- alice 0 | foobar 0 | 0 0 bob * 0 | foobar 0 | 0 0 bob * 7 | barfoo 7 | 1,000 993 alice 0 | barfoo 7 | 1,000 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.
Példa
Alice 2 nap 10 órára és 2 node-ra szeretne foglalást kérni, megnézi van-e elég gépidő a számláján:
sestimate -N 2 -t 2-10:00:00 Estimated CPU hours: 2784
Sajnos ebben a hónapban erre már nem telik.
Á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
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 jobok feladását a következő parancs végzi:
sbatch jobscript.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
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.
Példa
Alice felhasználó a foobar számla terhére, maximum 24 órára ad fel 96 db soros jobot. A #SBATCH --array=1-96
direktíva jelzi, hogy tömbfeladatról van szó. Az alkalmazást az srun
paranccsal kell indítani. Ebben az esetben ez egy shell szkript.
#!/bin/bash #SBATCH -A foobar #SBATCH --time=24:00:00 #SBATCH --job-name=array #SBATCH --array=1-96 srun envtest.sh
Alkalmazások beállításai
A frontend gépeken felhasználói limitek vannak beállítva. Ezekről a következő paranccsal kapunk információt:
ulimit -a
A limitek a compute node-okon és az UV-n nincsenek beállítva.
Java JVM heap méret
A memória limit miatt a Java virtuális gépen és fordító nem jól működik, ezért meg kell adni a maximális heap méretét, ami a frontend gépeken maximum 3500m:
java -Xmx512m -version javac -J-Xmx512m -version
Python Numpy és Scipy használat
A numerikus Python használatához a következő csomagokat kell betölteni:
module load python numpy scipy
A numpy és a scipy csomagok az Intel MKL OpenMP gyorsítását használják. A jobokat az openmp
párhuzamos környezetbe kell elküldeni.
HP Budapest
Fordítás
Elérhető fordítók listája
Forító | Soros | Párhuzamos |
---|---|---|
Intel Fortran | ifort | mpiif90 |
Intel C | icc | mpiicc |
GNU Fortran | gfotran | mpif90 |
GNU C | gcc | mpicc |
A fordítási paramétereket az NCE környezeti változókból érdemes kiolvasni:
NCE_OFLAGS - optimalizációs kapcsolók C és Fortran NCE_FFLAGS - Fortran kapcsolók NCE_CFLAGS - C kapcsolók NCE_LDFLAGS - könyvtárak C és Fortran
Az NCE környezeti változó listáját az nce
paranccsal kérhetjük le.
A budapesti gépen elérhető a PRACE környezet is, amely tartalmaz egy ajánlott kapcsoló és könyvtár összeállítást tartalmaz. A PRACE környezet betöltése:
module load prace
A PRACE környezet az AMD ACML matematikai könyvtárakat használja, amennyiben az Intel MKL-re van szükségünk, akkor a PRACE környezetet nem kell betölteni. A megfelelő MKL kapcsolókat az Intel Link Advisor szerint kell beállítani, pl.:
FFLAGS=-openmp -I$(MKLROOT)/include CFLAGS=-openmp -I$(MKLROOT)/include LDFLAGS=$(MKLROOT)/lib/intel64/libmkl_scalapack_lp64.a \ -Wl,--start-group \ $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a \ $(MKLROOT)/lib/intel64/libmkl_intel_thread.a \ $(MKLROOT)/lib/intel64/libmkl_core.a \ $(MKLROOT)/lib/intel64/libmkl_blacs_openmpi_lp64.a \ -Wl,--end-group -lpthread -lm
Párhuzamos környezet
OpenMP
Az OpenMP paraméterket környezeti változókon keresztül kell beállítani. Az openmp
párhuzamos SGE környezet az OpenMP szálak számát beállítja. Tovább környezeti változókat az LLNL OpenMP oldalán találtok.
MPI
Az alapértelmezett MPI könyvtár az Open MPI. Ajánlott optimalizációs kapcsolók (CPU binding):
--bind-to-core --bycore
SGI UV Pécs
A pécsi gépen csak SMP vagy MPI programok futtatása engedélyezett. Minimálisan 12 szálat lehet lefoglalni. A foglalás alapegysége a numa node, ami 2x6 processzort és 60GB memóriát tartalmaz. Érdemes 12 többszörösével számolni a lefoglalalndó szálakat, pl.: 12, 24, 48, 96... Ha 2 hatványaira van szükségünk, akkor az SGE foglalást a legközelebbi 12-es szálszámmal kérjük, és az MPI-t vagy az OMP paraméterezzük 2^n szerint.
Az alapértelmezett MPI könyvtár az SGI MPT. Ez a könyvtár biztosítja a legjobb teljesítményt az UV gépen. A felhasználói programokat ehhez a könyvtárhoz kell fordítani. Fordításhoz az Intel Link Advisor-t érdemes használni. Az ajánlott fordítás opciók:
MPI fordítási opciók
CFLAGS=-O2 -xSSE4.2 FFLAGS=-O2 -xSSE4.2 LDFLAGS=$(MKLROOT)/lib/intel64/libmkl_scalapack_lp64.a \ -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a \ $(MKLROOT)/lib/intel64/libmkl_sequential.a \ $(MKLROOT)/lib/intel64/libmkl_core.a \ $(MKLROOT)/lib/intel64/libmkl_blacs_sgimpt_lp64.a -Wl,--end-group \ -lpthread -lm
MPI és OpenMP fordítási opciók
Ebben az esetben az MKL műveletek OpenMP szálasíthatók, a program hibrid MPI és OMP módban is tud üzemelni.
CFLAGS=-O2 -xSSE4.2 -openmp FFLAGS=-O2 -xSSE4.2 -openmp LDFALGS=$(MKLROOT)/lib/intel64/libmkl_scalapack_lp64.a \ -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a \ $(MKLROOT)/lib/intel64/libmkl_intel_thread.a \ $(MKLROOT)/lib/intel64/libmkl_core.a \ $(MKLROOT)/lib/intel64/libmkl_blacs_sgimpt_lp64.a -Wl,--end-group \ -liomp5 -lpthread -lm -openmp
MPI SGE job szkript példa
#!/bin/bash ### SGE #$ -N MPITEST # 12 órás walltime limit #$ -l h_rt=12:00:00 # 384 szál lefoglalása az # mpi párhuzamos környezetben #$ -pe mpi 384 # az uv.q sor használatával #$ -q uv.q # a standard kimenet ide íródik #$ -o StdOut # a hibakimenet ide íródik #$ -e StdErr # a jelenlegi shell környezet exportálódik #$ -V ### NUMA # az StdOut-ba írja a numa node információt numactl --show ### OMP # OMP beállítások export OMP_NUM_THREADS=1 ### MPI # MPI beállítások export MPI_MEMMAP_OFF=1 # saját szkript vagy az mpirun közvetlen meghívás # 384 MPI szál fog elindulni mpirun $NSLOTS dplace -s 1 <APP>
Az `<APP>` helyére kell írni a futtatandó programot és paramétereit. A `dplace` egy SGI előtétprogram, ami az MPI szálak ideális CPU elosztását végzi, megadása javasolt, mert általában javítja a teljesítményt.
OMP SGE job szkript példa
#!/bin/bash ### SGE #$ -N OMPTEST # 12 órás walltime limit #$ -l h_rt=12:00:00 # 192 szál lefoglalása az # openmp párhuzamos környezetben #$ -pe openmp 192 # az uv.q sor használatával #$ -q uv.q # a standard kimenet ide íródik #$ -o StdOut # a hibakimenet ide íródik #$ -e StdErr # a jelenlegi shell környezet exportálódik #$ -V ### NUMA # az StdOut-ba írja a numa node információt numactl --show ### OMP # OMP beállítások export OMP_NUM_THREADS=$NSLOTS omplace <APP>
Az `omplace` egy SGI előtétprogram, ami az MPI szálak ideális CPU elosztását végzi, megadása javasolt, mert általában javítja a teljesítményt.
Monitorozás
A jobhoz rendelt cpusetet (CPU és memória szelet) a következő parancsokkal lehet megfigyelni. A grafikonokhoz ssh -X
átirányítás szükséges. A processzorterhelés grafikonján négy adat szerepel: zöld - hasznos, felhasználói terhelés, sárga - üresjárat, kék és piros - káros rendszerterhelés. Egy HPC program akkor fut "jól", ha a zöld, felhasználói terhelés maximális, a többi pedig minimális. Ideális esetben a grafikonon egyenes zöld vonalak láthatók. Nem egyenes ("ugráló") grafikon a terhelés nem egyenletes elosztására utal, ezen a CPU binding (dplace, omplace parancsok használata) általában segít.
Processzor terhelés numa node-onként (6 core), az ideális terhelés 6-nál (600%) van:
sgemon -g -n <JOBID>
Processzor terhelés CPU-nként, az ideális terhelés 1-nél (100%) van:
sgemon -g -n <JOBID>
Memória terhelés numa node-onként, a maximális terhelés 30 GB-nál van, ami core-onként 5GB-nak felel meg:
sgemmon -g -m <JOBID>
Tesztelés Linpack-kal
A monitorozást egy Linpack teszt segítségével érdemes kipróbálni. A következő parancsokkal előkészítjünk egy Linpack teszt futást a test.q
sorban:
cd $HOME mkdir linpack module load hpl/2.0.mpt cd linpack cp $LINPACK_HPL_HOME/bin/{xhpl.sh,HPL.dat} . qsub xhpl.sh
A visszakapott jobid-vel hívjuk meg a monitor parancsot:
sgemon -g -n <JOBID> sgemon -g -m <JOBID>
A képen látható ábráknak megfelelő terhelési grafikonokat kell kapnunk. A grafikonok jellege más HPC alkalmazások esetén is ilyennek kell legyen ("egyenes" zöld vonal).