Jak korzystać z kolejek PBS: Różnice pomiędzy wersjami

Z KdmWiki
Przejdź do nawigacji Przejdź do wyszukiwania
 
(Nie pokazano 62 wersji utworzonych przez 6 użytkowników)
Linia 1: Linia 1:
<small>< [[Podręcznik użytkownika KDM]] < [[System kolejkowy]]</small>
+
<small>< [[Podręcznik użytkownika KDM]] < [[System kolejkowy]] < Jak korzystać z kolejek PBS</small>
 +
== Kolejki ==
 +
Na klastrze [[Bem]] zadaniami obliczeniowymi zarządza system kolejkowania [[PBSPro]].
  
'''Portable Batch System''' (PBS) - system kolejkowania dostępny w kilku wersjach: [[PBSPro]] (wersja płatna), [[OpenPBS]], [[Torque/PBS]]. W WCSS wykorzystywana jest wersja [[PBSPro]] ([[Leo]], [[Supernova]]) i [[OpenPBS]] ([[Tezro]]).
+
Uruchamianie obliczeń odbywa się w ramach kolejek, które różnią się między sobą priorytetem, limitami czy prawami dostępu (a czasem również dostępnymi zasobami).
  
PBS tworzy dla użytkownika pojedynczy i spójny interfejs do wszystkich zasobów którymi zarządza, niezależnie od tego, jak bardzo te zasoby są rozproszone. Pozwala to użytkownikom skupić się na pracy naukowej poprzez wyeliminowanie potrzeby samodzielnego dbania o efektywne wykorzystanie zasobów.
+
Uruchamianie typowych obliczeń na klastrze Bem nie wymaga podawania kolejki, gdyż wyboru odpowiedniej kolejki dokonuje system kolejkowy na podstawie podanych przez użytkownika wymagań odnośnie czasu wykonania. <br>
 +
Ogólna zasada jest następująca: wszystkie zadania należy zlecać do kolejki '''main''', która w zależności od czasu trwania zadania przekieruje je do kolejki o odpowiednio długim czasie wykonywania. <br>
 +
Dla przykładu zadanie o czasie 123h trafi do kolejki shoth168h. Każda z kolejek ma inny priorytet.
 +
W ogólności im krótsza kolejka tym wyższy priorytet. Kolejka normal o maksymalnej długości zadania do 504h ma najniższy priorytet i ograniczone zasoby.  
 +
Pozostałe kolejki korzystają ze wszystkich zasobów.
  
== Operacje na zadaniach ==
+
Podstawowe kolejki na klastrze Bem przeznaczone dla wszystkich użytkowników KDM:
=== Wstawianie zadań do kolejki===
+
* '''main''' - zadania należy zlecać do tej kolejki '''podając limit czasu''' (przy użyciu konstrukcji opisanej w dalszej części artykułu: '''-l walltime=X''')
Aby wstawić zadanie do kolejki należy oszacować zapotrzebowanie zadania na zasoby (liczbę procesorów, czas, ilość pamięci, itd.), a następnie użyć polecenia '''<code>qsub</code>'''.
+
* short, short48h, short168h, normal, infinity - użytkownik nie ma możliwości bezpośredniego wstawiania zadań do tych kolejek, dokona tego system kolejkowy automatycznie, w oparciu o podany limit czasu.
 +
Kolejki dostępne na klastrze Bem dla użytkowników infrastruktury PL-Grid:
 +
* plgrid, plgrid-long, plgrid-testing
  
Można zrobić to na dwa sposoby: z wykorzystaniem tylko polecenia <code>qsub</code> lub z wykorzystaniem skryptu.
+
W systemie kolejkowym zakładane są także czasowo dedykowane kolejki na specyficzne potrzeby projektowe lub grup badawczych.
  
; Polecenie qsub
+
== Sprawdzanie stanu kolejek ==
Jest to najprostszy sposób, w którym wystarczy wykonać polecenie:
+
Do sprawdzenia stanu kolejki służy polecenie '''qstat'''. Można korzystać z następujących jego parametrów:
$ '''echo 'polecenie-do-wykonania-i-jego-opcje >&plik_wynikow' |qsub [opcje dla qsub]'''
+
* '''-r''' - pokazuje uruchomione zadania
Przykład:
+
* '''-i''' - pokazuje zadania oczekujące
$ '''echo g98 nazwa.inp |qsub -N nazwa-zadania'''
+
* '''-u''' - pokazuje zadania wybranego użytkownika
 +
* '''-f''' - pokazuje szczegółowe informacje o zadaniach (lub zadaniu, jeżeli podamy jego identyfikator po parametrze)
  
; Z wykorzystaniem skryptu
+
Konfigurację kolejek można przeglądać za pomocą komendy:
Należy utworzyć skrypt, który uruchamia zadanie. Skrypt taki może, obok uruchomienia zadania, zadbać również o utworzenie plików tymczasowych, wyczyszczenie przestrzeni <code>/scratch</code>, itp.
+
> '''qstat -q'''
 +
 
 +
Dokładniejsze informacje na temat kolejki wyświetla komenda:
 +
> '''qstat -Qf nazwa_kolejki'''
 +
 
 +
== Zasoby ==
 +
Po wyborze odpowiedniej kolejki należy zadeklarować ilość wymaganych zasobów.
 +
 
 +
Przydział zasobów może odbywać się w jednej, spójnej części (dla zadań szeregowych lub zrównoleglonych w obrębie jednego węzła) lub kilku części (dla zadań zrównoleglonych przy użyciu bibliotek MPI). Deklarację buduje się używając wyrażenia
 +
'''select''' dla parametru '''-l''' polecenia '''qsub''' (opisanego w dalszej części). Jej format jest następujący:
 +
 
 +
<pre>
 +
select=X:zasób1=wartość1:zasób2=wartość2+Y:zasób3=wartość3:zasób4=wartość4
 +
</pre>
 +
gdzie:
 +
* '''X''' - liczba części alokacji (tzw. '''chunków''') pierwszego zbioru zasobów
 +
* '''zasób1=wartość1:zasób2=wartość2''' - opis pierwszego zbioru zasobów
 +
* '''Y''' - liczba części drugiego zbioru zasobów
 +
* '''zasób3=wartość3:zasób4=wartość4''' - opis drugiego zbioru zasobów
 +
 
 +
Liczba zbiorów zasobów może być różna (równa 1 lub większa). Alokowane części (chunki) mogą (ale nie muszą) znaleźć się na różnych węzłach.
 +
 
 +
Dostępne parametry:
 +
* '''ncpus''' - liczba rdzeni obliczeniowych
 +
** domyślnie: 1
 +
** maksymalnie:
 +
*** 24 na 720 węzłach
 +
*** 28 na 192 węzłach
 +
* '''mem''' - rozmiar pamięci
 +
** Wielkość pamięci zadeklarowana dla zadania w kolejce powinna być większa (np. o 10%) od wartości zadeklarowanej dla aplikacji w pliku wejściowym. Należy zadbać, aby w pliku wejściowym podana była poprawna wielkość pamięci, wystarczająca do skutecznego wykonania obliczeń dla danego rozmiaru problemu obliczeniowego. Jeśli aplikacja, uruchomiona podczas wykonywania się zadania kolejkowego, spróbuje użyć więcej pamięci niż zostało zadeklarowane dla zadania, to aplikacja zostanie zabita i zadanie zakończy się niepowodzeniem.
 +
** Przykład dla aplikacji [[Gaussian]]:
 +
*** Deklaracja w pliku wejściowym dla obliczeń na 8 procesorach i z wykorzystanie 4GB pamięci:
 +
%nproc=8
 +
%mem=4000MB
 +
*** odpowiednia deklaracja dla zadania kolejkowego:
 +
-l select=1:ncpus=8:mem=4400MB
 +
** domyślnie: 2000 MB per każdy chunk
 +
** maksymalnie:
 +
*** 60 000 MB na 688 węzłach
 +
*** 125 000 MB na 214 węzłach
 +
*** 500 000 MB na 10 węzłach
 +
 
 +
 
 +
Osobnym słowem kluczowym, którego używa się podczas żądania zasobów, jest liczba procesów MPI w danej części alokacji (w chunku). Należy skorzystać z tego parametru, kiedy w jednej części alokacji (chunk) chcemy uruchomić jeden lub więcej procesów MPI:
 +
* '''mpiprocs''' - liczba procesów MPI
 +
** domyślnie: 1
 +
** maksymalnie: 24 lub 28
 +
** wielkość mpiprocs nigdy nie może być większa niż ncpus w żadnym chunku!
 +
** jeśli aplikacja jest zrównoleglona jedynie przy użyciu MPI i nie korzysta z OpenMP, to wartość mpiprocs powinna być zawsze równa ncpus!
 +
 
 +
 
 +
Jeśli aplikacja jest zrównoleglona przy użyciu OpenMP, to należy podać liczbę wątków w ramach części alokacji (chunk):
 +
* '''ompthreads''' - liczba wątków (threads)
 +
** domyślnie: równa wartości '''ncpus'''
 +
** maksymalnie: 24 lub 28
 +
** wielkość ompthreads nigdy nie może być większa niż ncpus w żadnym chunku!
 +
 
 +
W przypadku aplikacji hybrydowych, korzystających jednocześnie z MPI i OpenMP, wielkość '''ncpus''' w każdym chunku '''musi''' być równa '''mpiprocs * ompthreads''', vide przykłady poniżej.
 +
 
 +
 
 +
; Przykładowe definicje wymagań
 +
 
 +
Zadanie uruchamia jeden zestaw, w którym jeden proces będzie mógł uruchomić 4 wątki OpenMP lub po prostu cztery procesy i wymaga 4096 MB RAM na cały zestaw. Całość uruchomi się w ramach jednego węzła:
 +
 
 +
<pre>
 +
select=1:ncpus=4:mem=4096MB
 +
</pre>
 +
 
 +
Zadanie uruchamia 8 zestawów po jeden proces, a każdy proces wymaga 512 MB RAM. Poszczególne zestawy mogą znaleźć się na dowolnej kombinacji węzłów - jednym lub więcej:
  
Przykład skryptu:
 
 
<pre>
 
<pre>
'''#!/bin/sh'''
+
select=8:ncpus=1:mem=512MB
# przejdź do katalogu z danymi zadania (bardzo ważne!):  
 
'''cd jobdir1'''
 
# uruchom program:  
 
'''./ścieżka/program [opcje] >&plik_wynikow '''
 
 
</pre>
 
</pre>
  
Następnie należy wstawić zadanie poleceniem <code>qsub</code>:
+
Zadanie uruchamia 8 zestawów po 4 procesy MPI, po 4 w każdej części alokacji (i domyślne 2000 MB na każde 4 procesy):
  
$ '''qsub [opcje dla qsub] nazwa-skryptu'''
+
<pre>
 +
select=8:ncpus=4:mpiprocs=4
 +
</pre>
  
Przykład:
+
Zadanie wymaga 16GB RAM (i domyślnie jednego rdzenia):
  
$ '''qsub -N nazwa ./skrypt1'''
+
<pre>
 +
select=1:mem=16GB
 +
</pre>
  
System wstawi zadanie do kolejki spełniającej podane przez użytkownika wymagania lub, jeśli nie podano wymagań, do kolejki domyślnej (zwykle o najniższym priorytecie). Użytkownik otrzyma w terminalu informację o identyfikatorze zadania:
+
Zadanie wymaga 4 zestawów po 2 procesy MPI, z których każdy uruchomi po 12 wątków OpenMP i 16GB pamięci per każdy zestaw. Należy zwrócić uwagę, że w każdym chunku jest fizycznie wymagane 2mpi*12threads=24 rdzenie, dlatego ncpus musi przyjąć właśnie taką wartość:
  
1677.leo.wcss.wroc.pl
+
<pre>
 +
select=4:ncpus=24:mpiprocs=2:ompthreads=12:mem=16GB
 +
</pre>
 +
Alokacja w powyższym przypadku będzia wygłądać następująco:
  
Jeśli kolejka wymaga autoryzacji, to zadanie wpuszczone zostanie tylko wtedy, jeśli dany użytkownik ma do danej kolejki dostęp.
+
<pre>
 +
chunk pierwszy:
 +
\_
 +
  proces MPI pierwszy
 +
  \_ pierwszy wątek OpenMP
 +
  \_ drugi wątek OpenMP
 +
  \_ ...
 +
  \_ 12-ty wątek OpenMP
 +
  proces MPI drugi
 +
  \_ pierwszy wątek OpenMP
 +
  \_ drugi wątek OpenMP
 +
  \_ ...
 +
  \_ 12-ty wątek OpenMP
  
'''Zadania w kolejkach interaktywnych'''
+
chunk drugi:
 +
\_
 +
  proces MPI pierwszy
 +
  \_ pierwszy wątek OpenMP
 +
  \_ drugi wątek OpenMP
 +
  \_ ...
 +
  \_ 12-ty wątek OpenMP
 +
  proces MPI drugi
 +
  \_ pierwszy wątek OpenMP
 +
  \_ drugi wątek OpenMP
 +
  \_ ...
 +
  \_ 12-ty wątek OpenMP
 +
</pre>
  
Z funkcjonalności kolejek interaktywnych można skorzystać, kiedy chcemy zdalnie uruchomić aplikację z interfejsem graficznym [[GUI]] lub [[Kompilacja aplikacji na klastrze | kompilacji oprogramowania ]].
+
Uruchamianie aplikacji wykorzystującej zarówno MPI jak i OpenMP, implementacja Intel MPI:
Należy przekierować wyświetlanie obrazu na serwer X-ów na swoim komputerze zgodnie ze wskazówkami z działu podręcznika "[[Przekierowanie wyświetlania]]". Następnie wg. schematu:
 
  
  $ qsub -X -I -l select=1 # rezerwacja zasobów
+
  mpirun -genv OMP_NUM_THREADS=$OMP_NUM_THREADS -genv I_MPI_PIN_DOMAIN=omp /ścieżka/aplikacja.x
$ molden # start aplikacji korzystającej z GUI, np. molden
 
  
;Deklaracja wymagań
+
== Wstawianie zadań ==
 +
Do wstawiania zadań do kolejki służy polecenie '''qsub'''. {{uwaga2|Polecenie należy wykonywać na węźle dostępowym!}} Opis zadania powinien być zawarty w skrypcie powłoki. Następnie taki skrypt przekazywany jest do kolejki jako parametr polecenia qsub (lub na standardowe wejście tej komendy). Najważniejsze parametry polecenia można znaleźć poniżej:
 +
* '''-q''' - wybór kolejki
 +
* '''-l''' specyfikacja wymagań - wartości parametru mogą być następujące
 +
** '''select=''' - opis wymagań
 +
** '''software=''' - informacja o używanym oprogramowaniu
 +
{{uwaga2| Proszę korzystać z powyższego parametru - pozwala to administratorom sporządzać statystyki wykorzystania}}
 +
* '''-N''' - nazwa zadania (jej długość nie może przekraczać 12 znaków)
 +
* '''-m''' - włączenie wysyłania powiadomień o zdarzeniach
 +
** '''b''' - o rozpoczęciu zadania
 +
** '''e''' - o zakończeniu zadania
 +
** '''n''' - wyłączenie powiadomień
 +
* '''-I''' - zadanie interaktywne (w tym przypadku nie należy przekazywać skryptu)
 +
* '''-X''' - przekierowanie wyświetlania (ma sens w przypadku zadań interaktywnych, wymaga logowania z przekierowaniem wyświetlania
  
Wymagania zadania specyfikuje się za pomocą parametru <code>-l</code> (małe L) polecenia <code>qsub</code>. Zasoby, które można alokować:
+
Cenną cechą programu '''qsub''' jest możliwość przekazywania parametrów w skrypcie podanym jako argument, poprzez linie zaczynające się od:
* ncpus - liczba rdzeni (domyślnie 1)
+
<pre>
* mpiprocs - liczba procesów MPI (domyślnie 1)
+
#PBS
* mem - ilość pamięci (domyślnie 2000 MB)
+
</pre>
* software - nazwa uruchomionego oprogramowania
 
{{uwaga2 | Zasób '''software''' należy deklarować przy pracy wsadowej, w skryptach sub-*}}
 
  
Jednostką alokacji wymagań jest tzw. <code>chunk</code>, określający "podzbiór" zasobów klastra. Użytkownik specyfikuje ile i jakich zasobów potrzebuje w danej jednostce (chunku), a dodatkowo, jeżeli zadanie jest zrównoleglone przez MPI - ile potrzebuje jednostek danego typu.  
+
== Usuwanie zadań ==
 +
Jeżeli z jakiegoś powodu istnieje potrzeba usunięcia zadania - należy skorzystać z polecenia '''qdel''', które przyjmuje jako parametr identyfikator zadania. Można kasować zadania zarówno oczekujące w kolejce jak i uruchomione.
  
Przykłady specyfikacji wymagań:
+
== Rezerwacje ==
 +
Może się zdarzyć, że dostęp do zasobów potrzebny jest w określonym czasie np. za 3 tygodnie w poniedziałek między godziną 8 a 16. W takich przypadkach należy skorzystać z rezerwacji - '''powoduje to powstanie nowej kolejki''', do której wstawione zadania nie będą konkurować o dostęp z innymi zadaniami. Należy jednak pamięć, że nie zawsze będzie to możliwe (będzie tylko wtedy kiedy system kolejkowy w żądanym czasie będzie w stanie zapewnić zasoby). Tworzenie rezerwacji odbywa się poleceniem '''pbs_rsub''', którego najważniejsze parametry to:
 +
* '''-R''' - czas rozpoczęcia rezerwacji w formacie YYYYMMDDHHmm (201302010456 oznacza w takim przypadku 4:56 01.02.2013)
 +
* '''-E''' - czas zakończenia rezerwacji w formacie YYYYMMDDHHmm
 +
* '''-l''' - specyfikacja zasobów rezerwacji (w formacie takim, jak w przypadku zadań)
 +
* '''-r''' - reguła rekurencji (jeżeli rezerwacja ma się powtarzać cyklicznie, więcej na ten temat w manualu polecenia pbs_rsub)
 +
* '''-U''' - lista użytkowników, którzy mogą korzystać z rezerwacji
  
* Zadanie liczące się na 1 węźle, potrzebujące 4 rdzeni oraz 7500 MB RAM
+
Do wyświetlenia informacji o rezerwacjach służy polecenie '''pbs_rstat'''. Bez parametrów listuje ono założone rezerwacje, a szczegóły o wybranej można zobaczyć dodając parametr '''-f''' i identyfikator. Aby usunąć rezerwację należy użyć polecenia '''pbs_rdel'''.
  -l select=1:ncpus=4:mem=7500MB
 
  
W powyższym przykładzie alokowany jest 1 chunk z 4 rdzeniami i łącznie 7500MB pamięci RAM. Pojedynczy chunk może być zaalokowany tylko na 1 węźle, więc zadanie z takimi wymaganiami będzie oczekiwać na wolny 1 węzeł z 4 rdzeniami.
+
== Przykłady ==
  
* Zadanie MPI potrzebujące 24 rdzeni po 1800 MB na rdzeń (w sumie ok. 43 GB) [wiele małych chunków]
+
=== Uruchomienie obliczeń na postawie skryptu ===
  -l select=24:ncpus=1:mem=1800MB
 
  
W powyższym przykładzie alokowane są 24 chunki, każdy z 1 rdzeniem i 1800MB RAM. W tym przypadku system kolejkowy będzie starał się tak rozmieścić chunki, aby zadanie wykonywało się jak najszybciej - możliwie wiele na jednym węźle, ale też starając się minimalizować czas oczekiwania na zasoby, a tym samym na uruchomienie. Przy powyższej definicji zasobów może się zdarzyć, że każdy chunk trafi na inny węzeł. Jeżeli taka sytuacja jest niepożądana można wymusić koncentrację zasobów zwiększając rozmiar jednostki alokacji (liczbę rdzeni i pamięci per chunk):
+
* zawartość skryptu uruchom.sh
  
* Zadanie MPI potrzebujące 24 rdzeni po 1800 MB na rdzeń (w sumie ok. 43 GB) [z koncentracją zasobów]
+
<source lang=bash>
  -l select=2:ncpus=12:mpiprocs=12:mem=21500MB
+
#!/bin/bash
 +
#PBS -q main
 +
#PBS -l walltime=6:00:00
 +
#PBS -l select=1:ncpus=2:mem=2048MB
 +
#PBS -l software=test_qsub
 +
#PBS -m be
  
W powyższym przykładzie alokowane są 2 chunki, każdy po 12 rdzeni i 21500MB RAM. W praktyce spowoduje to, że zadanie będzie oczekiwać na wolne 2 węzły z 12 rdzeniami.
+
# wejscie do katalogu, z ktorego zostalo wstawione zadania
 +
cd $PBS_O_WORKDIR
  
W przypadku chunka więcej niż jednoprocesorowego, podczas korzystania z MPI ważne jest aby dodać parametr '''<code>mpiprocs</code>''' - spowoduje to zamieszczenie odpowiedniej liczby wpisów w pliku $PBS_NODEFILE, zawierającym listę hostów, na których zadanie będzie się wykonywać.
+
# uruchom program
 +
# z PRZEKIEROWANIEM ZAPISYWANIA WYNIKOW -- BARDZO WAZNE
 +
./test1 >& wynik.txt
 +
</source>
  
{{uwaga2|Jeśli użytkownik zadeklaruje zbyt dużo zasobów (przeceni wymagania zadania), to zadanie może niepotrzebnie długo oczekiwać na wolne zasoby i uruchomienie, dodatkowo będzie blokować nadmiarowe zasoby innym zadaniom.}}
+
* '''Bardzo ważne''': każde polecenie wykonywane w skrypcie zadania '''MUSI''' przekierowywać wyniki drukowane na standardowe wyjścia stdout i stderr do plików w katalogu domowym. Zadania wstawione bez przekierowania będą zabijane bez ostrzeżenia:
{{uwaga2|Jeśli użytkownik zadeklaruje za mało zasobów (nie doceni wymagań zadania), to system "zabije" zadanie z powodu przekroczenia limitów zasobów.}}
+
./test1 >& wynik.txt
  
=== Sprawdzanie stanu zadania ===
+
* wstawienie skryptu
Stan zadania i kolejki można sprawdzić poleceniem '''<code>qstat</code>'''. Zobacz też: [[konfiguracja kolejek PBS]].
 
  
$ '''qstat'''
+
<pre>
 +
qsub uruchom.sh
 +
</pre>
  
=== Kasowanie zadań ===
+
=== Uruchomienie zadania interaktywnego ===
Aby skasować wstawione do systemu zadanie należy użyć polecenia '''<code>qdel</code>''':
 
  
$ '''qdel identyfikator_zadania'''
+
<pre>
 +
qsub -I -l walltime=6:00:00 -l select=1:ncpus=1:mem=2048MB -l software=CFX_14.5
 +
</pre>
  
Zadanie zostanie usunięte bez względu na jego status.
+
=== Przekazanie skryptu przez standardowe wejście '''qsub''' ===
  
=== Ustalanie zależności zadań ===
+
* zawartość pliku skrypt.sh
PBS pozwala na ustalanie zależności między zadaniami wstawianymi do kolejki, z określaniem np. kolejności ich uruchamiania. W najprostszym przypadku, jeśli chcemy aby wstawione zadania uruchamiały się kolejno po sobie, należy zlecić pierwsze zadanie w typowy sposób:
 
  
$ echo 'polecenie_i_jego_opcje >&plik_wynikow' | qsub [opcje dla qsub]
+
<source lang=bash>
 +
cat << EOF | qsub
 +
#!/bin/bash
 +
#PBS -q main
 +
#PBS -l walltime=2:00:00
 +
#PBS -l select=1:mem=512MB
 +
#PBS -l software=qsub_stdin
 +
#PBS -m be
  
PBS zwróci wtedy identyfikator zadania (JobID), np.:
+
# wejscie do katalogu, z ktorego zostalo wstawione zadania
 +
# \ przez $ jest wymagany, aby powloka nie podmienila
 +
# $PBS_O_WORKDIR na wartosc podczas wstawiania - tylko
 +
# podczas dzialania zadania na wezle
  
1144.tezro
+
cd \$PBS_O_WORKDIR
  
Wstawiając następne zadanie trzeba podać, kiedy ma się ono zacząć, np. dopiero po zakończeniu poprzedniego zadania:
+
# uruchom program
 +
# z PRZEKIEROWANIEM ZAPISYWANIA WYNIKOW -- BARDZO WAZNE
 +
./test1 >& wynik.txt
 +
EOF
 +
</source>
  
$ echo 'polecenie_i_jego_opcje >&plik_wynikow' | qsub -W depend=afterany:1144.tezro [pozostałe opcje dla qsub]
+
* wstawienie zadania:
  
gdzie numer <code>1144.tezro</code> to identyfikator poprzednio wstawionego zadania. Każde kolejne zadanie wstawiane do kolejki można w&nbsp;analogiczny sposób uzależniać od poprzednio wstawionego zadania, podając w <code>afterany:JobID</code> identyfikator tego poprzedniego. Utworzy się wtedy łańcuch zależnych zadań, uruchamianych po kolei.
+
<pre>
 +
chmod +x skrypt.sh
 +
./skrypt.sh
 +
</pre>
  
PBS posiada szereg typów zależności. Użyty w przykładzie typ '''<code>afterany</code>''' oznacza, że zadanie uruchomi się dopiero po zakończeniu wskazanego poprzedniego zadania, niezależnie czy zakończy się ono poprawnie czy z błędem. Więcej informacji na ten temat można uzyskać w manualu polecenia '''<code>qsub</code>''', w sekcji z opisem opcji '''<code>-W</code>'''.
+
Więcej o poleceniu '''qsub''' można znaleźć w manualu - poprzez uruchomienie polecenia:
  
== Najczęściej używane polecenia ==
+
<pre>
 +
man qsub
 +
</pre>
  
Poniższa tabela zawiera krótki opis najczęściej używanych poleceń systemu PBS.
+
=== Zlecenie rezerwacji ===
  
;Tabela. Polecenia PBS
+
Próba utworzenia rezerwacji w bieżącym dniu (dlatego pominięto rok, miesiąc i dzień w wymaganiach) od 12:00 do 14:00, powtarzającej się w poniedziałki, środy i piątki aż do 31.12.2018, na zasobach składających się z dwóch części po 1 rdzeniu i 2000 MB RAM, z której mogą korzystać użytkownicy user1 oraz user2
{|style="border:1px solid #737889; margin-right:2px; margin-left:2px; padding-left:2px;" cellspacing="0"
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''Polecenie'''
 
|style="border-bottom:1px solid #737889;"|'''opis'''
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat'''
 
|style="border-bottom:1px solid #737889;"|lista zadań w kolejkach
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -n'''
 
|style="border-bottom:1px solid #737889;"|lista zadań w kolejkach z podaniem na jakim węźle liczy się każde zadanie
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -q'''
 
|style="border-bottom:1px solid #737889;"|lista kolejek
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -Q'''
 
|style="border-bottom:1px solid #737889;"|ustalone limity kolejek
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -a'''
 
|style="border-bottom:1px solid #737889;"|lista wszystkich zadań
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -au userid'''
 
|style="border-bottom:1px solid #737889;"|lista zadań użytkownika userid
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -r'''
 
|style="border-bottom:1px solid #737889;"|lista uruchomionych zadań (status running)
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -f jobid'''
 
|style="border-bottom:1px solid #737889;"|obszerna informacja o zadaniu o identyfikatorze jobid
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -Qf queue'''
 
|style="border-bottom:1px solid #737889;"|obszerna informacja o kolejce queue
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qstat -B'''
 
|style="border-bottom:1px solid #737889;"|krótka informacja o stanie serwera PBS
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub'''
 
|style="border-bottom:1px solid #737889;"|wstaw zadanie do systemu (jeżeli nie ma parametrów, używa domyślnych ustawień)
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub jobscript'''
 
|style="border-bottom:1px solid #737889;"|wstaw skrypt jobscript do systemu kolejkowania
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub -I'''
 
|style="border-bottom:1px solid #737889;"|uruchom zadanie interaktywnie
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub -q queue'''
 
|style="border-bottom:1px solid #737889;"|wstaw zadanie do konkretnej kolejki queue
 
|-
 
|style="border-right:1px solid #737889;"|'''qdel jobid'''
 
|usuwa zadanie, niezależnie od jego stanu w kolejce
 
|-
 
|}
 
  
== Przestrzeń tymczasowa ==
+
<pre>
Na klastrze [[Supernova]] przestrzeń na pliki tymczasowe generowane przez oprogramowanie znajduje się we współdzielonym systemie plików Lustre. Przestrzeń ta przeznaczona jest wyłącznie do przechowywania plików tymczasowych generowanych przez zadania obliczeniowe. Każdy użytkownik ma na każdym węźle katalog <code>/lustre/scratch/$USER</code> i tylko tam ma prawo do zapisu.
+
pbs_rsub -R 1200 -E 1400 -r "FREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20181231" -l select=2:ncpus=1:mem=2000MB -U user1,user2
 +
</pre>
  
Generowanie i przechowywanie plików tymczasowych w katalogach domowych jest zabronione.
+
Jeżeli utworzenie rezerwacji będzie możliwe - system kolejkowy wyśle wiadomość (na adres zarejestrowany w bazie) z potwierdzeniem.
  
'''Zobacz też:''' [[PBSPro]], [[konfiguracja kolejek PBS]]
+
'''Zobacz też:''' [[PBSPro]]
  
 
{{systemy kolejkowe}}
 
{{systemy kolejkowe}}

Aktualna wersja na dzień 07:42, 13 wrz 2018

< Podręcznik użytkownika KDM < System kolejkowy < Jak korzystać z kolejek PBS

Kolejki

Na klastrze Bem zadaniami obliczeniowymi zarządza system kolejkowania PBSPro.

Uruchamianie obliczeń odbywa się w ramach kolejek, które różnią się między sobą priorytetem, limitami czy prawami dostępu (a czasem również dostępnymi zasobami).

Uruchamianie typowych obliczeń na klastrze Bem nie wymaga podawania kolejki, gdyż wyboru odpowiedniej kolejki dokonuje system kolejkowy na podstawie podanych przez użytkownika wymagań odnośnie czasu wykonania.
Ogólna zasada jest następująca: wszystkie zadania należy zlecać do kolejki main, która w zależności od czasu trwania zadania przekieruje je do kolejki o odpowiednio długim czasie wykonywania.
Dla przykładu zadanie o czasie 123h trafi do kolejki shoth168h. Każda z kolejek ma inny priorytet. W ogólności im krótsza kolejka tym wyższy priorytet. Kolejka normal o maksymalnej długości zadania do 504h ma najniższy priorytet i ograniczone zasoby. Pozostałe kolejki korzystają ze wszystkich zasobów.

Podstawowe kolejki na klastrze Bem przeznaczone dla wszystkich użytkowników KDM:

  • main - zadania należy zlecać do tej kolejki podając limit czasu (przy użyciu konstrukcji opisanej w dalszej części artykułu: -l walltime=X)
  • short, short48h, short168h, normal, infinity - użytkownik nie ma możliwości bezpośredniego wstawiania zadań do tych kolejek, dokona tego system kolejkowy automatycznie, w oparciu o podany limit czasu.

Kolejki dostępne na klastrze Bem dla użytkowników infrastruktury PL-Grid:

  • plgrid, plgrid-long, plgrid-testing

W systemie kolejkowym zakładane są także czasowo dedykowane kolejki na specyficzne potrzeby projektowe lub grup badawczych.

Sprawdzanie stanu kolejek

Do sprawdzenia stanu kolejki służy polecenie qstat. Można korzystać z następujących jego parametrów:

  • -r - pokazuje uruchomione zadania
  • -i - pokazuje zadania oczekujące
  • -u - pokazuje zadania wybranego użytkownika
  • -f - pokazuje szczegółowe informacje o zadaniach (lub zadaniu, jeżeli podamy jego identyfikator po parametrze)

Konfigurację kolejek można przeglądać za pomocą komendy:

> qstat -q

Dokładniejsze informacje na temat kolejki wyświetla komenda:

> qstat -Qf nazwa_kolejki

Zasoby

Po wyborze odpowiedniej kolejki należy zadeklarować ilość wymaganych zasobów.

Przydział zasobów może odbywać się w jednej, spójnej części (dla zadań szeregowych lub zrównoleglonych w obrębie jednego węzła) lub kilku części (dla zadań zrównoleglonych przy użyciu bibliotek MPI). Deklarację buduje się używając wyrażenia select dla parametru -l polecenia qsub (opisanego w dalszej części). Jej format jest następujący:

select=X:zasób1=wartość1:zasób2=wartość2+Y:zasób3=wartość3:zasób4=wartość4

gdzie:

  • X - liczba części alokacji (tzw. chunków) pierwszego zbioru zasobów
  • zasób1=wartość1:zasób2=wartość2 - opis pierwszego zbioru zasobów
  • Y - liczba części drugiego zbioru zasobów
  • zasób3=wartość3:zasób4=wartość4 - opis drugiego zbioru zasobów

Liczba zbiorów zasobów może być różna (równa 1 lub większa). Alokowane części (chunki) mogą (ale nie muszą) znaleźć się na różnych węzłach.

Dostępne parametry:

  • ncpus - liczba rdzeni obliczeniowych
    • domyślnie: 1
    • maksymalnie:
      • 24 na 720 węzłach
      • 28 na 192 węzłach
  • mem - rozmiar pamięci
    • Wielkość pamięci zadeklarowana dla zadania w kolejce powinna być większa (np. o 10%) od wartości zadeklarowanej dla aplikacji w pliku wejściowym. Należy zadbać, aby w pliku wejściowym podana była poprawna wielkość pamięci, wystarczająca do skutecznego wykonania obliczeń dla danego rozmiaru problemu obliczeniowego. Jeśli aplikacja, uruchomiona podczas wykonywania się zadania kolejkowego, spróbuje użyć więcej pamięci niż zostało zadeklarowane dla zadania, to aplikacja zostanie zabita i zadanie zakończy się niepowodzeniem.
    • Przykład dla aplikacji Gaussian:
      • Deklaracja w pliku wejściowym dla obliczeń na 8 procesorach i z wykorzystanie 4GB pamięci:
%nproc=8
%mem=4000MB
      • odpowiednia deklaracja dla zadania kolejkowego:
-l select=1:ncpus=8:mem=4400MB
    • domyślnie: 2000 MB per każdy chunk
    • maksymalnie:
      • 60 000 MB na 688 węzłach
      • 125 000 MB na 214 węzłach
      • 500 000 MB na 10 węzłach


Osobnym słowem kluczowym, którego używa się podczas żądania zasobów, jest liczba procesów MPI w danej części alokacji (w chunku). Należy skorzystać z tego parametru, kiedy w jednej części alokacji (chunk) chcemy uruchomić jeden lub więcej procesów MPI:

  • mpiprocs - liczba procesów MPI
    • domyślnie: 1
    • maksymalnie: 24 lub 28
    • wielkość mpiprocs nigdy nie może być większa niż ncpus w żadnym chunku!
    • jeśli aplikacja jest zrównoleglona jedynie przy użyciu MPI i nie korzysta z OpenMP, to wartość mpiprocs powinna być zawsze równa ncpus!


Jeśli aplikacja jest zrównoleglona przy użyciu OpenMP, to należy podać liczbę wątków w ramach części alokacji (chunk):

  • ompthreads - liczba wątków (threads)
    • domyślnie: równa wartości ncpus
    • maksymalnie: 24 lub 28
    • wielkość ompthreads nigdy nie może być większa niż ncpus w żadnym chunku!

W przypadku aplikacji hybrydowych, korzystających jednocześnie z MPI i OpenMP, wielkość ncpus w każdym chunku musi być równa mpiprocs * ompthreads, vide przykłady poniżej.


Przykładowe definicje wymagań

Zadanie uruchamia jeden zestaw, w którym jeden proces będzie mógł uruchomić 4 wątki OpenMP lub po prostu cztery procesy i wymaga 4096 MB RAM na cały zestaw. Całość uruchomi się w ramach jednego węzła:

select=1:ncpus=4:mem=4096MB

Zadanie uruchamia 8 zestawów po jeden proces, a każdy proces wymaga 512 MB RAM. Poszczególne zestawy mogą znaleźć się na dowolnej kombinacji węzłów - jednym lub więcej:

select=8:ncpus=1:mem=512MB

Zadanie uruchamia 8 zestawów po 4 procesy MPI, po 4 w każdej części alokacji (i domyślne 2000 MB na każde 4 procesy):

select=8:ncpus=4:mpiprocs=4

Zadanie wymaga 16GB RAM (i domyślnie jednego rdzenia):

select=1:mem=16GB

Zadanie wymaga 4 zestawów po 2 procesy MPI, z których każdy uruchomi po 12 wątków OpenMP i 16GB pamięci per każdy zestaw. Należy zwrócić uwagę, że w każdym chunku jest fizycznie wymagane 2mpi*12threads=24 rdzenie, dlatego ncpus musi przyjąć właśnie taką wartość:

select=4:ncpus=24:mpiprocs=2:ompthreads=12:mem=16GB

Alokacja w powyższym przypadku będzia wygłądać następująco:

chunk pierwszy:
\_
  proces MPI pierwszy
  \_ pierwszy wątek OpenMP
  \_ drugi wątek OpenMP
  \_ ...
  \_ 12-ty wątek OpenMP
  proces MPI drugi
  \_ pierwszy wątek OpenMP
  \_ drugi wątek OpenMP
  \_ ...
  \_ 12-ty wątek OpenMP

chunk drugi:
\_
  proces MPI pierwszy
  \_ pierwszy wątek OpenMP
  \_ drugi wątek OpenMP
  \_ ...
  \_ 12-ty wątek OpenMP
  proces MPI drugi
  \_ pierwszy wątek OpenMP
  \_ drugi wątek OpenMP
  \_ ...
  \_ 12-ty wątek OpenMP

Uruchamianie aplikacji wykorzystującej zarówno MPI jak i OpenMP, implementacja Intel MPI:

mpirun -genv OMP_NUM_THREADS=$OMP_NUM_THREADS -genv I_MPI_PIN_DOMAIN=omp /ścieżka/aplikacja.x

Wstawianie zadań

Do wstawiania zadań do kolejki służy polecenie qsub.

Opis zadania powinien być zawarty w skrypcie powłoki. Następnie taki skrypt przekazywany jest do kolejki jako parametr polecenia qsub (lub na standardowe wejście tej komendy). Najważniejsze parametry polecenia można znaleźć poniżej:

  • -q - wybór kolejki
  • -l specyfikacja wymagań - wartości parametru mogą być następujące
    • select= - opis wymagań
    • software= - informacja o używanym oprogramowaniu
  • -N - nazwa zadania (jej długość nie może przekraczać 12 znaków)
  • -m - włączenie wysyłania powiadomień o zdarzeniach
    • b - o rozpoczęciu zadania
    • e - o zakończeniu zadania
    • n - wyłączenie powiadomień
  • -I - zadanie interaktywne (w tym przypadku nie należy przekazywać skryptu)
  • -X - przekierowanie wyświetlania (ma sens w przypadku zadań interaktywnych, wymaga logowania z przekierowaniem wyświetlania

Cenną cechą programu qsub jest możliwość przekazywania parametrów w skrypcie podanym jako argument, poprzez linie zaczynające się od:

#PBS

Usuwanie zadań

Jeżeli z jakiegoś powodu istnieje potrzeba usunięcia zadania - należy skorzystać z polecenia qdel, które przyjmuje jako parametr identyfikator zadania. Można kasować zadania zarówno oczekujące w kolejce jak i uruchomione.

Rezerwacje

Może się zdarzyć, że dostęp do zasobów potrzebny jest w określonym czasie np. za 3 tygodnie w poniedziałek między godziną 8 a 16. W takich przypadkach należy skorzystać z rezerwacji - powoduje to powstanie nowej kolejki, do której wstawione zadania nie będą konkurować o dostęp z innymi zadaniami. Należy jednak pamięć, że nie zawsze będzie to możliwe (będzie tylko wtedy kiedy system kolejkowy w żądanym czasie będzie w stanie zapewnić zasoby). Tworzenie rezerwacji odbywa się poleceniem pbs_rsub, którego najważniejsze parametry to:

  • -R - czas rozpoczęcia rezerwacji w formacie YYYYMMDDHHmm (201302010456 oznacza w takim przypadku 4:56 01.02.2013)
  • -E - czas zakończenia rezerwacji w formacie YYYYMMDDHHmm
  • -l - specyfikacja zasobów rezerwacji (w formacie takim, jak w przypadku zadań)
  • -r - reguła rekurencji (jeżeli rezerwacja ma się powtarzać cyklicznie, więcej na ten temat w manualu polecenia pbs_rsub)
  • -U - lista użytkowników, którzy mogą korzystać z rezerwacji

Do wyświetlenia informacji o rezerwacjach służy polecenie pbs_rstat. Bez parametrów listuje ono założone rezerwacje, a szczegóły o wybranej można zobaczyć dodając parametr -f i identyfikator. Aby usunąć rezerwację należy użyć polecenia pbs_rdel.

Przykłady

Uruchomienie obliczeń na postawie skryptu

  • zawartość skryptu uruchom.sh
#!/bin/bash
#PBS -q main
#PBS -l walltime=6:00:00
#PBS -l select=1:ncpus=2:mem=2048MB
#PBS -l software=test_qsub
#PBS -m be

# wejscie do katalogu, z ktorego zostalo wstawione zadania
cd $PBS_O_WORKDIR

# uruchom program 
# z PRZEKIEROWANIEM ZAPISYWANIA WYNIKOW -- BARDZO WAZNE
./test1 >& wynik.txt
  • Bardzo ważne: każde polecenie wykonywane w skrypcie zadania MUSI przekierowywać wyniki drukowane na standardowe wyjścia stdout i stderr do plików w katalogu domowym. Zadania wstawione bez przekierowania będą zabijane bez ostrzeżenia:
./test1 >& wynik.txt
  • wstawienie skryptu
qsub uruchom.sh

Uruchomienie zadania interaktywnego

qsub -I -l walltime=6:00:00 -l select=1:ncpus=1:mem=2048MB -l software=CFX_14.5

Przekazanie skryptu przez standardowe wejście qsub

  • zawartość pliku skrypt.sh
cat << EOF | qsub
#!/bin/bash
#PBS -q main
#PBS -l walltime=2:00:00
#PBS -l select=1:mem=512MB
#PBS -l software=qsub_stdin
#PBS -m be

# wejscie do katalogu, z ktorego zostalo wstawione zadania
# \ przez $ jest wymagany, aby powloka nie podmienila
# $PBS_O_WORKDIR na wartosc podczas wstawiania - tylko
# podczas dzialania zadania na wezle

cd \$PBS_O_WORKDIR

# uruchom program
# z PRZEKIEROWANIEM ZAPISYWANIA WYNIKOW -- BARDZO WAZNE
./test1 >& wynik.txt
EOF
  • wstawienie zadania:
chmod +x skrypt.sh
./skrypt.sh

Więcej o poleceniu qsub można znaleźć w manualu - poprzez uruchomienie polecenia:

man qsub

Zlecenie rezerwacji

Próba utworzenia rezerwacji w bieżącym dniu (dlatego pominięto rok, miesiąc i dzień w wymaganiach) od 12:00 do 14:00, powtarzającej się w poniedziałki, środy i piątki aż do 31.12.2018, na zasobach składających się z dwóch części po 1 rdzeniu i 2000 MB RAM, z której mogą korzystać użytkownicy user1 oraz user2

pbs_rsub -R 1200 -E 1400 -r "FREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20181231" -l select=2:ncpus=1:mem=2000MB -U user1,user2

Jeżeli utworzenie rezerwacji będzie możliwe - system kolejkowy wyśle wiadomość (na adres zarejestrowany w bazie) z potwierdzeniem.

Zobacz też: PBSPro