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

Z KdmWiki
Przejdź do nawigacji Przejdź do wyszukiwania
(Aktualizacja sposobu deklaracji wymagań oraz informacji o scratchu)
Linia 27: Linia 27:
 
  # przejdź do katalogu z danymi zadania (bardzo ważne!):  
 
  # przejdź do katalogu z danymi zadania (bardzo ważne!):  
 
  '''cd jobdir1''' <br />
 
  '''cd jobdir1''' <br />
# załóż katalog tymczasowy:
 
'''mkdir -p /scratch/$USER/temp1''' <br />
 
 
  # uruchom program:  
 
  # uruchom program:  
 
  '''./ścieżka/program [opcje] >&plik_wynikow ''' <br />
 
  '''./ścieżka/program [opcje] >&plik_wynikow ''' <br />
# skasuj katalog tymczasowy:
 
'''rm -rf /scratch/$USER/temp1'''
 
  
:Patrz także [[OpenPBS#Przykładowy skrypt OpenPBS|Przykładowy skrypt OpenPBS]].
 
  
 
:Następnie należy wstawić zadanie poleceniem <code>qsub</code>:
 
:Następnie należy wstawić zadanie poleceniem <code>qsub</code>:
Linia 50: Linia 45:
 
Jeśli kolejka wymaga autoryzacji, to zadanie wpuszczone zostanie tylko wtedy, jeśli dany użytkownik ma do danej kolejki dostęp.
 
Jeśli kolejka wymaga autoryzacji, to zadanie wpuszczone zostanie tylko wtedy, jeśli dany użytkownik ma do danej kolejki dostęp.
  
 +
;Deklaracja wymagań
 +
 +
Wymagania zadania specyfikuje się za pomocą parametru -l (małe L) polecenia qsub. Zasoby, które można alokować:
 +
* ncpus - liczba rdzeni (domyślnie 1)
 +
* mpiprocs - liczba procesów MPI (domyślnie 1)
 +
* mem - ilość pamięci (domyślnie 2000 MB)
 +
* epoch - typ węzłów ('''Chwilowo podanie tego wymagania z parametrem hp jest konieczne, aby zadanie zaczęło się wykonywać!''')
 +
** hp - nowe węzły
 +
** old - stare węzły
 +
 +
 +
Jednostką alokacji wymagań jest chunk. Użytkownik specyfikuje ile i jakich zasobów potrzebuje w danej jednostce, a dodatkowo, jeżeli zadanie jest zrównoleglone przez MPI - ile jednostek. Przykład:
 +
 +
* Zadanie bez komunikacji międzywęzłowej, potrzebujące 4 rdzeni oraz 7500 MB RAM
 +
  -l select=1:ncpus=4:mem=7500MB:epoch=hp
 +
 +
* Zadanie MPI potrzebujące 24 rdzeni po 1800 MB na rdzeń (ok 43GB w sumie)
 +
  -l select=24:ncpus=1:mem=1800MB:epoch=hp
 +
 +
W powyższym przykładzie 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ż z możliwie krótkim czasem oczekiwania na uruchomienie. Może się jednak zdarzyć (przy dużej fragmentacji alokacji), że każdy chunk trafi na inny węzeł. Jeżeli taka możliwość jest niepożądana można wymusić koncentrację zasobów zwiększając rozmiar jednostki alokacji:
 +
 +
  -l select=2:ncpus=12:mpiprocs=12:mem=21500MB:epoch=hp
 +
 +
W przypadku chunka więcej niż jednoprocesorowego, podczas korzystania z MPI ważne jest aby dodać parametr mpiprocs - spowoduje to odpowiednią liczbę wpisów w pliku $PBS_NODEFILE, który zawiera listę hostów na których zadanie będzie się wykonywać.
  
 
;Uwagi
 
;Uwagi
Linia 131: Linia 150:
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub -I'''
 
|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;"|uruchom zadanie interaktywnie
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub -l limit=wartość'''
 
|style="border-bottom:1px solid #737889;"|wstaw zadanie z podaniem wartości konkretnego limitu
 
 
|-
 
|-
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub -q queue'''
 
|style="border-bottom:1px solid #737889; border-right:1px solid #737889;" |'''qsub -q queue'''
Linia 144: Linia 160:
  
 
== Przestrzeń tymczasowa ==
 
== Przestrzeń tymczasowa ==
Przestrzeń na pliki tymczasowe generowane przez oprogramowanie znajduje się w lokalnych systemach plików na wszystkich węzłach klastra Nova znajduje się w ścieżce <code>/scratch</code>. 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>/scratch/$USER</code> i tylko tam ma prawo do zapisu.
+
Przestrzeń na pliki tymczasowe generowane przez oprogramowanie znajduje się we współdzielonym systemie plików Lustre na wszystkich węzłach klastra Nova. 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.
  
 
Generowanie i przechowywanie plików tymczasowych w katalogach domowych jest zabronione.
 
Generowanie i przechowywanie plików tymczasowych w katalogach domowych jest zabronione.
  
Użytkownik może ustalić gdzie liczy się jego zadanie (a tym samym gdzie generowane są pliki tymczasowe) poleceniem '''<code>qstat -n [jobid]</code>'''. Pliki zadań zakończonych na klastrze [[Nova]] można odnaleźć wywołując polecenie:
+
Do czasu pełnej intgracji klastra (co nastąpi wktrótce, po zakończeniu zadań na starych węzłach) istnieją dwie instacje Lustre:
$ '''pdsh -g all ls -la /scratch/$USER'''
+
* stara - dostępna z węzła głównego (nova) oraz starych węzłów (epoch=old, wnXXX - gdzie XXX < 329)
 +
* nowa - dostępna na nowych węzła klastra (wnXXX, gdzie XXX > 328)
  
 
'''Zobacz też:''' [[PBSPro]], [[konfiguracja kolejek PBS]]
 
'''Zobacz też:''' [[PBSPro]], [[konfiguracja kolejek PBS]]

Wersja z 11:00, 25 maj 2011

< Podręcznik użytkownika KDM < System kolejkowy

Portable Batch System (PBS) - system kolejkowania dostępny w kilku wersjach:

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.

Operacje na zadaniach

Wstawianie zadań do kolejki

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 qsub.

Można zrobić to na dwa sposoby:

  • Sposób pierwszy, najprostszy, z wykorzystaniem wyłącznie polecenia qsub:
$ echo 'polecenie-do-wykonania-i-jego-opcje >&plik_wynikow' |qsub [opcje dla qsub]
Przykład:
$ echo g98 nazwa.inp |qsub -N nazwa-zadania
  • Sposób drugi, z wykorzystaniem skryptu
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 /scratch, itp.
Przykład skryptu:
#!/bin/sh 
# przejdź do katalogu z danymi zadania (bardzo ważne!): cd jobdir1
# uruchom program: ./ścieżka/program [opcje] >&plik_wynikow


Następnie należy wstawić zadanie poleceniem qsub:
$ qsub [opcje dla qsub] nazwa-skryptu
Przykład:
$ qsub -N nazwa ./skrypt1

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 na terminalu informację o identyfikatorze zadania:

1677.leo.wcss.wroc.pl

Jeśli kolejka wymaga autoryzacji, to zadanie wpuszczone zostanie tylko wtedy, jeśli dany użytkownik ma do danej kolejki dostęp.

Deklaracja wymagań

Wymagania zadania specyfikuje się za pomocą parametru -l (małe L) polecenia qsub. Zasoby, które można alokować:

  • ncpus - liczba rdzeni (domyślnie 1)
  • mpiprocs - liczba procesów MPI (domyślnie 1)
  • mem - ilość pamięci (domyślnie 2000 MB)
  • epoch - typ węzłów (Chwilowo podanie tego wymagania z parametrem hp jest konieczne, aby zadanie zaczęło się wykonywać!)
    • hp - nowe węzły
    • old - stare węzły


Jednostką alokacji wymagań jest chunk. Użytkownik specyfikuje ile i jakich zasobów potrzebuje w danej jednostce, a dodatkowo, jeżeli zadanie jest zrównoleglone przez MPI - ile jednostek. Przykład:

  • Zadanie bez komunikacji międzywęzłowej, potrzebujące 4 rdzeni oraz 7500 MB RAM
  -l select=1:ncpus=4:mem=7500MB:epoch=hp
  • Zadanie MPI potrzebujące 24 rdzeni po 1800 MB na rdzeń (ok 43GB w sumie)
  -l select=24:ncpus=1:mem=1800MB:epoch=hp

W powyższym przykładzie 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ż z możliwie krótkim czasem oczekiwania na uruchomienie. Może się jednak zdarzyć (przy dużej fragmentacji alokacji), że każdy chunk trafi na inny węzeł. Jeżeli taka możliwość jest niepożądana można wymusić koncentrację zasobów zwiększając rozmiar jednostki alokacji:

  -l select=2:ncpus=12:mpiprocs=12:mem=21500MB:epoch=hp

W przypadku chunka więcej niż jednoprocesorowego, podczas korzystania z MPI ważne jest aby dodać parametr mpiprocs - spowoduje to odpowiednią liczbę wpisów w pliku $PBS_NODEFILE, który zawiera listę hostów na których zadanie będzie się wykonywać.

Uwagi
  • Jeśli użytkownik przeceni wymagania zadania, to zadanie będzie liczone w kolejce o niższym priorytecie, będzie więc dłużej czekać na uruchomienie i dłużej się liczyć.
  • Jeśli użytkownik nie doceni wymagań zadania, to system "zabije" zadanie z powodu przekroczenia limitów zasobów.

Sprawdzanie stanu zadania

Stan zadania i kolejki można sprawdzić poleceniem qstat. Zobacz też: konfiguracja kolejek PBS.

$ qstat

Kasowanie zadań

Aby skasować wstawione do systemu zadanie należy użyć polecenia qdel:

$ qdel identyfikator_zadania

Zadanie zostanie usunięte bez względu na jego status.

Ustalanie zależności zadań

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]

PBS zwróci wtedy identyfikator zadania (JobID), np.:

1144.tezro

Wstawiając następne zadanie trzeba podać, kiedy ma się ono zacząć, np. dopiero po zakończeniu poprzedniego zadania:

$ echo 'polecenie_i_jego_opcje >&plik_wynikow' | qsub -W depend=afterany:1144.tezro [pozostałe opcje dla qsub]

gdzie numer 1144.tezro to identyfikator poprzednio wstawionego zadania. Każde kolejne zadanie wstawiane do kolejki można w analogiczny sposób uzależniać od poprzednio wstawionego zadania, podając w afterany:JobID identyfikator tego poprzedniego. Utworzy się wtedy łańcuch zależnych zadań, uruchamianych po kolei.

PBS posiada szereg typów zależności. Użyty w przykładzie typ afterany 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 qsub, w sekcji z opisem opcji -W.

Najczęściej używane polecenia

Poniższa tabela zawiera krótki opis najczęściej używanych poleceń systemu PBS.

Tabela. Polecenia PBS
Polecenie opis
qstat lista zadań w kolejkach
qstat -n lista zadań w kolejkach z podaniem na jakim węźle liczy się każde zadanie
qstat -q lista kolejek
qstat -Q ustalone limity kolejek
qstat -a lista wszystkich zadań
qstat -au userid lista zadań użytkownika userid
qstat -r lista uruchomionych zadań (status running)
qstat -f jobid obszerna informacja o zadaniu o identyfikatorze jobid
qstat -Qf queue obszerna informacja o kolejce queue
qstat -B krótka informacja o stanie serwera OpenPBS
qsub wstaw zadanie do systemu (jeżeli nie ma parametrów, używa domyślnych ustawień)
qsub jobscript wstaw skrypt jobscript do systemu kolejkowania
qsub -I uruchom zadanie interaktywnie
qsub -q queue wstaw zadanie do konkretnej kolejki queue
qdel jobid usuwa zadanie, niezależnie od jego stanu w kolejce

Przestrzeń tymczasowa

Przestrzeń na pliki tymczasowe generowane przez oprogramowanie znajduje się we współdzielonym systemie plików Lustre na wszystkich węzłach klastra Nova. 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 /lustre/scratch/$USER i tylko tam ma prawo do zapisu.

Generowanie i przechowywanie plików tymczasowych w katalogach domowych jest zabronione.

Do czasu pełnej intgracji klastra (co nastąpi wktrótce, po zakończeniu zadań na starych węzłach) istnieją dwie instacje Lustre:

  • stara - dostępna z węzła głównego (nova) oraz starych węzłów (epoch=old, wnXXX - gdzie XXX < 329)
  • nowa - dostępna na nowych węzła klastra (wnXXX, gdzie XXX > 328)

Zobacz też: PBSPro, konfiguracja kolejek PBS