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 stronyUruchamianie 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 stronyPrecyzyjne 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 stronyProgramy 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