[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
grid [2006/10/25 13:04]
novak
grid [2017/09/26 13:49]
popel
Line 1: Line 1:
-====== Sun Grid Engine (SGE) ======+====== ÚFAL Grid Engine (LRC) ======
  
-Na počítačích ''sol*'' je zprovozněn frontovací systémUmožňuje:+LRC (Linguistic Research Cluster) is a name of ÚFAL's CPU computational grid/cluster, which has (as of 2017/09) about 1600 CPU cores (115 servers + 2 submission heads), with a total 10 TiB of RAMIt uses [[https://en.wikipedia.org/wiki/Oracle_Grid_Engine|(Sun/Oracle/Son of) Grid Engine]] software (SGE) for job scheduling etc.
  
-  * využít na maximum výpočetní výkon +If you need GPU processingsee a special page about our [[:gpu|GPU cluster called DLL]] (which is actually a subsystem of LRC with independent queue ''gpu.q'').
-  * poslat mnoho úloh k řešení najednouúlohy budou ale spuštěny teprve, když na to bude čas +
-  * "spravedlivě" dělit strojový čas mezi zájemce+
  
-Jednou za život musíte provést [[Základní nastavení SGE]], abyste SGE mohli používat.+===== List of Machines ===== 
 +The list has been updated 2017/09. All machines have Ubuntu 14.04.
  
-===== Pravidla pro správné používání počítačů ''sol*'' =====+==== Trója (troja-all.q) ====
  
-Základní pravidlo, které musíme všichni ctít, aby SGE plnilo svou úlohu dobře:+==== MS = Malá Strana (ms-all.q) ====
  
-  * Nespouštět úlohy ručně(O ručně spuštěných úlohách SGE nemá informaci, klidně na daný uzel pošle ještě další úlohy z fronty.) +^ Name                ^ CPU type            ^ GHz ^cores ^RAM(GB)^ note ^ 
-  * Pokud možno používat ''nice''.+| andromeda[1-13]     | 2xCore4 AMD Opteron | 2.8 |    8 |   32 |  | 
 +| fireball[1-10]      |??2xCore4 Intel Xeon | 3.0 |    4 |   32 |  | 
 +| hyperion[1-10]      | 2xCore2 Intel Xeon  | 3.0 |    4 |   32 |  | 
 +| lucifer[1-10]       |??2xCore4 Intel Xeon | 2.4 |   16 |  128 |  | 
 +| orion[1-10]         | 2xCore4 Intel Xeon  | 2.3 |    8 |   32 |  | 
 +| tauri[1-10]         |??2xCore4 Intel Xeon | 3.0 |    4 |   32 |  | 
 +| cosmos              | 4xCore2 Intel Xeon  | 2.9 |    8 |  256 |  | 
 +| belzebub            | 8xCore4 Intel Xeon  | 2.9 |   32 |  256 |  | 
 +| iridium             |??2xCore4 Intel Xeon | 1.9 |   16 |  512 | also in ''gpu.q'' 
 +| twister[1,2]        | 2xCore4 Intel Xeon  | 2.4 |    8 |   48 | also in ''gpu.q'' |
  
-Víc pravidel není.+=== Outside LRC cluster (but located as MS) === 
 +^ Name                ^ CPU type            ^ GHz ^cores ^ RAM(GB)^ note  ^ 
 +| lrc[1,2]            | Intel???            | 2.3 |    4 |   45 | **no computing here**, just submit jobs | 
 +| pandora[1-10]       | 2xCore2 Intel Xeon  | 2.6 |      |   16 | special cluster&queue ''ms-guests.q''   | 
 +| sol[1-8,11-13]      | 2xCore4 AMD Opteron | 2.0 |      |   16 | you can ssh here and compute | 
 + 
 +**pandora machines** are in a special cluster and queue **ms-guests.q** available for our colleagues from KSVI and for students of [[http://ufal.mff.cuni.cz/courses/npfl102|Data intensive computing]] (see the 2016 handouts if you missed the course). 
 +**sol machines** are for us - we can ssh there, submit jobs and also do computing (e.g. collecting statistics from the submitted jobs). 
 +**lrc machines** are so called heads of the cluster. **No computation is allowed here**.  
 +.ufal.hide.ms.mff.cuni.cz: hlava clusteru. To znamená, že neslouží k výpočtům, ale ke správě fronty výpočtů, které se odesílají na výpočetní stroje v clusteru. Na hlavě se nemají pouštět žádné náročné výpočty a naopak na ostatní stroje v clusteru se mají výpočty odesílat výhradně prostřednictvím hlavy. Hlava má 2 procesory Intel Pentium D 3 GHz a 1 GB paměti. Ve skutečnosti existují hlavy dvě - lrc1 a lrc2, které sdílí IP adresu lrc.ufal.hide.ms.mff.cuni.cz. V případě výpadku jedné z hlav, přebírá kontrolu ta druhá.  
 +Frontovací systém umožňuje: 
 + 
 +  * využít na maximum výpočetní výkon 
 +  * poslat mnoho úloh k řešení najednou, úlohy budou ale spuštěny teprve, když na to bude čas 
 +  * "spravedlivě" dělit strojový čas mezi zájemce 
 + 
 +===== Jak začít ===== 
 + 
 +Jednou za život musíte provést [[Základní nastavení SGE]], abyste SGE mohli používat.
  
 ===== Ukázka užití SGE ===== ===== Ukázka užití SGE =====
Line 23: Line 49:
  
 <code> <code>
-ssh sol7 +ssh lrc2 
-  # přihlašte se na nějaký ze solů+  # přihlašte se na hlavu clusteru
 echo "hostname; pwd" > skript.sh echo "hostname; pwd" > skript.sh
   # vyrobte skript, který popisuje, co má úloha udělat   # vyrobte skript, který popisuje, co má úloha udělat
Line 32: Line 58:
   # Ale dodatečné parametry zařídily:   # Ale dodatečné parametry zařídily:
   #  -cwd  ... skript bude spuštěn v aktuálním adresáři (a nikoli homu)   #  -cwd  ... skript bude spuštěn v aktuálním adresáři (a nikoli homu)
 +  #  -V    ... proměnné z vašeho prostředí budou zkopírovány do prostředí skriptu
   #  -j y  ... standardní a chybový výstup bude spojen (jako to dělá nohup)   #  -j y  ... standardní a chybový výstup bude spojen (jako to dělá nohup)
   # Pořadí parametrů **je** důležité, co je za jménem skriptu, to se předává skriptu.   # Pořadí parametrů **je** důležité, co je za jménem skriptu, to se předává skriptu.
 qstat qstat
-  # Podívejme se, jaké úlohy běží.+qstat -u '*'  
 +  # Podívejme se, jaké vaše úlohy běží.
   # SGE chvíli čeká, než skript opravdu spustí. Pro malinké úlohy tedy SGE může představovat   # SGE chvíli čeká, než skript opravdu spustí. Pro malinké úlohy tedy SGE může představovat
   # zbytečné zpoždění.   # zbytečné zpoždění.
 +  # -u '*' ukáže úlohy všech uživatelů na clusteri
 cat skript.sh.oXXXXX cat skript.sh.oXXXXX
   # vypište si výstup skriptu. XXXXX je ID jobu, které bylo přiděleno   # vypište si výstup skriptu. XXXXX je ID jobu, které bylo přiděleno
Line 59: Line 88:
 qsub -S /bin/bash qsub -S /bin/bash
   # když chcete, aby skript běžel v bashi   # když chcete, aby skript běžel v bashi
-qdel all+qsub -V 
 +  # když chcete předat proměnné prostředí 
 +qdel \*
   # když chcete zrušit všechny své joby (rušit cizí nesmíte)   # když chcete zrušit všechny své joby (rušit cizí nesmíte)
 </code> </code>
 +
 +
 +
 +
 +
 +===== Pravidla pro správné používání clusteru =====
 +
 +Základní pravidlo, které musíme všichni ctít, aby SGE plnilo svou úlohu dobře:
 +
 +  * Nespouštět úlohy ručně. (O ručně spuštěných úlohách SGE nemá informaci, klidně na daný uzel pošle ještě další úlohy z fronty.)
 +    * Interaktivní shell se dá získat příkazem ''qrsh'' (přičemž specifikujete požadavky na zdroje stejně jako u ''qsub'')
 +
 +Další doporučení:
 +  * Pokud možno používat ''nice''.
 +      *  Dotaz: jak se kombinuje ''nice'' s ''qsub''em? SGE je snad nyní nastaveno tak, že vše bude nicenuté. Každopádně je dobré do submitovaného skriptu na začátek napsat ''renice 10 $$''.
 +  * Uklízet po sobě lokální data, protože jinak si tam už nikdo nic užitečného nepustí.
 +  * Vyhnout se hodně divokému paralelnímu přístupu ke sdíleným diskům. NFS server to pak nepěkně zpomalí pro všechny. Distribuujte tedy i data.
 +  * Informovat SGE, kolik paměti úloha žere, aby na strojích nedošla paměť (a používat "hard" limit, kdy SGE úlohu zabije, pokud rezervovanou paměť překročí): <code>qsub -hard -l mem_free=8G -l act_mem_free=8G -l h_vmem=8G</code>
 +
 +
 +Víc pravidel není.
 +
 +===== Slušné chování =====
 +
 +Pokud chci spouštět úlohy, které poběží dlouhou dobu (hodiny, dny), nepustím je všechny najednou, aby cluster mohli využívat i ostatní.
  
 ===== Triky a opentlení ===== ===== Triky a opentlení =====
  
-==== ~bojar/tools/qsubmit ====+ 
 +==== ~bojar/tools/shell/qsubmit ====
  
 qsubmit je jako qsub, ale příjemnější: qsubmit je jako qsub, ale příjemnější:
  
-  * nemusíte vyrábět skript, vyrobí ho sám+  * nemusíte vyrábět skript, vyrobí ho sám (pozn.: nemusíte vyrábět skript, když použijete přepínač ''-b y'')
   * nemusíte připisovat ''-cwd -j y -S /bin/bash''   * nemusíte připisovat ''-cwd -j y -S /bin/bash''
- 
  
 <code> <code>
-~bojar/tools/qsubmit "bashovy_prikaz < prismeruj > presmeruj 2> atd..."+~bojar/tools/shell/qsubmit "bashovy_prikaz < prismeruj > presmeruj 2> atd..."
 </code>  </code> 
  
 +lépe funguje ''~{stepanek,pajas}/bin/qcmd'' (nemusí se kvotovat parametry, správně počítá čas běhu...)
 +
 +==== ~zeman/bin/qsub.csh ====
 +
 +Podobná věc pro ''tcsh''. Pokud bychom chtěli použít přesměrování standardního vstupu a výstupu, musíme ho dát do uvozovek nebo apostrofů, protože jinak se o něm ''qsub.csh'' nedozví, do skriptu k odeslání to neopíše a naopak jeho standardní vstup a výstup bude přesměrován. V přesměrování i v případných dalších argumentech, kde se vyskytují cesty k souborům, je vhodné použít úplné cesty. Pozor také na to, aby šlo o soubory a složky viditelné z celé sítě (tedy ne ve vašem ''/mnt/h/tmp'', například).
 +
 +<code tcsh>setenv SCRIPTFILE /tmp/`basename $1`.$$.csh
 +echo $* > $SCRIPTFILE
 +echo $*
 +echo qsub -cwd -V -S /bin/tcsh -m e $SCRIPTFILE
 +qsub -cwd -V -S /bin/tcsh -m e $SCRIPTFILE
 +qstat -u '*'
 +rm $SCRIPTFILE</code>
 +
 +Příklad spuštění:
 +
 +<code>qsub.csh $PARSER/train.pl "< $cesta/${xx}train.csts > $cesta/${xx}.1.stat"</code>
 +
 +(Kdybych místo uvozovek použil apostrofy, nerozbalily by se mi proměnné. První argument (název skriptu) klidně mohl být v uvozovkách spolu s přesměrováním. Dal jsem ho ven jen proto, že potom ''qsub.csh'' podle něj pojmenuje job ve frontě.)
 +
 +
 +
 +
 +
 +==== TectoMT: devel/tools/cluster_utils/qrunblocks ====
 +
 +Jako ''$BRUNBLOCKS'', ale spouští úlohy na gridu (bez pomoci [[internal:jtred]]u).
 +
 +   qrunblocks filelist blocks
 +
 +Skript zadanou hromádku souboru rozdělí do ''-''''-jobs'' jobů. Každý job na gridu pak projede své soubory danou sekvencí bloků.
 +
 +Soubory možno zadat filelistem, nebo pomocí ''-''''-glob'' (stručně ''-g''). Bloky možno vyjmenovat v jednom argumentu, nebo načíst ze souboru pomocí ''--blocksfile SOUBOR''.
 +
 +Je nutné buď zadat ''-''''-tmt-root CESTA'', nebo mít nastaven ''$TMT_ROOT'' podle inicializace TectoMT.
 +
 +Parametr ''-E'' zpusobí, že se jobům z aktuálního prostředí procedí všechny proměnné ''TMT_PARAM_*'' (čili např. model parseru ap.). Případně je pomocí ''-e'' možné vyjmenovat některé (další) ručně.
 +
 +Parametr ''-''''-sync'' způsobí, že skript navíc bude (pasivně) čekat, až všechny joby skončí.
 +
 +Výstup každého jobu jde do vlastního logu, ''JOBNAME.o123456''. Pokud JOBNAME nezadáte (parametr ''-N''), užije se defaultní ''qrunblocks''.
 +
 +Parametr ''-''''-join'' způsobí, že se STDOUT všech kousků (ve správném pořadí) sebere a vypíše na hlavní STDOUT (''-''''-join'' implikuje ''-''''-sync''). Při spojování se také dělá důkladný test exitstatusů, takže ''qrunblocks'' končí úspěchem jen tehdy, když všechny joby uspěly.
 +
 +Bez ''-''''-sync'' nebo ''-''''-join'' nezbývá, než kontrolovat, jestli logy jednotlivých jobů na konci nemají napsáno:  ''Status: FAILED''.
 +
 +===== Monitorování úloh =====
 +
 +  * ''qstat [-u user]'' -- seznam úloh aktuálně běžících / ve frontě
 +  * ''qhost'' -- dostupné zdroje
 +  * ''/SGE/REPORTER/LRC-UFAL/bin/lrc_users_real_mem_usage -u user -w'' -- aktuální využití paměti uživatelem
 +  * ''/SGE/REPORTER/LRC-UFAL/bin/lrc_users_limits_requested -w'' -- nárokované požadavky uživatelů
 +  * ''/SGE/REPORTER/LRC-UFAL/bin/lrc_nodes_meminfo'' -- vypis vsech uzlu a stav vytiznosti pameti.
 +    * mem_total: celkova pamet uzlu
 +    * mem_free: tedy kolik je jeste volne pameti z pametove quoty uzlu
 +    * act_mem_free: kolik uzlu OPRAVDU zbyva volne pameti
 +    * mem_used: kolik je pameti skutecne pouzito
 +  * ''/SGE/REPORTER/LRC-UFAL/bin/lrc_state_overview'' -- celkový přehled o clusteru
 +    * celkovy pocet jader, pocet vyuzitych jader
 +    * celkova velikost RAM, kolik je ji fyzicky nepouzite, kolik je ji jeste nerezervovane
 +    * po jednotlivych uzivatelich (zrovna pocitajicich) -- kolik jim bezi uloh, kolik jich maji ve fronte a kolik z nich je ve stavu hold
 +  * ''cat /SGE/REPORTER/LRC-UFAL/stats/userlist.weight'' -- seznam uživatelů clusteru seřazený podle dosavadní aktivity (počet odeslaných úloh × čas, který běžely), aktualizovaný každý den v&nbsp;noci
 +  * [[https://ufaladm2.ufal.hide.ms.mff.cuni.cz/munin/ufal.hide.ms.mff.cuni.cz/lrc1.ufal.hide.ms.mff.cuni.cz/lrc_users.html|Munin: graf vytíženosti clusteru podle uživatelů]] (viditelný pouze ze sítě ÚFAL)
  
 ===== Časté a záludné problémy ===== ===== Časté a záludné problémy =====
  
-==== Submitnutý job nesmí znovu submitovat ==== 
  
-Pokud se nemýlímnení dovoleno použít ''qsub'' ve skriptu/programukterý je už přes ''qsub'' spuštěn.+==== Submitnutý job může znovu submitovat ==== 
 + 
 +Danovy starší zkušenosti s clusterem PBS (nikoli SGE) říkaly, že tohle nejde. Ale jde to, aspoň u nás. Příkazy ''qsub'' a spol. jsou kromě hlavy clusteru dostupné i na všech strojích clusterusamozřejmě pokud váš soubor ''.bashrc'', ''.cshrc'' apod. zajistí, že se i na nich provede inicializace prostředí SGE. 
 + 
  
 ==== Proměnné prostředí, nastavení vlastního prostředí ==== ==== Proměnné prostředí, nastavení vlastního prostředí ====
Line 89: Line 211:
  
 Zatím nevím přesně, které ze souborů ''.login'', ''.bashrc'' ap. SGE spouští, jestli vůbec nějaké. Naopak, experimentálně jsem ověřil, že ''qsub -S /bin/bash skript'' nenačte žádný z ''.bashrc'', ''.bash_profile'', ''.login'', ani ''.profile''. Zatím nevím přesně, které ze souborů ''.login'', ''.bashrc'' ap. SGE spouští, jestli vůbec nějaké. Naopak, experimentálně jsem ověřil, že ''qsub -S /bin/bash skript'' nenačte žádný z ''.bashrc'', ''.bash_profile'', ''.login'', ani ''.profile''.
 +
 +Z toho například také vyplývá, že bez ošetření se jako **Java** používá
 +
 +   java version "1.5.0"
 +   gij (GNU libgcj) version 4.1.2 20070502 (Red Hat 4.1.2-12)
 +
 +Pokud chcete submittovaný program pouštět ve svém oblíbeném prostředí (např. nastavení ''PATH''), musíte v obalujícím skriptu příslušné ''.bash*'' načíst. Vždy je ale bezpečnější všude psát plné cesty, než spoléhat na PATH.
  
 ==== Jiný shell ==== ==== Jiný shell ====
Line 133: Line 262:
 fi fi
 </code> </code>
 +
 +==== Jak zjistit, jaké zdroje jsem pro svou úlohu požadoval ====
 +
 +<code>qstat -j 973884,982737,984029,984030,984031,984034,984036 | grep resource
 +hard resource_list:         mem_free=50g
 +hard resource_list:         mem_free=200g
 +hard resource_list:         mem_free=16g
 +hard resource_list:         mem_free=16g
 +hard resource_list:         mem_free=16g
 +hard resource_list:         mem_free=31g</code>
 +
 +==== Jak rezervovat více jader na stejném stroji pro 1 job ====
 +
 +<code>
 +qsub -pe smp <pocet jader>
 +</code>
 +
 +===== Synchronizace úloh (v Perlu) =====
 +
 +Pokud chci paralelizovat část úlohy (zde ''muj_skript.pl''), obvykle potřebuju po provedení paralelní části posbírat výsledky a hlavně počkat na dokončení všech paralelních větví. Jak na to jednoduše:
 +
 +  * Obalím svůj skript pro běh na gridu – vytvořím ''obaleno.sh'':
 +    <code>
 +#!/bin/bash
 +. /net/projects/SGE/user/sge_profile >/dev/null
 +
 +qrsh -cwd -V -p -50 -l mf=5g -now no 'renice 10 $$ >/dev/null; ./muj_skript.pl $@'
 +</code>
 +  * Ve svém hlavním skriptu ho pak zavolám a posbírám výsledky:
 +    <code>
 +use FileHandle;
 +use IPC::Open2;
 +use threads;
 +use threads::shared;
 +my @threads;
 +my @results;
 +share(@results);
 +for (@inputs)   {
 +    my $t = async {
 +        my $reader; my $writer;
 +        my $pid = open2($reader, $writer, "./obaleno.sh " . $parametry); # Pustime ulohu na gridu
 +        die "Failed to open bipipe" if !$pid;
 +        $writer->autoflush(1); # Muzem zavolat, ale v gridu NEFUNGUJE!!!
 +        print $writer "$_\n" or die; # Poslem uloze v gridu vstup
 +        $writer->close(); # Dulezite, viz o 2 radky vyse
 +        for (<$reader>   { # Posbirame vysledky
 +            chomp;
 +            {
 +               lock @results;
 +               push @results, $_;
 +            }
 +        }
 +        waitpid $pid, 0; # Pockame s ukoncenim vlakna na ukonceni ulohy v gridu
 +        return $? >> 8; # Pokusime se ziskat navratovou hodnotu (netestoval jsem)
 +    };
 +    push @threads, $t;
 +}
 +for (@threads)  { # Pockame, az to vsichni dodelaji
 +    die "Child exited with non-zero exit code" if $_->join();
 +}
 +</code>
 +
 +Poznámky: 
 +  * Pokud lze všechno předat parametry, nemusí se otevírat obousměrná roura a situace bude jednodušší
 +  * Pokud ''muj_skript.pl'' začne psát na výstup dřív, než přečetl všechen vstup, dojde k deadlocku. Lze vyřešit obalením příkazy ''cat'' v ''obaleno.sh''.
 +  * Celý příklad je k vidění v Czengu od V.N.

[ Back to the navigation ] [ Back to the content ]