Aura
Server aura.fi.muni.cz
je dostupný zaměstnancům a PhD studentům FI pro
dlouhodobější, náročnější nebo GPU výpočty. Pro studijní nebo výzkumné
účely můžou zaměstnanci FI požádat o přidělení přístupu dalším osobám přes
unixEafqTLV02@fi-lQS6hGiU.munivSfWZcYVS.cz
. Přístup k serveru Aura je možný jenom ze
sítě MU.
Hardwarová konfigurace
Server Aura
je postaven na platformě Asus RS720A-E11-RS24U v konfiguraci:
- dva 64-jádrové procesory AMD EPYC 7713 2,0 GHz (celkem 128 fyzických jader a 256 vláken).
- 2 TiB DDR4 RAM 3200 MHz
- 10 Gbps ethernetové připojení
- 2 SATA SSD o kapacitě 960 GB v RAID 1
- 2 NVMe disky o kapacitě 6 TB zapojené v RAID 1
- 2 GPU karty NVIDIA A100 80 GB PCIe s NVLink
- operační systém Red Hat Enterprise Linux
Viz také blogový příspěvek představující tento server.
Způsob práce na výpočetních serverech
Doporučujeme seznámit se i s obecnými informacemi o provozování výpočtů.
Dlouhodobě běžící procesy (hodina a více) spouštějte se
sníženou prioritou (v rozsahu 10–19, 19 je nejnižší), například
nice ./your_program
nebo nice -n 15 ./your_program
.
Pro změnu priority už běžícího procesu lze použít příkaz
renice
,
ale pozor na to, že proces může běžet ve
více vláknech a změna priority pro jeden proces může změnit prioritu
jenom jednoho vlákna. Výpis všech vláken svých procesů včetně priority
můžete získat například takto:
ps x -Lo pgid,pid,tid,user,nice,tty,time,args
Krátkodobé procesy nebo interaktivní ladění vašich programů můžete provádět s normální prioritou.
V případě, že váš proces nebude dodržovat omezení na prioritu a bude využívat velké množství výpočetního výkonu, bude v rámci předcházení omezování ostatních uživatelů všem vašim procesům nastavena nejnižší priorita 19. U opakovaného nebo vážnějšího porušování tohoto pravidla vám může být dočasně zablokován fakultní účet.
Omezení paměti pomocí systemd
Horní limit využití paměti v systému lze zjistit pomocí příkazu níže. Po překročení tohoto limitu se spustí mechanizmus OOM, který se pokusí ukončit vhodný proces.
systemctl show -p MemoryMax user-$UID.slice
Můžete si však vytvořit vlastní systemd scope, ve kterém lze nastavit přísnější (nižší) limit využitelné paměti:
systemd-run --user --scope -p MemoryMax=9G program
Programem může být i příkazový řádek (např. bash
). Limit na paměť se bude
uplatňovat na něj i všechny jeho potomky dohromady.
V tom je rozdíl oproti mechanizmu ulimit
, kde omezení platí pro každý proces zvlášť.
Užitečné může být monitorování jak vytvořeného scope, tak i uživatelského scope:
# monitoring of the memory and CPU usage of your processes
systemd-cgtop /user.slice/user-$UID.slice
Omezení zdrojů pomocí ulimit
Příkazy limitování využití prostředků:
# limit available resources
help ulimit
# cap the size of virtual memory to 20000 kB
ulimit -v 20000
# cap the amount of total CPU time to 3600 seconds
ulimit -t 3600
# cap the number of concurrently running threads/processes
ulimit -u 100
Výše uvedené příkazy omezí zdroje shellu a všech jeho potomků na
uvedené hodnoty. Tyto nelze navýšit zpět; pro obnovu prostředí bez
nastavených omezení bude nutno spustit další separátní shell. Pozor ale
na to, že zdroje nastavené pomocí ulimit
platí pro každý proces
zvlášť. Pokud tedy nastavíte limit na 20 MB paměti a spustíte v takovém prostředí 10 procesů, mohou v součtu alokovat 200 MB paměti.
Pokud chcete jen omezit celkovou paměť na 20 MB, využijte systemd-run
.
Specifický software
Pokud pro svou práci potřebujete doinstalovat knihovny nebo nástroje, máte (kromě lokální kompilace) několik možností:
- pokud jsou součástí distribuce (
dnf search software-name
), můžete požádat správce o instalaci, - můžete si vyrobit modul,
- pokud jde o balíček pro Python, můžete požádat správce o jeho instalaci
do modulu
python3
. Můžete jej instalovat i lokálně pomocípip/pip3 install --user
. Při využitívirtualenv, conda
apod. doporučujeme instalovat prostředí do/var/tmp/login
(pozor na životnost souborů viz níže).
Diskové kapacity
Pro dočasná data, která by měla být rychle lokálně dostupná, jsou na serveru Aura k dispozici dva adresáře.
- Adresář
/tmp
je typu tmpfs. Díky umístění v RAM je přístup velmi rychlý, avšak data mezi rebooty serveru nejsou perzistentní a kapacita je velmi malá. Neukládejte zde výsledky výpočtů, ať při zaplnění nezpůsobíte celosystémové problémy. - Adresář
/var/tmp
se nachází na rychlém NVMe RAID 1 svazku.
Výhodou jejich využívání, zejména u výpočtů náročných na I/O, je také nižší
zátěž sítě a serveru s úložišti home
a data
.
Chcete-li využívat tento prostor, ukládejte si svá data
do adresáře se svým loginem. Data, ke kterým se nepřistupuje (dle atime
), jsou
automaticky promazávána, u /tmp
při stáří v řádu dnů, u /var/tmp
v řádu měsíců (přesné nastavení najdete v souboru
/etc/tmpfiles.d/tmp.conf
). Diskové kvóty se zde neuplatňují; buďte
však ve využívání místa ohleduplní k ostatním.
Pokud přístup k datům nemusí být rychlý a není dlouhodobě intenzivní, lze také
uvažovat o úložišti data
, kde dočasně můžeme i výrazně navýšit kvótu.
GPU výpočty
Server Aura disponuje dvěma GPU kartami, jmenovitě NVIDIA A100 80 GB PCIe.
Pokud byste měli k funkčnosti nebo způsobu práce s GPU na Auře náměty, rádi se o nich dozvíme.
GPU výpočty na Auře nejsou v současné době nijak systémově omezeny, a je nutné se chovat ohleduplně k ostatním.
Výběr karty
Oproti dřívějšímu stavu není vyloženě problematické souběžné spouštění výpočtů na jednom GPU. Pokud je GPU karta rozdělená pomocí technologie MIG (Multi-Instance GPU), pak lze mít několik neovlivňujících se virtuálních GPU (instancí).
Před zahájením výpočtu si musíme vhodně nastavit proměnnou prostředí
CUDA_VISIBLE_DEVICES
. K výběru vhodné hodnoty lze použít informace z nvidia-smi
nebo také nástroj
nvisel
:
[user@aura ~]$ nvidia-smi
Thu Jan 18 10:48:06 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.10 Driver Version: 535.86.10 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA A100 80GB PCIe On | 00000000:21:00.0 Off | On |
| N/A 59C P0 236W / 300W | 35141MiB / 81920MiB | N/A Default |
| | | Enabled |
+-----------------------------------------+----------------------+----------------------+
| 1 NVIDIA A100 80GB PCIe On | 00000000:61:00.0 Off | 0 |
| N/A 43C P0 44W / 300W | 4MiB / 81920MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| MIG devices: |
+------------------+--------------------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA JPG |
| | | ECC| |
|==================+================================+===========+=======================|
| 0 3 0 0 | 25MiB / 19968MiB | 28 0 | 2 0 1 0 0 |
| | 0MiB / 32767MiB | | |
+------------------+--------------------------------+-----------+-----------------------+
| 0 4 0 1 | 17577MiB / 19968MiB | 28 0 | 2 0 1 0 0 |
| | 2MiB / 32767MiB | | |
+------------------+--------------------------------+-----------+-----------------------+
| 0 6 0 2 | 17514MiB / 19968MiB | 14 0 | 1 0 1 0 0 |
| | 2MiB / 32767MiB | | |
+------------------+--------------------------------+-----------+-----------------------+
| 0 11 0 3 | 12MiB / 9728MiB | 14 0 | 1 0 1 1 1 |
| | 0MiB / 16383MiB | | |
+------------------+--------------------------------+-----------+-----------------------+
| 0 12 0 4 | 12MiB / 9728MiB | 14 0 | 1 0 0 0 0 |
| | 0MiB / 16383MiB | | |
+------------------+--------------------------------+-----------+-----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 4 0 902451 C ./computation0 17544MiB |
| 0 6 0 902453 C ./computation1 17494MiB |
+---------------------------------------------------------------------------------------+
Zde v první tabulce vidíme výpis GPU karet a hlavně v posledním políčku
informaci o zapnutí MIG (indikováno slovy Enabled
a Disabled
). V této ukázce
karta GPU0 je rozdělená pomocí MIG a druhá karta GPU1 rozdělená není.
V druhé tabulce vidíme jednotlivé GPU instance s přidělenými zdroji. Pokud žádná
z karet není rozdělená, tabulka MIG devices:
se nezobrazí.
V poslední tabulce vidíme spuštěné výpočty. V ukázce probíhají výpočty na rozdělené kartě GPU0 na oddílech 4 a 6. Vybrat si tedy můžeme z nerozdělené karty GPU1, kde je 80GB paměti, nebo z rozdělené karty GPU0, kde jsou volné instance s GI 3 (20 GB), 11 (10 GB) a 12 (10 GB).
Pokud jsme si vybrali nerozdělenou kartu nastavíme CUDA_VISIBLE_DEVICES
na
index GPU karty (CUDA_VISIBLE_DEVICES=1
). Pokud jsme si vybrali oddíl s GI 11
(MIG Dev
3) z rozdělené karty GPU0, je potřeba si zjistit její UUID. K tomu
slouží nvidia-smi -L
.
[user@aura ~]$ nvidia-smi -L
GPU 0: NVIDIA A100 80GB PCIe (UUID: GPU-309d72fd-b4f8-d6e8-6a66-e3f2253e8540)
MIG 2g.20gb Device 0: (UUID: MIG-ee0daf5f-9543-5e3f-8157-308a15c318b4)
MIG 2g.20gb Device 1: (UUID: MIG-fbb89bfe-6460-508c-ab51-9b961def7e01)
MIG 1g.20gb Device 2: (UUID: MIG-102d7a8b-5941-5275-be02-72ff5819ead4)
MIG 1g.10gb Device 3: (UUID: MIG-c4dc2f6b-2c55-566d-8738-fa8176580fda)
MIG 1g.10gb Device 4: (UUID: MIG-cd46e799-21e5-54d8-b751-f4a3afb52a46)
GPU 1: NVIDIA A100 80GB PCIe (UUID: GPU-04712e69-7356-4de5-f983-84083131460e)
Proměnnou CUDA_VISIBLE_DEVICES
nastavíme na:
CUDA_VISIBLE_DEVICES=MIG-c4dc2f6b-2c55-566d-8738-fa8176580fda
Monitorování výpočtů
Monitorovat náš výpočet můžeme buď pomocí příkazu nvidia-smi
nebo pomocí
interaktivního grafického nástroje nvitop
či nvtop
(doporučujeme mít větší
okno terminálu než 80x24). Monitorovací nástroje nedokážou zobrazit využití GPU
(Util) u rozdělených karet a zobrazují místo toho N/A
.
Změna rozdělení GPU
Pokud by pro vás existující konfigurace instancí MIGu nebyla vyhovující,
po dohodě na unixhsCMRrI4l@fiXY_hnQ=Xf.munieOozFSnn3.cz
ji lze změnit, pokud to tedy
okolnosti (jiné běžící výpočty) rozumně dovolí.
Podpora kontejnerů – Podman
Pro výpočty na serveru Aura je k dispozici i nástroj Podman, který poskytuje
stejnou funkcionalitu jako Docker. Každý uživatel má přiřazený rozsah subuid
a
subgid
podle jejich UID
a může tak využívat rootless kontejnery. Rozsah je
velikosti 100000 a začíná od UID*100000
. Ve výchozím nastavení se kontejnery
umísťují do /var/tmp/containers/xlogin
. Na tomto svazku nejsou
momentálně aplikovány žádné kvóty, proto prosíme, dbejte na svoje soubory, a
pokud již úložiště nepotřebujete, tak svoje kontejnery řádně smažte.
Podman a GPU
Oproti normálnímu spuštění kontejneru je nutné specifikovat, který oddíl GPU
chceme využít. Pro nastavení vybraného oddílu GPU se místo jeho UUID
zadává
oddíl ve formátu GPU:Device
, kde GPU
a Device
jsou čísla z výpisu
nvidia-smi -L
. Pro využití GPU 0 a oddíl 4 přidáme jako parametr --device
nvidia.com/gpu=0:4
.
Ukázka
Pokud byste chtěli použít JupyterLab s podporou TensorFlow a GPU, na stránkách Docker Hub lze nalézt například obraz gpu-jupyter (jedná se o velký obraz, první spuštění může trvat). Na serveru Aura stačí spustit:
podman run --rm --security-opt label=disable -p 127.0.0.1:11000:8888 \
-v "${PWD}":/home/jovyan/work --device nvidia.com/gpu=0:4 \
cschranz/gpu-jupyter:v1.5_cuda-11.6_ubuntu-20.04_python-only
Pozor, takto namapované kontejnery jsou dostupné pouze ze serveru Aura. Pro
širší dostupnost je nutné vytvořit si například SSH tunel (ssh -L
8888:localhost:11000 aura
). Port lze také mapovat pomocí -p 11000:8888
– pak
bude přístupný ze sítě FI.
Část -v "${PWD}":/home/jovyan/work
mapuje současný pracovní adresář dovnitř
kontejneru na /home/jovyan/work
. Tento adresář používá JupyterLab jako
pracovní adresář.
Funkcionalitu pak můžeme ověřit například pomocí tohoto kódu, který nám vrátí počet dostupných GPU (očekávaným výstupem je 1):
import tensorflow as tf
print("Number of available GPUs: ", len(tf.config.list_physical_devices('gpu')))
Další spuštění je již rychlejší, neboť stáhnutý obraz se po ukončení nemaže
automaticky. Pro vymazání pozůstatků (nevyužívaných obrazů, kontejnerů, ...) lze
využít příkaz podman system prune -a
.