Biocentrum Ochota - Grafen

Infrastruktura informatyczna dla rozwoju strategicznych kierunków biologii i medycyny

MENEDŻER ZADAŃ

Dostępne zasoby

Aby sprawdzić rozmiar dostępnej pamięci i rdzeni obliczeniowych użytkownik może wykorzystać polecenie menedżera zadań pbsnodes. Najbardziej popularne wywołania tego polecenia to:

  • pbsnodes -a pokazuje dostępne zasoby wszystkich węzłów,
  • pbsnodes <nazwa węzła> pokazuje dostępne zasoby wybranego węzła.

Przykładowy wynik tego polecenia:

$ pbsnodes n4
n4
state = free
np = 12
properties = kevlar,intel,mpi
ntype = cluster
status = rectime=1327145281,varattr=,jobs=,state=free,netload=804429755,gres=,loadave=0.00,
ncpus=12,physmem=24685132kb,availmem=32322812kb,totmem=32685460kb,idletime=563910,nusers=0,
nsessions=? 15201,sessions=? 15201,uname=Linux n4 2.6.18-238.19.1.el5 #1 SMP Fri Jul 15 
00:48:58 EDT 2011 x86_64,opsys=linux,gpus = 0

Oznacza on, że węzeł n4:

  • jest włączony i gotowy do pracy (state=free),
  • posiada 12 rdzeni obliczeniowych (ncpus=12),
  • nie jest obciążony (loadave=0.00),
  • posiada 24 GB pamięci RAM (physmem=24685132kb),
  • nie posiada akceleratora GPU (gpus=0).

UWAGA - Użytkownik może czasem napotkać węzły ze statusem offline. Oznacza to, że węzeł jest czasowo wyłączony z systemu obliczeń, np. z powodu interwencji serwisowej.

 
Powrót na początek strony

Uruchamianie zadania

Do uruchamiania zadań na węzłach służy polecenie qsub. Szczegółową dokumentację można znaleźć w instrukcji użytkownika, wyświetlanej poleceniem man qsub lub na stronie dokumentacji TORQUE. Podstawowy parametr (podawany na końcu) to skrypt do wykonania, najważniejsze opcje to:

  • -N <nazwa zadania>
    umożliwia podanie nazwy zadania, która będzie wykorzystywana do monitorowania go;
  • -l nodes=<liczba węzłów>:ppn=<liczba rdzeni>
    rezerwuje dla zadania określoną liczbę węzłów obliczeniowych i określoną liczbę rdzeni w każdym;
  • -l walltime=<godziny>:<minuty>:<sekundy>
    rezerwuje określony czas obliczeń, po upłynięciu którego zadanie zostanie usunięte;
  • -I
    wykonuje zadanie interaktywne - w chwili przydzielenia węzłów użytkownik zostaje przekierowany na konsolę pierwszego z nich i może wykonywać tam zadania ręcznie; w tym trybie powinno się wykonywać np. kompilacje czy pre- i postprocessing danych;
  • -X
    uruchamia system graficzny X do pracy interaktywnej;
  • -l pmem=<ilość pamięci>B
    rezerwuje określoną ilość pamięci na rdzeń.

Przykłady:

qsub -N nowezadanie skrypt.sh

Dodaje zadanie polegające na wykonaniu skryptu skrypt.sh do kolejki obliczeń. Nazwa zadania to nowezadanie.

qsub -l nodes=10:ppn=12 -l walltime=0:10:00 zadanie.sh

Jak wyżej, tylko rezerwujemy do obliczeń 10 węzłów po 12 rdzeni, a zadanie potrwa maksymalnie 10 minut.

qsub -I -X nodes=4

Wykonuje zadanie interaktywne - użytkownik dostaje do dyspozycji konsolę na pierwszym węźle przydzielonym do zadania. Dodatkowo uruchomione jest przekierowanie X.

qsub -l nodes=12:ppn=12 -l pmem=1GB

Rezerwuje 12 węzłów, na każdym 12 rdzeni, na każdy rdzeń 1 GB pamięci fizycznej.

 

Parametry zadania mogą zostać także przekazane w treści wykonywanego skryptu. Komentarze zaczynające się od liter PBS zostaną automatycznie rozpoznane przez system kolejkowy. Nazwy argumentów pozostają bez zmian. Za przykład niech posłuży poniższy skrypt:

#!/bin/sh
#PBS -N mojeZadanie
#PBS -l nodes=1:ppn=12,walltime=00:01:00

# Przygotowanie danych
cd $TMPDIR

echo Obliczenia...

cd ~/mp_linpack/bin_intel/intel64
mpirun -np $PBS_NP -f $PBS_NODEFILE ./xhpl_intel64

# Sprzatanie
cp $TMPDIR/plikdanych ~/plikwyjsciowy

Skrypt taki można uruchomić komendą qsub skrypt.sh, a wszystkie potrzebne parametry zostaną z niego odczytane. Znaczenie katalogu $TMPDIR wyjaśniono w części Pamięć masowa, zaś sposób uruchamiania zadań MPI w części Zadania MPI.

 
Powrót na początek strony

Precyzyjne określanie zasobów

Przedstawiona powyżej składnia żądań typu -l nodes=<liczba węzłów>:ppn=<liczba rdzeni> umożliwia określenie liczby węzłów obliczeniowych i wykorzystywanych rdzeni na każdym z nich. Czasem jednak to nie wystarcza, np. wysyłane zadanie wymaga użycia 10 oddzielnych węzłów po jednym rdzeniu i jeszcze jeden węzeł z sześcioma rdzeniami. W tej sytuacji, korzystając z przedstawionej składni, musielibyśmy zgłosić żądanie na 11 węzłów po 6 rdzenie, co doprowadziłoby do marnowana zasobów lub podzielić zadanie na dwa oddzielne, co z kolei nie zawsze jest możliwe i bezproblemowe. Możliwe są także sytuacje, gdy nie wszystkie węzły obliczeniowe są identyczne (np. różnią się typem procesora) i z tego powodu chcielibyśmy, by pewien wyróżniony węzeł znalazł się wśród przypisanych do naszego zadania. Dlatego w menedżerze zadań istnieje możliwość użycia funkcji tzw. Multi-Req, czyli elastycznego formułowania żądań zasobów. Funkcja ta została także uruchomiona w klastrze Grafen.

W Multi-Req żądanie zasobów przybiera postać listy pojedynczych żądań oddzielonych plusami:

qsub -l nodes=<żądanie1>+<żądanie2>+...+<żądanieN>

gdzie <żądanie> przybiera jedną z dwóch form:

  • <liczba węzłów>:ppn=<liczba rdzeni> lub
  • <nazwa węzła>:ppn=<liczba rdzeni>,

aby wskazać konkretny węzeł.

Przykładowo, następujące polecenia są prawidłowe:

  • qsub -l nodes=10:ppn=1 zadanie.sh
  • qsub -l nodes=10:ppn=1+1:ppn=6 zadanie.sh
  • qsub -l nodes=10:ppn=1+n13:ppn=6 zadanie.sh

Pierwsze z nich wykorzystuje dotychczasową konwencję do żądania 10 węzłów po jednym procesie. Drugie polecenie dodaje do tego żądanie dodatkowego węzła z sześcioma rdzeniami. Trzecie polecenie realizuje kolejną z możliwości, czyli wybranie konkretnego węzła obliczeniowego (tutaj n13) do tej części zadania, która wymaga 6 rdzeni.

 
Powrót na początek strony

Programy równoległe

Plik zadania przekazywany do wykonania oprócz parametrów zadania powinien zawierać również komendy do wykonania. Należy zwrócić uwagę, że komendy te będą wykonane tylko na pierwszym z przydzielonych węzłów. W przypadku, gdy nasze zadanie obejmuje wiele węzłów obliczeniowych, należy przekazać im odpowiednie polecenia. Jak to zrobić?

Tryb interaktywny

Jeżeli wybraliśmy tryb interaktywny, możemy po prostu zalogować się na odpowiednie węzły poprzez ssh i tam wpisać odpowiednie komendy. Węzły przydzielone naszemu zadaniu możemy poznać, wyświetlając plik $PBS_NODES (nazwy węzłów są w nim zwielokrotnione odpowiednio do liczby przydzielonych rdzeni). Przykładowa sesja interaktywna może przebiegać następująco:

[username@headnode username]$ qsub -I -l nodes=3:ppn=2
qsub: waiting for job 5559.master1.kevlar to start
qsub: job 5559.master1.kevlar ready
[username@n8 ~]$ cat $PBS_NODEFILE
n8
n8
n7
n7
n6
n6
[username@n8 ~]$ ./zadanie.bin 1 &
[1] 10794
[username@n8 ~]$ ssh n7
[username@n7 ~]$ ./zadanie.bin 2 &
[1] 5164
[username@n7 ~]$ exit
[username@n8 ~]$ ssh n6
[username@n6 ~]$ ./zadanie.bin 3 &
[1] 4489
[username@n6 ~]$ exit
[username@n8 ~]$
 
Powrót na początek strony
Automatycznie – pdsh

Aby uniknąć ręcznego wysyłania zadań w powyższy sposób, należy skorzystać z polecenia pdsh. Umożliwia ono zdalne wykonanie podanego polecenia na wskazanych węzłach. Przykładowo, aby wyświetlić czas pracy (polecenie uptime) węzłów n2, n3, n4 i n7 bez logowania się na nie, wpisujemy następujące polecenie:

[username@headnode username]$ pdsh -w n[2-4],n7 uptime
n7: 17:22:42 up 66 days, 6:00, 0 users, load average: 7.99, 7.97, 7.99
n4: 17:22:50 up 66 days, 6:00, 0 users, load average: 0.06, 0.07, 0.00
n3: 17:21:56 up 66 days, 6:00, 0 users, load average: 0.00, 0.00, 0.00
n2: 17:22:36 up 66 days, 6:00, 0 users, load average: 0.00, 0.00, 0.00

Dla większego ułatwienia polecenie pdsh jest zintegrowane z menedżerem kolejkowania. Oznacza to, że wydając je z poziomu zadania obliczeniowego, nie musimy podawać nazw węzłów - wybrany program zostanie wykonany na węzłach przydzielonych do bieżącego zadania. Przykładowo:

[username@headnode ~]$ qsub -I -l nodes=3:ppn=2
qsub: waiting for job 5560.master1.kevlar to start
qsub: job 5560.master1.kevlar ready
[username@n24 ~]$ pdsh uptime
n9: 20:16:50 up 66 days, 8:54, 0 users, load average: 7.08, 7.02, 7.01
n8: 20:15:42 up 66 days, 8:53, 0 users, load average: 0.00, 0.00, 0.00
n24: 20:16:26 up 42 days, 6:15, 0 users, load average: 0.04, 0.01, 0.00
[username@n24 ~]$

Mechanizm ten działa analogicznie w zadaniach nieinteraktywnych, z poziomu skryptu zadania.

 

Powrót na początek strony
Zadania MPI

Wyboru aktywnej biblioteki MPI można dokonać poprzez wykonanie polecenia mpi-selector-menu:

$ mpi-selector-menu
Current system default: <none>
Current user default: mvapich2_intel-1.6

"u" and "s" modifiers can be added to numeric and "U"
commands to specify "user" or "system-wide".

1. intel-mpi-rt-intel64-4.0.1p
2. mvapich2_gcc-1.6
3. mvapich2_intel-1.6
4. mvapich_gcc-1.2.0
5. mvapich_intel-1.2.0
6. openmpi_gcc-1.4.3
7. openmpi_intel-1.4.3
U. Unset default
Q. Quit

Selection (1-7[us], U[us], Q): 

Następnie należy zalogować się ponownie. Sprawdzenie, która biblioteka MPI jest naprawdę aktywna można wykonać poleceniem which mpirun.

Gdy korzystamy z biblioteki MPI należy podać liczbę procesów, które chcemy uruchomić oraz na jakich komputerach mają one być uruchomione.

$ mpirun -np <liczba_procesow> -f <plik_z_nazwami_hostów> <nazwa_programu>

Także tu można skorzystać z integracji z Torque, który udostępnia zmienne systemowe, ustawione na odpowiednie wartości na podstawie parametrów zadania. Dzięki temu prawie wszystkie wywołania programów MPI mogą wyglądać tak samo:

$ mpirun -np $PBS_NP -f $PBS_NODEFILE <nazwa_programu>

  

Powrót na początek strony