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 unix@fi.muni.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á.
  • 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.

GPU výpočty

Server Aura disponuje dvěma GPU kartami, jmenovitě NVIDIA A100 80 GB PCIe.

Upozornění: Aura je první server ve správě CVT, který je osazený i GPU kartami, a tedy není vyloučené, že vše nebude fungovat hladce už ze začátku. Pokud tedy máte nějaké připomínky nebo rady, neváhejte nám napsat.

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

Pro optimální využití GPU je důležité nespouštět souběžně více výpočtů na jednotlivých logických 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 slouží nástroj nvidia-smi.

[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 (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 unix@fi.muni.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.

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.