Page tree
Skip to end of metadata
Go to start of metadata


Podstawowe informacje

  • Portable Batch System (PBS) to system kolejkowy działający na serwerach obliczeniowych PLGridu w Cyfronecie (Zeus), zarządzający zasobami, rezerwujący i przydzielający je odpowiednim zadaniom.
  • PBS tworzy spójny interfejs zarządzania zasobami niezależnie jak heterogeniczne są to zasoby. Ułatwia to sprawne i efektywne zarządzanie zasobami obliczeniowymi.
  • Każde z zadań przygotowanych przez użytkownika zostaje umieszczone w jednej z tzw. kolejek (ang. queue). Gdy zadeklarowane przez użytkowników zasoby przekraczają dostępną moc obliczeniową serwera, część zadań oczekuje na swoją kolej i zostaje uruchomiona zgodnie z priorytetem ustalonym w oparciu o zapotrzebowanie danego zadania w zasoby.

Kolejki

Użytkownicy PLGrid mają dostęp zasadniczo do trzech typów kolejek:

Nazwa kolejki

Opis

plgrid-testing

Kolejka o wysokim priorytecie przeznaczona do testów.

Poprzez nią można uruchomić co najwyżej jedno zadanie na raz, a zakolejkować trzy.

plgrid

Standardowa kolejka, 72 h

plgrid-long

Kolejka przeznaczona do długich zadań - do 168 h

Szczegółowy opis kolejek w każdym z ośrodków opisany jest na stronie www.plgrid.pl/oferta/zasoby_obliczeniowe/opis_zasobow/kolejki.

Komendy

Użytkownik komunikuje się z systemem kolejowym PBS za pomocą komend PBS. Umożliwiają one również sterowanie wykonaniem obliczeń.

Podstawowe komendy PBS to:

  • qsub - umieszczenie zadania w kolejce
  • qstat - sprawdzanie statusu zadań
  • qdel - usuwanie zadania z kolejki
  • qalter - zmiana parametrów zadania w kolejce

Zasoby

Ustawianie grantu obliczeniowego

Użytkownik powinien informować system kolejkowy, z zasobów którego grantu obliczeniowego chce skorzystać we wstawianym zadaniu. W tym celu powinien do komendy qsub dodać opcję -A MojGrantID (MojGrantID to nazwa grantu nadana przez użytkownika) podczas wysyłania zadania do systemu kolejkowego:

qsub -A MojGrantID skrypt

lub dodać ją do parametrów zawartych w skrypcie PBS zadania:

#!/bin/sh
##dodanie informacji o grancie obliczeniowym:
#PBS -A MojGrantID
##inne opcje PBS:
#PBS ...
#PBS ...

... komendy potrzebne do wykonania zadania ....

Ustawianie maksymalnego czasu obliczeń

Jeżeli użytkownik nie poda maksymalnego czasu obliczeń (walltime) lub maksymalnego czasu użytkowania wszystkich rdzeni obliczeniowych przez zadanie (cputime) system zarządzający kolejkami przyjmie, że zadanie zamierza wykorzystać czas obliczeń domyślny dla danej kolejki (wartość tą można sprawdzić podając polecenie qstat -Q -f <nazwa kolejki> | grep resources_default.walltime). Jest on zwykle równy maksymalnemu czasu obliczeń w kolejce, przez to nawet zadania o czasie wykonania o wiele krótszym od tego czasu będą musiały czekać, aż system umożliwi im uruchomienie. Dlatego też dobrą praktyką jest podawanie maksymalnego czasu trwania obliczeń, gdy użytkownik ma informacje ile zadanie powinno trwać.

W tym celu należy podać przy specyfikowaniu zadania zasób walltime (w formacie hhh:mm:ss):

qsub -l walltime=10:30:33 skrypt

lub dodać go do parametrów zawartych w skrypcie PBS zadania:

#!/bin/sh
##podanie maksymalnego czasu obliczen (w formacie hh:mm:ss):
#PBS -l walltime=10:30:33
##inne opcje PBS:
#PBS ...
#PBS ...

... komendy potrzebne do wykonania zadania ....

Uwaga: Należy zawsze specyfikować maksymalny czas obliczeń z pewnym naddatkiem, ponieważ po jego przekroczeniu zadanie automatycznie będzie kończone przez system kolejkowy. Wyspecyfikowany czas oczywiście nie może być większy niż maksymalny czas obliczeń w danej kolejce.

Ustawianie liczby rezerwowanych węzłow i rdzeni obliczeniowych

Domyślnie system kolejkowy rezerwuje dla zadania pojedynczy rdzeń na pojedynczym węźle obliczeniowym. W celu zarezerwowania większej ilości rdzeni i węzłów należy przy specyfikowaniu zadania dodać zasób nodes=X:ppn=Y gdzie X to liczba węzłów obliczeniowych, a Y to liczba rdzeni na każdym z węzłów:

qsub -l nodes=X:ppn=Y skrypt

lub dodać ją do parametrów zawartych w skrypcie PBS zadania:

#!/bin/sh
##zarezerwowanie X wezlow po Y rdzeni obliczeniowych:
#PBS -l nodes=X:ppn=Y
##inne opcje PBS:
#PBS ...
#PBS ...

... komendy potrzebne do wykonania zadania ....

Ustawianie wielkości rezerwowanej pamięci operacyjnej

Domyślnie system kolejkowy rezerwuje dla zadania pewną wartość pamięci operacyjnej RAM dostępną dla poszczególnych procesów zadania. Zwykle jest to trochę mniej niż ilość pamięci na węźle podzielona na ilość rdzeni na pojedynczym węźle obliczeniowym. Wielkość tą można sprawdzić wykonując poleceniem qstat -Q -f <nazwa kolejki> | grep resources_default.*mem; W celu zarezerwowania większej ilości pamięci RAM dla zadania należy przy specyfikowaniu zadania dodać zasób mem lub pmem gdzie mem to ilość pamięci RAM zarezerwowanej dla całego zadania, a  pmem to ilość pamięci RAM, którą będzie wykorzystywał każdy z procesów zadania z osobna. Zasoby te można określać w KB, MB oraz GB (również zapisując je małymi literami).

Zasoby te można specyfikować wykonując polecenie qsub:

qsub -l mem=2gb skrypt

lub dodać je do parametrów zawartych w skrypcie PBS zadania:

#!/bin/sh
##zadanie bedzie wykorzystywac maksymalnie:
#PBS -l mem=2gb
##inne opcje PBS:
#PBS ...
#PBS ...

... komendy potrzebne do wykonania zadania ....

lub

#!/bin/sh
##kazdy z procesow zadania wykorzystywac bedzie maksymalnie:
#PBS -l pmem=2gb
##inne opcje PBS:
#PBS ...
#PBS ...

... komendy potrzebne do wykonania zadania ....

Uwagi: 

  • W przypadku zadań, które wymagają większej ilości pamięci RAM niż standardowa (czyli (ilość RAM na WN/ilość rdzeni na WN)*ilość rdzeni przynależących do zadania) bezwzględnie należy specyfikować wielkość zużywanej pamięci. W innym wypadku zadanie wraz z innymi zadaniami uruchomionymi na węźle obliczeniowym (WN) może zająć całą dostępną pamięć, zostać częściowo zrzucone na dysk co spowoduje znaczące zmniejszenie wydajności  
  • Należy zapoznać się z wielkością dostępnej pamięci RAM na węzłach, ponieważ wyspecyfikowanie zbyt dużej jej wartości może spowodować, że zadanie nie będzie w stanie uruchomić się na żadnym z węzłów obliczeniowych.
  • W przypadku zadań wielowątkowych (m.in. wykorzystujących OpenMP) lepiej podawać parametr mem ponieważ wtedy zwykle obliczenia wykonywane są jako jeden proces
  • Dla zadań uruchamiających procesy potomne w ilości związanej z ilością zadeklarowanych rdzeni obliczeniowych (np. większość zadań opierających się na OpenMPI) dobrze jest operować parametrem pmem, który określa ile pamięci będą zużywały poszczególne procesy.

Wstawianie zadań

Do umieszczenia zadania w kolejce systemu kolejkowego służy komenda qsub. Zadanie można wstawić na dwa sposoby:

1) z wykorzystaniem jedynie polecenia qsub

Sposób ten jest prostszy, jeżeli zadanie polega na wywołaniu pojedynczego polecenia. W linii komend należy podać:

echo "polecenie do wykonania" | qsub [oraz jego opcje]
Przykładowe użycie
echo "uname -a" | qsub -q plgrid-testing

2) z wykorzystaniem skryptu (zalecane)

Gdy zadanie zawiera zestaw poleceń to należy je zapisać w osobnym pliku zwanym skryptem. Skrypt ten może zawierać blok komentarza z liniami rozpoczynającymi się od znaków #PBS zawierającymi opcje dla komendy qsub. Tak przygotowany skrypt umieszcza się w kolejce za pomocą komendy:

qsub [opcje polecenia qsub] skrypt
Przykładowe użycie

Skrypt pierwszy.sh

#!/bin/sh
##przykladowe opcje dla polecenia qsub
#PBS -l cput=5:00
#PBS -l pmem=128mb
#PBS -q plgrid-testing

#przejdz do katalogu scratch
cd /tmp

#utworz katalog tymczasowy
mkdir -p $USER/temporary

#uruchom program
/opt/local/bin/program [opcje]

#skasuj katalog tymczasowy:
rm -rf /tmp/$USER/temporary

Użycie skryptu:

 qsub [dodatkowe opcje] pierwszy.sh

W obu przypadkach system wstawi zadanie do kolejki wybranej przez użytkownika lub - jeśli nie podano wymagań - do kolejki domyślnej. Użytkownik otrzyma w terminalu informację o identyfikatorze zadania (JobID) w systemie kolejkowym:

 2595140.batch.grid.cyf-kr.edu.pl 

Opcje qsub

Poprzez opcje polecenia qsub użytkownik może specyfikować zapotrzebowanie na zasoby, które chce zarezerwować dla zadania, oraz inne akcje, które system kolejkowy powinien wykonać.

Opcja

Znaczenie

-l walltime

maksymalna długość działania zadania od momentu jego uruchomienia.

-q destination

definiuje kolejkę, do której skierowane zostanie zadanie.

-a date_time

deklaruje czas, przed którym zadanie nie może zostać uruchomione.

-N name

ustawia identyfikator zadania (max. 15 znaków), domyślnie - nazwa skryptu dostarczonego komendzie qsub

-h

wprowadza zadanie w stan 'hold' (uruchomienie wstrzymane na życzenie użytkownika).

-I

wykonuje zadanie interaktywnie, tzn. stdin, out i err pozostają skierowane na konsolę użytkownika w celu umożliwienia interakcji

-M user_list

lista użytkowników, do których ewentualne maile będą wysyłane. Format argumentu: user[@host][,user[@host],...]

-m mail_options

definiuje, w jakich przypadkach wysyłany jest mail do użytkowników w -M

-S path_list

specyfikuje powłokę, która zostanie użyta do uruchomienia zadania.

-A grant_ID

specyfikuje grant obliczeniowy, z zasobów którego dane zadanie będzie korzystać

Zmiana parametrów zadania w kolejce

Do zmiany parametrów zadania już wysłanego do systemu kolejkowego służy polecenie qalter. Oczywiście możliwe są tylko zmiany parametrów dozwolone w danej kolejce. Nie jest możliwa zmiana kolejki, w której wykonywane jest dane zadanie. Składnia polecenia qalter jest identyczna z składnią polecenia qsub, ale jako ostatni argument polecenia qalter należy dodatkowo podać identyfikator zadania JobID.

Sprawdzanie stanu zadań

Do sprawdzana różnych parametrów zadania lub kolejki służy polecenie qstat.

 qstat [lista opcji] 

Lista opcji qstat

Opcja

Znaczenie

-q

podaje informacje o kolejkach dostępnych w danym systemie kolejkowym

-Q

wyświetla informacje o zajętości kolejek

-a

wypisuje wszystkie zadania w kolejkach

-r

wyświetla wszystkie uruchomione zadania

-u username

wypisuje wszystkie zadania użytkownika o username

-B

podaje informacje o serwerze kolejkowania

-f JobID

podaje informacje o zadaniach identyfikowanych przez JobID

-n

prócz podstawowych informacji wyświetla również informacje o tym, na których węzłach uruchomione są zadania

Poglądanie zadań zalogowanego użytkownika

W celu zobaczenia swoich zadań zakolejowanych w systemie kolejkowym należy po zalogowaniu wykonać polecenie:

qstat -u $USER
Wypisanie szczegółowych informacji o zadaniu

W celu zobaczenia szczegółowych informacji o konkretnym zadaniu znajdującym się w systemie kolejkowym należy po zalogowaniu wykonać polecenie:

qstat -f <JobID>
Wypisanie szczegółowych informacji o kolejce obliczeniowej

W celu zobaczenia szczegółowych informacji o konkretnej kolejce obliczeniowej należy po zalogowaniu wykonać polecenie:

qstat -Q -f <nazwa_kolejki>

Usuwanie zadań

Do usuwania zadań z systemu kolejkowego służy polecenie qdel. By wykasować zadanie należy podać jego JobID.

qdel [-W delay] <JobID> 

Opcja -W pozwala ustawić przerwę pomiędzy wysłaniem sygnału SIGTERM, a SIGKILL do kończonego zadania.

Dodatkowe komendy PBS

1) Informacja o przewidywanym czasie uruchomienia zadania

System kolejkowy na bieżąco kolejkuje wszyskie czekające zadania i szacuje czas, w którym każde z zadań będzie mogło być uruchomione. W celu sprawdzenia aktualnych przewidywań dla konkretnego zadania należy wykonać polecenie:

showstart <JobID> 

2) Informacja o ilości dostępnych rdzeni obliczeniowych

Ponieważ system kolejkowy zbiera zasoby aby wykonać zadania, które zażądały wielu procesorów na wielu rdzeniach często zdarza się, że część rdzeni jest przez system obliczeniowy rezerwowana po zakończeniu innych zadań by były gotowe dla "dużego zadania" gdy wszystkie zostaną zebrane. Ponieważ system kolejkowy przewiduje, że dane niepracujące węzły zostaną przydzielone zadaniom dopiero za określony czas na węzły te może skierować zadania krótkie (czyli o zdefiniowanym krótkim walltime), które skończą się zanim zostanie zebrana całość zasobów na "duże zadanie". W celu sprawdzenia ilości takich rdzeni oraz maksymalnego czasu ich bezczynności można wykonać polecenie:

showbf 

Podaje ono ilość rdzeni oraz czas, który pozostał do przydzielenia ich do "dużego zadania":

Wynik dzialania komendy showbf
875 procs available for       1:39:31
863 procs available for       1:48:13
851 procs available for       1:48:30
842 procs available for       1:48:57
824 procs available for       1:49:07
810 procs available for       2:20:16
809 procs available for      19:04:58
793 procs available for      19:05:58

lub

Wynik dzialania komendy showbf
Partition     Tasks  Nodes      Duration   StartOffset       StartDate
---------     -----  -----  ------------  ------------  --------------
ALL            4006    393      INFINITY      00:00:00  15:38:17_01/18
0               619     62      INFINITY      00:00:00  15:38:17_01/18
G6              529    165      INFINITY      00:00:00  15:38:17_01/18
emi             192    121      INFINITY      00:00:00  15:38:17_01/18
amd            2666     45      INFINITY      00:00:00  15:38:17_01/18

gdzie Partition informuje na której części klastra (zdefiniowanej przez jego administratorów) znajdują się wolne zasoby, Task informuje o ilości wolnych rdzeni, Nodes o ilości częściowo wolnych węzłów, a Duration o maksymalnym czasie przed uruchomieniem "dużego zadania".

Uwaga: Niestety nie ma na razie możliwości sprawdzenia jak wolne rdzenie obliczeniowe są podzielone pomiędzy poszczególne węzły obliczeniowe.

Przykładowe skrypty PBS

1) Zadanie interaktywne

Uruchomienie zadanie interaktywnego w kolejce "plgrid" z możliwością pracy w trybie tekstowym wymagające jednego rdzenia na jednym węźle obliczeniowym.

Zadanie interaktywne
qsub -I -q plgrid -l nodes=1:ppn=1

Uruchomienie zadanie interaktywnego w kolejce "plgrid" z możliwością pracy w trybie graficznym wymagające jednego rdzenia na jednym węźle obliczeniowym.

Zadanie interaktywne z wyswietlaniem graficznym
qsub -IX -q plgrid -l nodes=1:ppn=1

Uwaga: W przypadku chęci skorzystania z trybu graficznego należy pamiętać o połączeniu się z maszyną dostępową klastra w sposób umożliwiający przenoszenie tego trybu.

2) Zadanie jednordzeniowe

Uruchomienie z linii poleceń zadania w kolejce "plgrid" wymagające jednego rdzenia na jednym węźle obliczeniowym:

Zadanie szeregowe zajmujące jeden rdzeń
qsub -q plgrid -l nodes=1:ppn=1 skrypt.szeregowe.pbs

Przykładowy skrypt (skrypt.szeregowe.pbs) rezerwujący jeden rdzeń obliczeniowy na jedną godzinę

skrypt.szeregowe.pbs
##### Nazwa kolejki
#PBS -q plgrid
##### Ilosc wezlow i rdzeni
#PBS -l nodes=1:ppn=1
##### Maksymalna pamiec przydzielona na zadanie
#PBS -l mem=1gb
##### Maksymalny czas obliczen 1 godzina
#PBS -l walltime=1:00:00
##### Nazwa zadania widoczna w systemie kolejkowym
#PBS -N nazwa_obliczen
##### Nazwa grantu uzytego do obliczen
#PBS -A nazwa_grantu
 
#Wczytanie domyslnego srodowiska dla jezyka Python 
module add python
 
python input.py

3) Zadanie rezerwujące cały węzeł obliczeniowy

Uwaga: W pierwszej kolejności najlepiej sprawdzić jaką ilość rdzeni mają węzły obliczeniowe na danej maszynie, co można sprawdzić na stronie zasobów projektu.

Uruchomienie z linii poleceń zadania w kolejce "plgrid" rezerwujące cały 12-rdzeniowy węzeł obliczeniowy:

Zadanie zajmujące 12-rdzeniowy węzeł
qsub -q plgrid -l nodes=1:ppn=12 skrypt.rownolegly.pbs

W przypadku skryptu należy użyć poniższych wpisów wewnątrz skryptu:

Zadanie zajmujące 12-rdzeniowy węzeł
#PBS -q plgrid
#PBS -l nodes=1:ppn=12

Przykładowy skrypt (skrypt.caly.wezel.pbs) rezerwujący cały 12-rdzeniowy węzeł obliczeniowy na jedną godzinę

skrypt.caly.wezel.pbs
##### Nazwa kolejki
#PBS -q plgrid
##### Ilosc wezlow i rdzeni
#PBS -l nodes=1:ppn=12
##### Maksymalna pamiec przydzielona na zadanie
#PBS -l mem=12gb
##### Maksymalny czas obliczen 1 godzina
#PBS -l walltime=1:00:00
##### Nazwa zadania widoczna w systemie kolejkowym
#PBS -N nazwa_obliczen
##### Nazwa grantu uzytego do obliczen
#PBS -A nazwa_grantu
 
#Wczytanie domyslnego srodowiska dla jezyka Python 
module add python
 
python input.py

4) Zadanie rezerwujące po X procesorów na Y wezłach obliczeniowych

Uruchomienie z linii poleceń zadania w kolejce "plgrid" rezerwujące po dwa rdzenie na czterech węzłach obliczeniowych:

Zadanie rezerwujące po 2 rdzenie na 4 węzłach obliczeniowych
qsub -q plgrid -l nodes=4:ppn=2 skrypt.rownolegly.pbs

W przypadku skryptu należy użyć poniższych wpisów wewnątrz skryptu:

Zadanie rezerwujące po 2 rdzenie na 4 węzłach obliczeniowych
#PBS -q plgrid
#PBS -l nodes=1:ppn=12

Przykładowy skrypt (skrypt.rownolegle.pbs) rezerwujący po dwa rdzenie na czterech węzłach obliczeniowych:

skrypt.rownolegle.pbs
##### Nazwa kolejki
#PBS -q plgrid
##### Ilosc wezlow i rdzeni
#PBS -l nodes=4:ppn=2
##### Maksymalna pamiec przydzielona jeden proces zadania
#PBS -l pmem=2gb
##### Maksymalny czas obliczen 1 godzina
#PBS -l walltime=1:00:00
##### Nazwa zadania widoczna w systemie kolejkowym
#PBS -N nazwa_obliczen
##### Nazwa grantu uzytego do obliczen
#PBS -A nazwa_grantu
 
#Wczytanie domyslnego srodowiska dla jezyka Python 
module add python
 
python input.py
  • No labels