Podstawy SLURM

Z Komputery Dużej Mocy w ACK CYFRONET AGH
Wersja z dnia 08:01, 15 wrz 2017 autorstwa Maciej (dyskusja | edycje) (Dodanie całej strony; bazowanie na https://kdm.cyfronet.pl/portal/Prometheus:Podstawy#Uruchamianie_zada.C5.84 (thx Jacek:)))
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Skocz do:nawigacja, szukaj

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.

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 zadania
    • sstat -a -j <ID_zadania>/<ID_zadania.batch> - zużycie zasobów w ramach kroków (step) działającego zadania
    • scancel <ID_zadania> - usunięcie zadania (działającego lub zakolejkowanego)
    • sacct - zużycie zasobów zakończonego już zadania/kroku
    • scontrol show partition [<nazwa_partycji>] - właściwości partycji
    • sinfo - lista węzłów
    • scontrol 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.