Podstawy SLURM
System kolejkowy jest wygodnym narzędziem uruchamiania zadań na zasobach obliczeniowych. W zależności od potrzeb, może on informować użytkownika o dacie i czasie rozpoczęcia, czy też zakończenia wykonywania danego zadania na wskazany adres e-mail.
Spis treści
Uruchamianie zadań batchowych
Do uruchamiania zadań batchowych służy komenda sbatch. W tym przypadku wszystkie komendy dla systemu kolejkowego umieszcza się w pliku lub podaje jako argumenty polecenia sbatch. W takim pliku linijki zawierające instrukcje sterujące dla systemu kolejkowego muszą zaczynać się ciągiem znaków #SBATCH. Umieszcza się je w początkowej części pliku. Dzięki temu system kolejkowy jest w stanie odczytać opcje jemu właściwe właśnie z tych linijek i uruchomić pozostałe instrukcje, dotyczące już samego zadania obliczeniowego, z dalszej części pliku.
Uruchamianie zadań interaktywnych
Możliwe jest również uruchomieni zadań interaktywnych, czyli konsoli na maszynie obliczeniowej. Do tego celu służy polecenie srun. Dla takiego typu zadania opcje podaje się jako argumenty polecenia srun. Obowiązkowym parametrem dla wywołania zadania interaktywnego dla polecenia srun jest opcja --pty /bin/bash lub podanie innej konsoli uruchomionej jako powłoka na maszynie zdalnej. Samo polecenie srun odpowiada za uruchomienie komendy w ramach zaalokowanych zasobów, jednak w przypadku, gdy zasoby nie zostały wcześniej zaalokowane, komenda ta uprzednio dokonuje ich rezerwacji tuż przed uruchomieniem obliczeń.
Najważniejsze opcje i parametry komend sbatch oraz srun zawiera poniższa tabela.
Opcja | Parametry | Opis | Wartość domyślna |
---|---|---|---|
-N (--nodes=) | <liczba węzłów> | Parametr służy do specyfikacji liczby węzłów | 1 |
--ntasks-per-node= | <liczba zadań> | Liczba żądanych zadań (rdzeni) na każdym węźle | 1 |
--cpus-per-task= | <liczba rdzeni> | Liczba żądanych rdzeni do dyspozycji każdego zadania | 1 |
--mem-per-cpu= | <ilość pamięci> | Ilość pamięci operacyjnej dla każdego zaalokowanego rdzenia obliczeniowego. Wartość należy podawać w bajtach, megabajtach lub gigabajtach stosując odpowiednie przedrostki, np. 1GB. | 4000Mb |
--mem= | <ilość pamięci> | Ilość pamięci operacyjnej dla całego zadania na węzeł obliczeniowy. Wartość należy podawać w bajtach, megabajtach lub gigabajtach stosując odpowiednie przedrostki, np. 1GB. | |
-t (--time=) | <czas obliczeń> | Maksymalny czas obliczeń. Czas należy podawać w formacie DD-GG:MM:SS gdzie DD, GG, MM, SS oznaczają odpowiednio żądaną liczbę dni, godzin, minut i sekund na zadanie. | zależne od kolejki |
-J (--job-name=) | <nazwa zadania> | Nazwa zadania w systemie kolejkowym | nazwa pliku batchowego lub bash jeśli zadanie interaktywne |
--mail-type | NONE, BEGIN, END, FAIL, REQUEUE, ALL, TIME_LIMIT, TIME_LIMIT_90, TIME_LIMIT_80, TIME_LIMIT_50 | System kolejkowy wyśle e-mail do użytkownika jeśli zadanie osiągnie jeden z zadanych stanów. | NONE |
--mail-user | <adres@e-mail.użytkownika> | Adres e-mail użytkownika na który ma zostać wysłana wiadomość o stanie zadania | informacja brana z Portalu PLGrid |
-p (--partition=) | <nazwa partycji> | Specyfikuje nazwę partycji (odpowiednika kolejki w PBS) do której ma trafić zadanie | plgrid |
-A | <nazwa grantu> | Specyfikuje nazwę grantu z którego zasoby będą brane do obliczeń | grant domyślny wybrany w Portalu PLGrid |
-o (--output=) | <nazwa pliku> | Specyfikuje nazwę pliku do którego zostanie zapisane standardowe wyjście | slurm-<JOBID>.out, gdzie JOBID to numer zadania, np. slurm-12345678.out |
-e (--error=) | <nazwa pliku> | Specyfikuje nazwę pliku do którego zostanie zapisane standardowe wyjście błędu | slurm-<JOBID>.out, gdzie JOBID to numer zadania, np. slurm-12345678.out |
Usuwanie zadań
Do usuwania zadań służy komenda scancel. W celu sunięcia zadania z kolejki potrzebny jest również jego identyfikator numeryczny (JOBID), który można wyświetlić komendą squeue. Cała sekwencja może wyglądać następująco:
scancel 12345678910
Jeśli zadania nie da się usunąć należy skontaktować się z administratorem komputera.
Monitorowanie kolejek, partycji, węzłów, zadań i zasobów
- Narzędzia systemu SLURM
squeue
- lista aktualnie zakolejkowanych/uruchomionych zadańscontrol show job [<ID_zadania>]
- szczegóły zadaniasstat -a -j <ID_zadania>/<ID_zadania.batch>
- zużycie zasobów w ramach kroków (step) działającego zadaniascancel <ID_zadania>
- usunięcie zadania (działającego lub zakolejkowanego)sacct
- zużycie zasobów zakończonego już zadania/krokuscontrol show partition [<nazwa_partycji>]
- właściwości partycjisinfo
- lista węzłówscontrol show node [<nazwa_węzła>]
- właściwości węzła
Więcej informacji znajduje się w pomocy danego polecenia możliwej do wywołania za pomocą opcji --help.
Przydatne zmienne systemu kolejkowego
- $SLURM_NTASKS Zmienna wskazuje na ilość tasków przydzielonych dla zadania. Najczęściej wykorzystywany do określania liczby rdzeni przydzielonej zadaniu np.:
mpiexec -np $SLURM_NTASKS moja_aplikacja
- $SLURM_SUBMIT_DIR Zmienna wskazuje na katalog, z którego uruchomiono obliczenia. Najczęściej wykorzystywana do wskazania plików dla zadania np.:
cd $SLURM_SUBMIT_DIR
- $SLURM_JOB_ID Zmienna wskazuje na numer zadania w systemie kolejkowym.
Przykłady
Zadanie interaktywne
Uruchomienie zadanie interaktywnego w kolejce "plgrid-testing" z możliwością pracy w trybie tekstowym wymagające jednego rdzenia na jednym węźle obliczeniowym przez 20 minut.
srun -N 1 --ntasks-per-node=1 -p plgrid-testing -t 20:00 --pty /bin/bash
Uruchomienie zadanie interaktywnego w kolejce "plgrid" z możliwością pracy w trybie graficznym wymagające 12 rdzeni na jednym węźle obliczeniowym przez 3h.
srun -N 1 --ntasks-per-node=12 -p plgrid -t 3:0:0 --pty /bin/bash
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.
Zadanie jednordzeniowe
Uruchomienie z linii poleceń zadania w kolejce "plgrid" wymagające jednego rdzenia na jednym węźle obliczeniowym przez 2h:
sbatch -p plgrid -t 2:0:0 nazwa_skryptu_do_uruchomienia
W przypadku skryptu należy użyć poniższych wpisów:
#SBATCH -p plgrid #SBATCH -t 2:0:0
Zadanie rezerwujące cały węzeł obliczeniowy
W pierwszej kolejności należy wiedzieć, czy na danej maszynie wszystkie węzły obliczeniowe mają tę samą liczbę rdzeni. Uruchomienie z linii poleceń zadania w kolejce "plgrid" rezerwujące cały 12-rdzeniowy węzeł obliczeniowy z domyślnym maksymalnym czasem trwania kolejki:
sabtch -N 1 --ntasks-per-node=12 -p plgrid nazwa_skryptu_do_uruchomienia
W przypadku skryptu należy użyć poniższych wpisów:
#SBATCH -p plgrid #SBATCH -N 1 #SBATCH --ntasks-per-node=12
Zadanie rezerwujące po X procesorów na Y wezłach obliczeniowych
Uwaga! Jeżeli używanych jest więcej, niż jeden węzeł obliczeniowy, wartość parametru ppn (ilość procesorów na węzeł, w tym przypadku X) musi wynosić maksymalną ilość procesorów na węźle (dla węzłów z procesorami Intel: 12; dla procesorów AMD: 64).
Uruchomienie z linii poleceń zadania w kolejce "plgrid" rezerwujące po X procesorów na Y wezłach obliczeniowych:
sbatch -N X --ntasks-per-node=Y -p plgrid nazwa_skryptu_do_uruchomienia
W przypadku skryptu należy użyć poniższych wpisów:
#SBATCH -p plgrid #SBATCH -N X #SBATCH --ntasks-per-node=Y
Zadania tablicowe
Zadania tablicowe to mechanizm pozwalający na zlecanie dużej ilości zadań wsadowych, które są do siebie podobne. Zadania tablicowe posiadają swój indeks, dostępny jako zmienną środowiskowa $SLURM_ARRAY_TASK_ID wewnątrz zadania, dzięki któremu można odpowiednio parametryzować uruchamianą aplikację. Sposób zlecania zadania jest analogiczny jak w przypadku zwykłych zadań wsadowych, a przykładowy skrypt zawierający parametr --array
-a
, definiujący zakres indeksów, wygląda następująco:
UWAGA! To jest przykładowy skrypt, którego NIE NALEŻY uruchamiać. Przed jego uruchomieniem należy przeglądnąć podane opcje i dostosować je do własnych potrzeb, zmieniając m.i. nazwę grantu, nazwę partycji, czas trwania zadania, itp.
#!/bin/bash -l
## Nazwa zlecenia
#SBATCH -J testjob
## Liczba alokowanych węzłów
#SBATCH -N 1
## Liczba zadań per węzeł (domyślnie jest to liczba alokowanych rdzeni na węźle)
#SBATCH --ntasks-per-node=1
## Ilość pamięci przypadającej na jeden rdzeń obliczeniowy (domyślnie 4GB na rdzeń)
#SBATCH --mem-per-cpu=1GB
## Maksymalny czas trwania zlecenia (format DD-HH:MM:SS)
#SBATCH --time=01:00:00
## Nazwa grantu do rozliczenia zużycia zasobów
#SBATCH -A <grant_id>
## Specyfikacja partycji
#SBATCH -p plgrid-testing
## Plik ze standardowym wyjściem
#SBATCH --output="output.out"
## Plik ze standardowym wyjściem błędów
#SBATCH --error="error.err"
## Parametr wyznaczający indeksy zadania tablicowego
#SBATCH --array=0-100
## przejscie do katalogu z ktorego wywolany zostal sbatch
cd $SLURM_SUBMIT_DIR
myCalculations $SLURM_ARRAY_TASK_ID
Zadania wykorzystujące MPI
Opis dotyczy uruchamiania zadań MPI na klastrze wyposażonych w system kolejkowy SLURM integrujący się z bibliotekami MPI. W przypadku KDM w ACK Cyfronet AGH dostępne są różne wersje bibliotek MPI (najczęściej OpenMPI i IntelMPI) dla większości dostępnych kompilatorów. Podczas uruchamiania aplikacji proszę nie podawać explicite parametru -n
lub -np
system dobierze odpowiednie wartości na podstawie parametrów alokacji (umieszczonych w skrypcie startowym) i zostaną one zastosowane. W uzasadnionych przypadkach, gdzie aplikacja wymaga specyficznej konfiguracji (np. lokalne wątkowanie), można podać wspomniane parametry.
UWAGA! To jest przykładowy skrypt, którego NIE NALEŻY uruchamiać. Przed jego uruchomieniem należy przeglądnąć podane opcje i dostosować je do własnych potrzeb, zmieniając m.i. nazwę grantu, nazwę partycji, czas trwania zadania, itp.
#!/bin/bash -l
## Nazwa zlecenia
#SBATCH -J MPITest
## Liczba alokowanych węzłów
#SBATCH -N 2
## Liczba zadań per węzeł (domyślnie jest to liczba alokowanych rdzeni na węźle)
#SBATCH --ntasks-per-node=12
## Ilość pamięci przypadającej na jeden rdzeń obliczeniowy (domyślnie 4GB na rdzeń)
#SBATCH --mem-per-cpu=4GB
## Maksymalny czas trwania zlecenia (format HH:MM:SS)
#SBATCH --time=01:00:00
## Nazwa grantu do rozliczenia zużycia zasobów
#SBATCH -A <grant_id>
## Specyfikacja partycji
#SBATCH -p plgrid-testing
## Plik ze standardowym wyjściem
#SBATCH --output="output.out"
## Plik ze standardowym wyjściem błędów
#SBATCH --error="error.err"
srun /bin/hostname
## Zaladowanie modulu IntelMPI w wersji domyslnej
module add plgrid/tools/impi
## przejscie do katalogu z ktorego wywolany zostal sbatch
cd $SLURM_SUBMIT_DIR
mpiexec ./calcDiff 100 50
Dobrą praktyką jest kompilowanie i uruchamianie aplikacji przy pomocy środowiska budowanego tym samym zestawem modułów. Zalecamy korzystanie z wrappera mpiexec
. Wielkość alokacji, w tym przypadku 2 węzły po 12 rdzenie, przekłada się bezpośrednio na 24 tasków dostępnych dla aplikacji korzystającej z MPI. Dopuszczalne jest uruchomienie serii aplikacji MPI w jednym skrypcie, ale najczęściej, ze względu na długi czas wykonania, nie jest to optymalny sposób prowadzenia obliczeń. Niedopuszczalne jest jednoczesne uruchomienie wielu aplikacji MPI w ramach jednej alokacji, taka praktyka prowadzi do kłopotów związanych z alokacją zasobów na wyłączność dla danej aplikacji.
Proste zrównoleglenie wielu niezależnych zadań
Dość częstym przypadkiem użycia klastra jest przetworzenie wielu paczek danych, gdzie każda paczka jest przetwarzana niezależnie. Dobrym przykładem takich zadań jest przetwarzanie wielu obrazów w ten sam sposób. SLURM umożliwia proste zrównoleglenie takiego przetwarzania poprzez użycie komendy srun. Przykładowy skrypt, który zrównolegli uruchomienie wielu instancji obliczeń, gdzie stopień równoległości jest ustalany na podstawie parametrów zadania, znajduje się poniżej:
UWAGA! To jest przykładowy skrypt, którego NIE NALEŻY uruchamiać. Przed jego uruchomieniem należy przeglądnąć podane opcje i dostosować je do własnych potrzeb, zmieniając m.i. nazwę grantu, nazwę partycji, czas trwania zadania, itp.
#!/bin/bash -l
## Nazwa zlecenia
#SBATCH -J testjob
## Liczba alokowanych węzłów
#SBATCH -N 2
## Liczba zadań per węzeł (domyślnie jest to liczba alokowanych rdzeni na węźle)
#SBATCH --ntasks-per-node=12
## Ilość pamięci przypadającej na jeden rdzeń obliczeniowy (domyślnie 4GB na rdzeń)
#SBATCH --mem-per-cpu=4GB
## Maksymalny czas trwania zlecenia (format HH:MM:SS)
#SBATCH --time=01:00:00
## Nazwa grantu do rozliczenia zużycia zasobów
#SBATCH -A <grant_id>
## Specyfikacja partycji
#SBATCH -p plgrid-testing
## Plik ze standardowym wyjściem
#SBATCH --output="output.out"
## Plik ze standardowym wyjściem błędów
#SBATCH --error="error.err"
module load plgrid/tools/imagemagick
## przejscie do katalogu z ktorego wywolany zostal sbatch
cd $SLURM_SUBMIT_DIR
ls *.tif | xargs -t -d "\n" -P ${SLURM_NTASKS} -n 1 srun -n 1 -N 1 --mem=4gb mogrify -format png
Powyższy skrypt dla każdego pliku *tif w katalogu uruchomi aplikację mogrify
, tak aby skonwertować obraz do pliku png. Pierwszą czynnością jest wylistowanie plików wejściowych, następnie wynik jest przekazywany do komendy xargs
, która przez parametr -P zapewnia równoległe uruchomienie dalszego polecania srun
. Do każdej instancji srun
zostanie przekazany jeden parametr, maksymalna równoległość wyniesie ${SLURM_NTASKS}. Każdy srun
uruchomi aplikację mogrify
na jednym rdzeniu z przydzielonym 4GB pamięci.