Spouštění úloh v plánovači

Z MetaCentrum
Přejít na: navigace, hledání

(English version)

Tato stránka obsahuje popis pro pokročilejší uživatele. Úvod do spouštění úloh pro úplné začátečníky je popsán na stránce Pro úplné začátečníky. Ještě více podrobností naleznete ve článku Plánovací systém - detailní popis.

PBS servery

v MetaCentru jsou tři plánovací prostředí, které se liší stabilitou a svými vlastnostmi:

  • produkční prostředí -- PBS Torque server arien.ics.muni.cz – (nelze se na něj přihlásit přímo) zaručuje maximální stabilitu, změny jsou prováděny až po důkladném otestování v testovacím prostředí. .
  • produkční prostředí rozvrhového plánovače na zdrojích centra CERIT-SC -- PBS Torque server wagap.cerit-sc.cz – (nelze se na něj přihlásit přímo), může se lišit svým nastavením - návod
  • experimentální prostředí nového plánovače PBS Proffesional -- PBSPro server arien-pro.ics.muni.cz návod


Pro obsluhu prostředí použijte některý z následujících čelních uzlů. Nehlaste se na Torque servery, přihlášení na ně není povoleno.

Přihlášení k čelnímu uzlu je podrobně popsáno na stránce Ověřování v MetaCentru. Také je k dispozici návod pro úplné začátečníky.

Schéma fungování MetaCentrum VO je na následujícím obrázku:

Metacentrum schema.png

Uživatel se hlásí pomocí ssh na libovolný čelní uzel, z něj pomocí příkazu qsub žádá o rezervaci zdrojů na určitý čas, tzv. úlohu. Příkaz qsub předá žádost o rezervaci (úlohu) některému plánovacímu systému, a plánovací systém po určité době čekání přidělí úloze požadované zdroje (stroje, procesory, paměť, licence). Stav úloh lze sledovat na portálu aplikací pbsmon.

Stručné shrnutí plánování úloh

Důležité odkazy
Úlohy, plánovač, fairshare
Syntaxe v PBS Proffesional
Podpora GUI aplikací (VNC servery)
Jak na data v úloze
Přehled dostupných souborových systémů
GPU stroje
vzorové skripty z Hands-on seminářů
PBSmon: Dostupné stroje a pomocník qsub
Syntaxe v PBS Proffesional

PBS Torque

Aplikace se v MetaCentru spouští zásadně přes plánovací systém PBS jako úlohy příkazem qsub. Při zadání úlohy je třeba zadat několik zásadních věcí:

  • maximální dobu běhu úlohy – zadáváte pomocí -l walltime=[[dny:[hodiny:]]minuty:]sekundy[.milisekundy] nebo pomocí -l walltime=[1w][1d][1h][1m][1s]. Kratší úlohy mají při spouštění přednost. Například:
    • -l walltime=10:00 - úloha bude trvat nejvýše 10 minut
    • -l walltime=3:00:00 – úloha bude trvat nejvýše 3 hodiny
    • -l walltime=25:00:00 – úloha bude trvat nejvýše 25 hodin
    • -l walltime=1d1h – úloha bude trvat nejvýše 1 den a 1 hodinu, tj. 25 hodin
    • -l walltime=4w – úloha bude trvat nejvýše 4 týdny, tj. 28 dnů
  • fronta - pokud nemáte přednostní přístup na některý konkrétní cluster, protože jste jeho vlastníkem, frontu nezadávejte
  • počet strojů a procesorů – určujete v parametru -l položkou nodes, např.
    • -l nodes=1:ppn=1 – jeden procesor na jednom stroji
    • -l nodes=1:ppn=16 – jeden stroj s 16 procesory
    • -l nodes=20:ppn=2 – dvacet dvouprocesorových strojů
      Úloha může být spuštěna na stroji se stejným nebo větším počtem procesorů.
    • Pokud si nejste jisti, kolik procesorů může úloha zabrat, použijte cgroups qsub -W cgroup=true -l nodes=1:ppn=4 -l mem=1gb ...
  • vlastnosti strojů – určujete v parametru -l v položce nodes přes vlastnosti uvedené za dvojtečkou, např.
    • -l nodes=1:ppn=1:x86_64 – stroj pro běh 64-bitových aplikací (AMD64 nebo EMT64T)
    • -l nodes=1:ppn=1:brno:amd64 – stroj v Brně s procesorem AMD Opteron
    • -l nodes=1:ppn=4:cl_tarkil – stroj se 4 CPU na clusteru tarkil – omezení na jeden cluster v MPI úlohách
    • -l nodes=1:ppn=4:^cl_manwe – negace vlastnosti, úloha nebude naplánovaná na cluster manwe
  • umístění strojů - lze specifikovat, že vybrané stroje musí mít stejnou hodnotu určitého tzv. resource, které lze poznat podle atributu stroje s prefixem resources_total., například při zadání -l place=city budou mít všechny vybrané stroje stejnou hodnotu atributu resources_total.city=brno nebo resources_total.city=praha.
    • -l place=infiniband – přidělí stroje se stejnou hodnotou zdroje infiniband, vhodné pro zrychlení MPI úloh
    • -l place=city – přidělí stroje se stejnou hodnotou zdroje city, tedy ve stejném městě
    • -l place=room – přidělí stroje se stejnou hodnotou zdroje room, tedy umístěné na stejném výpočetním sálu
    • -l place=home – přidělí stroje se stejnou hodnotou zdroje home, tedy sdílející domovské adresáře ze stejného diskového pole
  • výkon stroje - lze specifikovat požadovaný výkon v benchmarku SPECfp2006 na jedno jádro, a to uvedením vlastností minspec a maxspec. Budou vybrány stroje, jejichž vlastnost machine_spec je v uvedeném rozmezí.
    • -l nodes=1:ppn=1:minspec=10:maxspec=20 – vybere stroje s výkonem mezi minspec a maxspec
  • velikost potřebné paměti – určujete v parametru -l položkou mem. Pozor, množství paměti je na stroj, např.
    • -l nodes=1:ppn=1,mem=200mb – úloha vyžaduje 200 MiB
    • -l nodes=1:ppn=8,mem=1gb – úloha vyžaduje jeden stroj s 8 CPU a s 1GiB (1024MiB) paměti.
    • -l nodes=3:ppn=2,mem=2gb – úloha vyžaduje 3 stroje, každý se 2 CPU a 2GiB paměti
  • licence – určujete v samostatném parametru -l nebo za čárkou po specifikaci strojů a paměti, a to položkou s názvem licence (viz podrobný návod), např.
    • -l matlab=1 – úloha vyžaduje 1 licenci MATLABu
    • -l maple10=1 – úloha vyžaduje 1 licenci Maple verze 10
    • -l maple11=1 – úloha vyžaduje 1 licenci Maple verze 11
    • -l fluent=4 – úloha vyžaduje 4 licence Fluentu
  • velikost místa na rychlém úložišti pracovních dat identifikovaného proměnnou prostředí $SCRATCHDIR – určujete parametrem -l scratch=velikost:typ kde velikost je číslo následované jednotkou (např. 20gb), a typ může být jedna z hodnot ssd,local, shared, first (výchozí volba je prázdná,zkouší typy v pořadí ssd,shared,local). Význam jednotlivých typů viz stránky věnované scratch úložisti. Příklady specifikace:
    • -l scratch=1 – úloha vyžaduje 1 KiB místa
    • -l scratch=1mb – úloha vyžaduje 1 MiB místa
    • -l scratch=1gb – úloha vyžaduje 1 GiB místa
    • -l scratch=10gb:ssd – úloha vyžaduje 10 GiB místa na SSD disku
    • -l scratch=20gb:local – úloha vyžaduje 20 GiB místa na lokálním HDD
    • -l scratch=100gb:shared – úloha vyžaduje 100 GiB sdíleného místa na síťovém disku
    • -l scratch=500gb:first – úloha vyžaduje 500 GiB místa alokovaného pouze na hlavním uzlu
  • jiný prostředek - např. gpu pro počet grafických karet; prostředky určitého stroje lze poznat podle jeho atributů začínajících prefixem resources_total..
    • -l nodes=1:ppn=4:gpu=1 – požadavek na GPU úlohu na 1 uzlu s aspoň 4 CPU a aspoň 1 GPU kartou
  • zasílání informačních e-mailů o stavu jobu Například:
    • -m abe – odešle se e-mail při přerušení (a = abort), zahájení (b = begin) a ukončení (e = end) úlohy
    • -M user1@mydomain.com my_job – určí emailovou adresu, na kterou systém odešle informační mail.

Pro sestavení podmínek můžete využít pomůcku Sestavovač qsub.


Syntaxe

Při zadání požadujete dvě věci:

  • tzv. resources (prostředky), které mají určitou hodnotu, a pokud je číselná, třeba u mem, můžete požadovat méně než kolik stroj poskytuje
  • tzv. properties (vlastnosti), které na stroji buď jsou nebo nejsou nastaveny

Klíčová slova označující prostředky, tj. nodes (stroj), mem (paměť), scratch (místo na lokálním disku), walltime (čas běhu), gpu (výpočetní grafická karta), a licence matlab, fluent atd., je třeba zadávat buď v samostatných parametrech uvozených přepínačem -l, nebo oddělené čárkou, tj.

  • -l nodes=1:ppn=1 -l mem=20gb -l scratch=50gb
  • -l nodes=1:ppn=1,mem=20gb,scratch=50gb

kdežto vlastnosti prostředků se oddělují dvojtečkou, tj.

  • -l nodes=1:ppn=4:brno -l scratch=50gb:ssd

V uvedeném příkladu je hodnota 1:ppn=4:brno požadovanou specifikací zdroje nodes, a hodnota 50gb:ssd je specifikací zdroje scratch.

Při zadávání prostředku nodes je možné napsat za dvojtečku i požadavek na další prostředky tohoto uzlu, např.:

  • -l nodes=2:ppn=2:mem=2gb+3:ppn=3:mem=3gb požaduje dvojici strojů s 2 CPU a 2GB RAM, a trojici strojů s 3 CPU a 3GB RAM
  • -l nodes=2:ppn=2+3:ppn=3 -l mem=4gb požaduje dvojici strojů s 2 CPU a trojici strojů s 3 CPU, přičemž všechny mají mít 4GB RAM

Příklad

Chci naplánovat ke spuštění úlohu trvající maximálně 24 hodin, vyžadující 2 stroje, každý se 4 procesory, 4GB fyzické paměti (tj. 1GB paměti na každý procesor) a 50GB lokálního disku, přičemž procesory mají být Intel Xeon umístěné v Brně a pro každý procesor potřebuji licenci Fluentu:

qsub -l walltime=24h -l nodes=2:ppn=4:brno:xeon,mem=4gb,scratch=50gb,fluent=8 uloha.sh

Výchozí nastavení

Pokud nezadáte některé parametry příkazu qsub, výchozí nastavení je:

  • nodes=1:ppn=1 tedy 1 CPU
  • mem=400mb tedy 400 MiB RAM
  • scratch=400mb tedy 400 MiB scratch libovolného typu
  • walltime se přebere od fronty
  • fronta default, která je routovací, tj. přeposílá do jiných front podle zadaného walltime; pokud nezadáte ani walltime, úloha skončí ve frontě s limitem 24 hodin na arien a 2 hodiny na wagap

Postup plánovače

Plánovač při vybírání úloh pro spuštění postupuje tak, že si nejprve seřadí všechny čekající úlohy postupně podle následujících kritérií:

  1. priorita fronty – úlohy ve frontách s vyšší prioritou mají přednost
  2. fair share – úlohy uživatele s nižším propočítaným časem mají přednost
  3. čas úlohy – úlohy s nižším maximálním časem mají přednost. Pokud nebyl čas zadán explicitně, bere se z nastavení fronty.

Plánovač pak postupuje po seřazených úlohách a zkoumá, zda se dá úloha již spustit s ohledem na to, jaké má požadavky na zdroje, kolik zdrojů je volných a na kterých strojích má uživatel vlastnící úlohu účet.

Podrobná dokumentace

Přehled uvedený výše je jen stručné shrnutí. Podrobnější informace můžete získat

Použití souborů v aplikacích

Důležité odkazy
Přehled vašich adresářů
Druhy úložných prostorů
Práce s daty v úloze

Hlavní článek: Souborové systémy v MetaCentru

Přehled souborových systémů je na následujícím obrázku:

Filesystems.png

Na každém výpočetním uzlu i frontendu jsou k dispozici

  • rychlý lokální disk (mapovaný podle druhu do adresáře /scratch, /scratch.ssd nebo /scratch.shared)
  • několik velkých diskových polí určených pro dlouhodobé držení dat, mapovaných do adresáře /storage přes souborový systém NFSv4
  • síťový replikovaný souborový systém určený pro instalaci software, mapovaný do adresářů /software a /packages přes souborový systém AFS
  • ve městech, kde je umístěno velké diskové pole, jsou domovské adresáře přiřazeny na něj, v ostatních městech jsou přiřazeny na další síťový disk sdílený v rámci clusteru

Typy souborových systémů

K dispozici jsou tyto druhy souborových systémů:

druh výhody nevýhody
AFS v /afs/buňka/home/login dostupné všude
přesné nastavování přístupových práv pomocí ACL
pomalé
NFSv4 v /storage/umístění/home/login rychlejší než AFS přístupová práva jen na úrovni UNIXu
dostupné na strojích s vlastností nfs4
rychlý disk v /scratch nebo /scratch.ssd velmi rychlé malá velikost
není sdíleno mezi stroji
rychlý sdílený disk v /scratch.shared/login velké a velmi rychlé
sdíleno mezi všemi uzly clusteru
k dispozici pouze na clusterech mandos a hildor

Doporučené postupy

Úlohu spusťte z adresáře na svazku v /storage

Po skončení úlohy jsou soubory se standardním výstupem (stdout) a standardním chybovým výstupem (stderr) nakopírovány do adresáře na stroji, odkud byla úloha spuštěna. Jednoduché úlohy je možné spouštět pod adresářem /storage. Do adresáře /storage jsou mapována velká disková pole (kapacity v řádech stovek TB) sdílená přes NFSv4. Je dostupný na všech strojích MetaCentra označených vlastností nfs4 a můžete si ho připojit i k vlastnímu PC.


Dočasné soubory umísťujte na svazek scratch

Pokud potřebujete pracovat po dobu běhu úlohy s velkými soubory, umísťujte je na scratch (do adresáře identifikovaného proměnnou $SCRATCHDIR).. Svazek scratch je na rychlém lokálním disku (resp. rychlém síťovém disku), zdržení bude tedy minimální.

Pokud víte, že standartní výstup nebo chybový výstup Vaší úlohy bude příliš velký (více než desítky MB), přesměrujte ho v rámci úlohy do vhodného souboru na svazku scratch.

Po skončení úlohy soubory z adresáře scratch odstraňte (rm -r $SCRATCHDIR), místo bude potřeba pro další úlohu.

Přenášejte soubory přes NFSv4

Pro přenášení dat je nejefektivnější použít výpočetní uzel s vlastností nfs4 a data nakopírovat jakoby lokálně pomocí příkazu cp mezi svazky storage a scratch, tak se data kopírují přes síť jen jednou a pomocí NFSv4, které je rychlejší než ostatní způsoby. Tj.

 #!/bin/bash
 #PBS -N mujprvnijob
 #PBS -l nodes=1:ppn=1
 #PBS -l mem=500mb
 #PBS -l scratch=1gb
 # direktivy si upravte/umazte dle potreb sveho vypoctu
 
 # nastaveni uklidu SCRATCHE pri chybe nebo ukonceni
 # (pokud nerekneme jinak, uklidime po sobe)
 trap 'clean_scratch' TERM EXIT
 
 DATADIR="/storage/brno2/home/$LOGNAME/" # sdilene pres NFSv4
 
 cp $DATADIR/vstup.txt $SCRATCHDIR  || exit 1
 cd $SCRATCHDIR || exit 2 
 
  #... vlastní výpočet ...
 
 cp vystup.txt $DATADIR || export CLEAN_SCRATCH=false

Tento příklad za Vás automaticky zajistí úklid scratche po ukončení úlohy (pouze v případě, kdy se nezdaří vykopírování výsledku úlohy, např. kvůli dočasné nedostupnosti diskového pole, zůstanou data na scratchi, připravená pro manuální vyzvednutí).

Poznámka: Výše uvedený návod rovněž trvale smaže data nestandardně ukončených úloh (ukončených např. z důvodu zabití kvůli překročeným zdrojům, nejrůznějším chybám, atp.). Pokud si přejete zachovat/obdržet i data nekorektně ukončených výpočtů (např. aplikace na tyto dokáže navázat či pro účely jejich pozdější analýzy), doplňte za řádek trap 'clean_scratch' TERM EXIT následující kód:
trap 'cp -r $SCRATCHDIR/prubeh.log $SCRATCHDIR/neuplna.data $DATADIR && clean_scratch' TERM
Důležité: Je potřeba vzít na vědomí, že při násilném ukončení úlohy ze strany plánovače má úloha na své ukončení pouhých pár minut. Během této doby se musí soubory stihnout odkopírovat -- proto takto nepřenášejte příliš objemná data.

Uvedený příklad používá proměnnou $LOGNAME, aby byl nezávislý na uživateli. Příkaz clean_scratch je shellový skript zavedený automaticky všem uživatelům modulem metabase.

Podrobnější rozbor práce s daty najdete v hesle Práce s daty v úloze.

Pokud stroj nemá NFSv4, sdílejte přes AFS

Pokud umístíte soubory do svého adresáře na AFS, budou přístupné na všech strojích bez omezení. Avšak tento postup lze doporučit u strojů, které nemají NFSv4, protože rychlost zápisu a čtení přes AFS není příliš vysoká. Použijte tedy AFS například pro zdrojové kódy programů v MATLABu a podobně. Výhodou AFs je možnost detailně nastavovat přístupová práva.


stagein a stageout

Vzhledem k nedávné reorganizaci úložných systémů Vám dále již nedoporučujeme využívat parametry stagein a stageout při zadávání úlohy (přestože tyto zůstávají funkční, mají svá omezení (například nedostupnost proměnné $SCRATCHDIR, identifikující prostor pro dočasná data úlohy). Pro kopírování dat do dočasných uložišť, prosíme, využívejte lokální kopírování ze sdíleného svazku /storage (popsáno výše).


Spuštění krok za krokem

  • Nejdříve si zjistěte, jak je to s aplikací, kterou chcete používat. Zda je nainstalovaná v MetaCentru zjistíte na stránce Seznam aplikací v MetaCentru. Na stránce každé aplikace je napsáno, jakou má licenci, to je důležité vědět.
  • U nejpoužívanějších aplikací je k dispozici dokumentace i stručný návod k použití (např. dokumentace pro Amber). V návodu bývá uvedeno, jak se daná aplikace spouští, obvykle aktivací patřičného modulu. Pozor! Čelní uzly clusterů vzhledem ke svému určení pro interaktivní přípravu úloh, prohlížení výstupů apod. mohou mít oproti pracovním uzlům téhož clusteru některé SW balíky navíc. Pokud vyžadujete 100% identické prostředí pracovního uzlu (např. při přípravě úlohy, kde se bude něco automaticky kompilovat) je možné ho získat zadáním interaktivní úlohy s přesnou specifikací architektury a OS. Výpočet spustíme tak, že vytvoříte ve svém oblíbeném textovém editoru shellový skript, který obsahuje na začátku aktivaci systému modulů a aktivaci modulu dané aplikace. Příklad je na stránce Plánovací systém PBS. Tj. shellový skript bude začínat nějak takto:
#!/bin/sh
# inicializace konkrétní verze konkretní aplikace, v tomto případě paralelního Amberu verze 10
module add amber10-parallel
  • Rozmyslete si, odkud bude brát aplikace data, kde bude mít uložena dočasná data během výpočtu a kam uloží výsledky, viz oddíl Použití souborů v aplikacích. Přeneste výchozí data od sebe do MetaCentra (např. přes WinSCP). Dopište do shellového skriptu přenos dat a spuštění samotné aplikace. Obvykle přenesete data od sebe do domovského adresáře na nějakém clusteru, a v shellovém skriptu pak je na začátku jejich přenesení do pracovního adresáře (identifikován systémovou proměnnou $SCRATCHDIR) na stroji, kde bude probíhat výpočet, a na konci přenos výsledků za scratch adresáře zpátky do domovského adresáře.
  • Zadejte úlohu do plánovacího systému pomocí příkazu qsub, kterému specifikujete požadavky na přidělení strojů, paměťi a licencí, viz první oddíl na této stránce. Před spuštěním si ověřte na stránce Stav zdrojů - Osobní pohled v okénku "Sestavovač příkazu qsub", zda požadavky na množství a vlastnosti strojů jsou splnitelné.
  • Úloha bude patrně nejdříve nějakou dobu čekat, než budou volné požadované zdroje (stroje daných vlastností a případně potřebný počet licencí aplikace). Na stránce konkrétní úlohy v položce "komentář", případně na stránce Čekající úlohy můžete vidět důvod, proč nebyla úloha zatím spuštěna. Obvyklé důvody jsou:
    • Not Running: Not enough of the right type of nodes are available - není dost volných strojů požadovaných vlastností, úloha čeká, až nějaká běžící úloha skončí a uvolní zdroje
    • Not Running: User has reached queue running job limit - Fronty mají nastavené limity, kolik úloh může zároveň běžet jednomu uživateli. Máte v dané frontě více úloh, než je limit, další úloha bude spuštěna, až jiná skončí.
    • Not Running: Draining system to allow starving job to run - Ve frontě čeká víceprocesorová úloha a systém blokuje máloprocesorové úlohy, dokud nebude víceprocesorová úloha spuštěna, aby ji nepředbíhaly.


Spuštění více úloh najednou

Pokud každý výpočet trvá nejméně 4 hodiny, je nejlepší zadat každý jako samostatnou úlohu pomocí společného parametrizovaného skriptu, např.

#!/bin/bash
#PBS -l walltime=1d
#PBS -l nodes=1:ppn=8
#PBS -l mem=8GB
#PBS -q default@wagap.cerit-sc.cz
module add g09-D.01
cp $INPDIR/.inp $SCRATCHDIR/
cd $SCRATCHDIR/ 
time g09 < ${CASE}.inp >& ${CASE}.out
if [ -f $INPDIR/${CASE}.out ] ;then
  cp $SCRATCHDIR/${CASE}.out $INPDIR/${CASE}.out.new
 cp $SCRATCHDIR/${CASE}.out $INPDIR/
fi
cp $SCRATCHDIR/*.chk $INPDIR/ && rm -rf $SCRATCHDIR && echo "OK"

Úlohy pro předem připravené zadání pak hromadně zadáte takto:

cd /storage/brno2/home/fkralik/16_09/heroin/pokus_dih
for vstup in *.inp;do 
  jmeno=$(basename $vstup .inp)
  qsub -N $jmeno -v CASE=$jmeno,INPDIR="$PWD" skript.sh
done