Introduction to MetaCentrum

Přesně před rokem, zrovna když začínal letní semestr akademického roku 2020/2021 a svět si pomalu začínal uvědomovat, jaké riziko může koronavirus přinést, jsem já začal řešit jiný palčiví problém. Zapsal jsem si totiž předmět Deep Learning vedený Milanem Strakou a již dopředu mi bylo jasné, že trénování modelů založených na hlubokých neuronových sítích na svém notebooku bez grafické karty nemám šanci upočítat. Co ale s tím? Koupi externí GPU jsem po shlédnutí jejich cen okamžitě zavrhl a investice do výkonného stolního počítače jen kvůli jednomu předmětu mi přišla přitažená za vlasy. Naštěstí jsem se od kamaráda dozvěděl o existenci MetaCentra, s jehož pomocí jsem předmět úspěšně absolvoval (a to dokonce se ziskem čokolády za soutěžní úlohu 🍫).

Po přednášce na IF2021 jsem se dozvěděl o existenci NGC, což prácí s MetaCentrem výrazně usnadněje. Doporučuji tedy prostudovat jako první. :)

Tento text byl vytvořen jako podpůrný materiál pro přednášku na InstallFest 2021. Bohužel jsem však kvůli vysokému množství přihlášených přednášek dostal pouze 20+5 minutovou dotaci a tak se do mého povídání zdaleka nevměstná vše, co bylo původně zamýšleno. Z tohoto důvodu budu text velmi často prokládat odkazy na stránky/příklady/repozitáře, kde se zvídavý čtenář dokazující si všechny triviální důkazy z matematických skript může dočíst více.

Slidy můžete najít v repozitáři papers/intro-to-metacentrum.

Přednáška na InstallFest 2021

Co je to MetaCentrum

Povězme si nejprve, co to MetaCentrum vlastně je. Jedná se o Národní Gridovou Infrastrukturu (anglicky National Grid Infrastructure - NGI), tedy velké množství výpočetních a úložných prostředků sloužicí členům Akademické obce k výpočtům pestré pleády úloh a problémů. O správu a údržbu se stará sdružení CESNET ve spolupráci s jednotlivými VŠ a ústavy Akademie Věd ČR. K dispozici jsou tří základní typy služeb:

  1. Grid - propojení výpočetních clustrů jednotlivých organizací a věděckých týmů a jednotný přístup k nim. Umožňuje spouštět jednotlivé joby.
  2. Cloud - infrastruktura jako služba, což je cloud rozhraní určeno pro řešení nestandardních požadavků. Umožňuje spouštět celé virtuální stroje a následné výpočty v nich.
  3. Hadoop - open-source framework pro distribuovaná datová úložiště a distribuované zpracování velkých objemů dat za použití algoritmu MapReduce.

V tomto článku se zaměříme výhradně na první jmenovanou službu, tedy grid.

Geolokační mapa MetaCentra, [zdroj](https://www.e-infra.cz/)

Pravidla využití

Detailní informace lze nalézt na Pravidla využití.

Členství v MetaCentru je bez omezení umožněno všem osobám akademického prostředí České republiky a to pouze za účelem výzkumu. V případě zájmu ze strany pracovníků komerční firmy (resp. její výzkumné části) či akademického pracovníka provádějícího komerční výzkum je nezbytně nutné Váš zájem a jeho možné naplnění s námi konzultovat. Zahraniční studenti na českých vysokých školách mohou MetaCentrum využívat po dobu svého studia, stejně tak zahraniční zaměstnanci českých akademických institucí mohou MetaCentrum používat po dobu svého zaměstnaneckého poměru.

Vzpomeneme-li si na Imatrikulační ceremoniál, dojde nám, že i student vysoké školy je člen Akademické obce ČR a tutíž mu je umožněno bez omezení užívat vypočetních prostředků MetaCentra. Pro získání přístupu je nutné pouze podat Přihlášku a odsouhlasit Prohlášení uživatele. Heslovitě se uživatel zavazuje, že:

  • bude využívat MetaCentrum pouze pro akademické účely,
  • nebude poskytovat přístup k MetaCentru třetí osobě,
  • nebude se chovat jako drsnej hacker a snažit se získat oprávnění, která míti nemá,
  • bude brát ohled na ostatní uživatele a nebude obcházet plánování výpočtů,
  • každý kalendářní rok podá stručnou písemnou zprávu o prováděných činnostech,
  • ve svých odborných publikací uvede poděkování MetaCentru.

Zde mi dovolte dvě poznámky. Zaprvé opravdu berte na vědomí, že na MetaCentru nepracujete sami! Chovejte se tedy tak, jak chcete, aby se chovali druzí (výpočty spouštějte výhratně utilitou qsub a omezte složité výpočty na frondendu na minimum). A zadruhé, výroční zprávy se není třeba děsit, stačí pouze uvést, k čemu jste MetaCentrum používali a pokud byl výsledkem třeba nějaký článek nebo Vaše diplomová práce, neváhejte ji zmínit.

Základní pojmy

Nebudeme zde znovu vynalézat kolo a odkážeme se rovnou na Beginners guide.

Uvedu zde však zapamatování hodné pasáže a pokusím se zdůraznit věci, které pokládám za důležité.

Front-End vs. Back-End

On frontends there must not be done any resource-demanding operations, such as computing or large-scale compiling and archiving, as it affects negatively all other logged in users. It is necessary to submit such operations as an interactive job.

Je třeba důsledně rozlišovat mezi frontendem a backendem. A mít vždy na paměti následující:

  1. Front-End - slouží k přípravě skriptů a dat. V žádném případě zde nepouštíme žádné složité výpočty (viz citace výše). Až se budete divit, proč vám frondent běží nějak divně pomalu, vzpomeňte na tento odstavec. Na 99% nějaké ucho pouští něco, kde nemá… Proto prosím buďte ohleduplní!
  2. Back-End - slouží k samotným výpočtům. Zde tedy chcete pořádně přiložit pod kotlem.

Schéma Froned-End a Back-End, [zdroj](https://wiki.metacentrum.cz/wiki/Soubor:The_grid_graphics.jpg)

Výpočet

The correct way is to send the computational job to PBS (portable batch system). PBS keeps track of the computational resources across the whole grid and runs the job only after enough resources have been freed.

Pro spuštění výpočtu je nutné využít příkaz qsub. Ten je možné spustit ve dvou základní režimech:

  1. Interaktivní (přepínač -I) - kdy po získání prostředků dostaneme k dispozici konzoli na backendu. Slouží zejména k ladění a debugování.
  2. Batch - spustí předložený skript na backendu.

Vedle určení režimu, je nutné specifikovat výpočetní prostředky. To je možné buď přímo na příkazové řádce, nebo ve spouštěném skriptu hned po shebang.

Specifikace zdrojů

qsub -l select=ncpus=2:mem=4gb:scratch_local=1gb -l walltime=2:00:00

kde:

  • ncpus je počet procesorů (v našem příkladě 2)
  • mem je velikost rezervované RAM paměti (v našem příkladě 4GB)
  • scratch_local udává velikost a typ scratch adresáře (v našem příkladě 1GB)
  • walltime je maximální doba výpočtu ve formátu hh:mm:ss (v našem příkladě 2 hodiny)

alternativně:

#!/bin/bash
#PBS -N myFirstJob
#PBS -l select=1:ncpus=2:mem=4gb:scratch_local=1gb
#PBS -l walltime=2:00:00

Pro výpočet s GPU je nutné specifikovat frontu -q gpu. Více na About scheduling system.

Výčet důležitých příkazů

Pro zobrazení aktuálních spouštěných výpočtů využijeme:

# Show actual jobs submitted jobs
qstat -u USERNAME
# Interupt job
qdel JOB_ID

Úklid

In case of erroneous job ending, the data are left in the scratch directory. You should always clean the scratch after all potentially useful data has been retrieved. To do so, you need to know the hostname of machine where the job was run, and path to the scratch directory.

Nezapomneňte tedy po sobě také uklízet…

Výběr softwaru

Při výpočtech často potřebujeme pracovat s různými balíčky a programy (typicky PyTorch, Tensorflow). MetaCentrum má nejčastěji používané programy již předinstalované a je potřeba je pouze načíst. v K tomuto účelu slouží utilita module.

jenicek@skirit:~$ module avail 2>&1 | less                           # shows all currently available applications
jenicek@skirit:~$ module add pytorch-1.1.0_python-3.6.2_cuda-10.1    # loads PyTorch v1.1.0 with Python3.6.2
jenicek@skirit:~$ module list                                        # shows currently loaded applications in your environment
jenicek@skirit:~$ module unload pytorch-1.1.0_python-3.6.2_cuda-10.1 # unloads PyTorch v1.1.0 with Python3.6.2

Bohužel jsou k dispozici často pouze starší verze balíčků. Alternativou je instalace vlastních balíčku. Konkrétně pro Python si můžeme vytvořit virtuální prostředí (virtualenv) a do něj nainstalovat příslušné verze balíčků. Zde výrazně zdůrazňuji, že příprava virtuálního prostředí musí běžet výhratně na backendu (zde je ideální využít interaktivní mód).

Pro instalaci a běh balíčků využívající GPU do virtuálního prostředí je zapotřebí načtnení modulu pytorch-1.1.0_python-3.6.2_cuda-10.1. To se sebou nese ovšem další potíže popsané v juhlik/metacentrum.

Jednoduchá ukázka

Zde si ukážeme malou ukázku pro trénink modelu rozpoznávající ručně psané číslice z datasetu MNIST. Konkrétně využijeme mírně modifikovaný příklad z repozitáře pytorch/examples a sice mnist_pytorch_example.py.

Smutným faktem je, že ani po hodině usilovného přemlouvání jsem nebyl s to zprovoznit trénování modelu pomocí předpřipravených balíčků čítaných utilitou module. Poníženě jsem se tak uchýlil k vlastnímu virtualenv prostředí, kde jsem nainstaloval nejaktuálnější verze balíčků torch a torchvision.

  1. Příprava virtuálního Python prostředí a instalace potřebných balíčků. Podrobnější informace v repozitáři juhlik/metacentrum.
  2. Spuštění interaktivního jobu pomocí qsub -I.
  3. Načtení potřebných modulů pomocí module add python/3.8.0-gcc-rab6t.
  4. Aktivace virtuálního prostředí.
  5. Změna adresáře na $SCRATCHDIR.
  6. Zkopírování skriptu do $SCRATCHDIR.
  7. Spuštění skriptu z $SCRATCHDIR.
# Show also
python ~/brno2/git/metacentrum/cuda_test/torch_test.py

# Exact commands
qsub -I -l select=1:ncpus=4:ngpus=1:mem=4gb:scratch_local=2gb:cluster=adan -q gpu -l walltime=2:00:00
module add python/3.8.0-gcc-rab6t cudnn-7.6.4-cuda10.1
module add python/3.8.0-gcc-rab6t
source ~/brno2/envs/py38-torch/bin/activate
source ~/envs/py38-torch/bin/activate
cd "$SCRATCHDIR"
cp ~/brno2/example/mnist_pytorch_example.py .
python mnist_pytorch_example.py

Repozitář juhlik/metacentrum

Za rok práce s MetaCentrem jsem si vytvořil obsáhlý skript, který automatizuje spouštění výpočtů. Podporuje mimo jiné hyperparameter grid search. Dále se v repozitáři nachází uklízecí skript pro smazání scratch adresářů pro předčasně ukočené výpočty.

Change log:

  • Minor changes 05/04/2021: Add link to IF, mention NGC.