Výpočetní servery s GPU: Arachne a Aura
Server aura.fi.muni.cz je dostupný zaměstnancům, PhD studentům a dohodářům FI
pro dlouhodobější, náročnější nebo GPU výpočty. Novější a výkonnější server
arachne.fi.muni.cz je dostupný primárně PhD studentům FI a také zaměstnancům
FI. Pro studijní nebo výzkumné účely můžou doktorandi nebo zaměstnanci
FI požádat o přidělení přístupu dalším
osobám. Pokud je to ale možné, směrujte využití primárně na
GPU Nymf, pak na Auru a až pak na Arachne (a viz též
přehled GPU na FI). Přístup k serverům Aura a Arachne je možný
jenom ze sítě MU.
Hardwarová konfigurace
Server Arachne je postaven na platformě Asus ESC8000A-E13P v konfiguraci:
- dva 96-jádrové procesory AMD EPYC 9655 2,6 GHz (celkem 192 fyzických jader a 384 vláken).
- 2.25 TiB DDR5 RAM 2800 MHz
- 10 Gbps ethernetové připojení
- 2 NVMe o kapacitě 960 GB v RAID 1
- 8 NVMe disků o kapacitě 15,36 TB zapojených v RAID 10
- 4 GPU karty NVIDIA H200 141 GB PCIe s NVLink
- operační systém Red Hat Enterprise Linux
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í 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 třeba přísnější limit využitelné paměti, limit na počet jader CPU (100 % = 1 jádro) nebo další limity:
systemd-run --user --scope -p MemoryMax=9G -p CPUQuota=400% program
Programem může být i příkazový řádek (např. bash). Limity se budou
uplatňovat na něj i všechny jeho potomky dohromady.
V tom je rozdíl i výhoda 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, condaapod. 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 výpočetních serverech k dispozici dva adresáře:
- Adresář
/tmpje 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/tmpse nachází na rychlém svazku RAID nad NVMe.
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í nebo také
pro odložení výsledků práce a uvolnění místa na /var/tmp lze též
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 NVIDIA A100 80 GB PCIe a server Arachne zas čtyřmi GPU kartami NVIDIA H200 141 GB PCIe.
Pokud byste měli k funkčnosti nebo způsobu práce s GPU na Auře/Arachne náměty, rádi se o nich dozvíme.
GPU výpočty na Auře/Arachne nejsou v současné době nijak systémově omezeny, a je nutné se chovat ohleduplně k ostatním.
Výběr karty
Oproti dávně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 či gpu-stat 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 unixKeoIh5eKv@fiowk3sut3b.munisMBOhqY18.cz ji lze změnit, pokud to tedy
okolnosti (jiné běžící výpočty) rozumně dovolí.
CUDA a nvcc
Pokude chcete využívat nvcc (nebo související nástroje), najdete jej
v /usr/local/cuda-$VER/bin/nvcc. Případně si můžete nainstalovat i jinou verzi
přes Podman.
Rezervace GPU karty
V odůvodněných případech (např. konání workshopu nebo prezentace) je možné
požádat na unixJVGQTLcPR@fi3PyeJ2oeb.munizCihUmG58.cz o rezervaci celé GPU karty pro
konkrétního uživatele či skupinu uživatelů.
Rezervaci je nutné domluvit s dostatečným předstihem z důvodu technických omezení – rezervace zabrání spouštění nových úloh na dané GPU kartě, avšak již běžící výpočty mohou nadále probíhat.
Podpora kontejnerů – Podman
Pro výpočty je na výpočetních serverech k dispozici i nástroj Podman, který
poskytuje stejnou funkcionalitu jako Docker. Díky překladové vrstvě
podman-docker můžete používat i příkaz 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.
Podman a sdílení adresářů
Pro mapování adresáře lze využít přepínače --volume, -v HOST-DIR:CONTAINER-DIR:OPTIONS
(viz dokumentace).
Pro správné nastavení oprávnění je vhodné použít možnost --userns=keep-id:uid=1000,gid=1000,
která mapuje oprávnění aktuálního uživatele na uživatele s ID 1000 v kontejneru.
Namapování současného pracovního adresáře do kontejneru může vypadat následovně:
--userns=keep-id:uid=1000,gid=1000 -v "$PWD":"$PWD":Z -w "$PWD"
--userns=keep-id:uid=1000,gid=1000- nastavení oprávnění uživatele-v "$PWD":"$PWD":Z- mapování$PWDs možnostíZpro SELinux soukromé přeznačení-w "$PWD"- nastavení pracovního adresáře kontejneru na$PWDmísto/
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 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 lokálně ze serveru. 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.