Przejdź do treści

Zlecanie zadań do SLURM

Slurm - definicja

Info

SLURM (dawniej Simple Linux Utiliy for Resource Management) to system kolejkowy działający na wielu komputerach z listy Top500. W ICM system ten obsługuje wszystkie komputery dużej mocy.

System kolejkowy to element systemu operacyjnego odpowiedzialny za zarządzanie zasobami komputera obliczeniowego i przydzielanie ich użytkownikom zgodnie z obowiązującymi zasadami. Pozwala na optymalne wykorzystanie mocy obliczeniowych i pamięci komputera.

Kolejne zadania użytkowników zostają umieszczone w tzw. kolejce. Gdy zadeklarowane przez użytkowników zapotrzebowanie przekracza dostępne zasoby obliczeniowe tj. czasu procesora, pamięci operacyjnej i dyskowej, zadania kolejno oczekują na dostęp. Praca z systemem kolejkowym przebiega następująco:

  1. Użytkownik pisze tzw. skrypt, w którym określa zasoby niezbędne do przeprowadzenia obliczeń, a także sposób wykonania zadania użytkownik umieszcza zadanie w kolejce
  2. System kolejkowy na bieżąco sprawdza dostępność zasobów; gdy jest taka możliwość, rezerwuje zasoby według specyfikacji użytkownika, po czym uruchamia zadanie
  3. Po zakończeniu obliczeń system kolejkowy zwalnia zarezerwowane zasoby i próbuje je zarezerwować dla następnych zadań czekających w kolejce

Oficjalna dokumentacja:

https://slurm.schedmd.com/documentation.html

Podstawowe komendy systemu kolejkowego

Za pomocą komend systemu SLURM możemy sterować przebiegiem obliczeń naszego zadania. Aby zaplanować zadanie, można użyć polecenia salloc, sbatch lub srun.

  • sbatch zawsze tworzy nowy przydział zasobów po jego wywołaniu, wykonuje skrypt zadania na jednym z przydzielonych węzłów (master node), a następnie zwalnia przydział po zakończeniu skryptu. Dodatkową cechą sbatch jest to, że przeanalizuje skrypt w czasie przesyłania zadania - zamiast podawać argumenty z wiersza poleceń, opcje sbatch mogą zostać zapisane za pomocą linii rozpoczynających się od #SBATCH. Jeżeli poda się argumenty do wiersza poleceń to zastępią one opcje #SBATCH w skrypcie, więc można wywoływać pojedynczy skrypt wsadowy dla różnych przydziałów wielkości zadania, określając opcje -N lub -n w wierszu polecenia podczas przesyłania skryptu zadania zsbatch

  • srun może, ale nie musi, utworzyć alokację, w zależności od sposobu jej wywołania. Jeśli zostanie wywołany w wierszu poleceń węzła logowania, utworzy nowy przydział i wykona polecenie po srun. Jeśli zostanie wywołany w skrypcie wsadowym, po prostu uruchomi zadanie na bieżącym przydziale. Podobnie, srun może otrzymać argument --jobid, który każe mu uruchomić zadanie jako część danego 'job`a' i jego alokacji.

  • salloc zawsze tworzy nowy przydział zasobów, gdy jest wywoływany, ale nie musi uruchamiać żadnych zadań w przydzielonych węzłach. Typowym przykładem użycia salloc jest utworzenie przydziału w celu uruchomienia serii kolejnych poleceń srun poprzez interaktywną sesję bash lub skrypt uruchamiany z węzła logowania. Zwalnia przydział po zakończeniu sesji skryptu lub sesji bash.

Źródło: https://cvw.cac.cornell.edu/slurm/basics_allocation

srun/mpirun/mpiexec

  • srun jest poleceniem slurm'a.

  • mpirun jest poleceniem przychodzacym razem z wybraną implementacją MPI (openMPI, intel-mpi, ibm-mpi, cray-mpi, etc. Uruchamiając mpirun bez slurma, należy podać parametry zadania (które węzły, ile procesów, itp).

  • mpiexec - jest zdefiniowany w standardzie MPI.

Skrypty systemu kolejkowego

Opis zadania i zapotrzebowanie na zasoby można specyfikować w specjalnym skrypcie - pliku tekstowym dla systemu SLURM. Skrypt tworzy użytkownik. Skrypt składa się z tzw. dyrektyw systemu SLURM, czyli linii zaczynające się od słowa #SLURM oraz instrukcji uruchamiających odpowiedni program.

  • Pierwsza linia skryptu musi zawierać ścieżkę do interpretera (shell), który ma wykonać skrypt na przydzielonym węźle obliczeniowym np. #!/bin/bash -l.
  • Kolejne linie powinny zawierać specyfikację zasobów

Note

Task jest rozumiany jako pojedynczy proces uruchomiony przez aplikację użytkownika. Rezerwacja zasobów oraz wszystkie uruchamiane komendy systemowe i programy nazywane są w skrócie zadaniem.

Większość opcji ma swoje skróty. W razie wątpliwości można zajrzeć do instrukcji korzystając z polecenia man sbatch lub man srun Poniżej przedstawiona jest lista najczęściej używanych opcji:

Skrót Pełna nazwa Znaczenie
-N --nodes= Liczba węzłów dostępowych do rezerwacji dla zadania.
--- --ntasks-per-node Liczba 'tasków' per węzeł. Opcja ta jest przydatna w przypadku hybrydowych aplikacji MPI / OpenMP, w której do każdego węzła należy przypisać tylko jedno „zadanie / stopień” MPI, jednocześnie umożliwiając części OpenMP wykorzystanie pozostałych procesorów dostępnych na węźle w ramach zaalokowanego zadania.
-n --ntasks= Liczba procesów do uruchomienia. Domyśla wartość to jeden proces per węzeł.
-p --partition= Zadanie uruchamiane będzie w dostępnej dla użytkownika partycji (np. topola, okeanos)
-q --qos= quality of service
-A --account= Numer grantu obliczeniowego użytkownika grant, np. G99-99. Używane w celach sprawozdawczych.
-c --cpus-per-task= Liczba procesorów per proces.
-J --job-name= Ustawia nazwę zadania, domyślnie jest to nazwa skryptu. Pod taką nazwą będzie widziane zadanie w systemie, np. przy wyświetlaniu listy zadań.
-t --time=hh:mm:ss Maksymalna długość działania zadania od momentu jego uruchomienia gg:mm:ss. Po tym czasie zadanie zostanie przerwane przez system kolejkowy.
-C --constraint= Możliwość zażądania sprzętu o konkretnych, np. typu procesora.
-w --nodelist= Możliwość zażądania konkretnego węzła obliczeniowego.
--- --gres=gpu:4 Użycie dodatkowych zasobów, np GPU (klaster Rysy).
--- --mem= Rezerwacja pamięci per node (megabytes).
--- --mem-per-cpu= Rezerwacja pamięci per CPU (megabytes).
--- --mail-user= Adres email użytkownika, np. --mail-user=user@somewhere.com
--- --mail-type= Kiedy wysłać powiadomienie email (ALL lub END). Nieustawienie opcji - brak powiadomienia.

Przykładowe skrypty

Partycja Topola

Poniższy skrypt uruchamia obliczenia w programie Quantum Espresso:

#!/bin/bash -l
#SBATCH --job-name="name_of_my_job"
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=12
#SBATCH --mem=5000
#SBATCH --time=20:00:00
#SBATCH --account=GYY-XX
#SBATCH --partition=topola
#SBATCH --output="my_results.out"

module load apps/espresso/6.1.0
mpirun -n 12 pw.x < S.in
  • w systemie kolejkowym zadnie będzie funkcjonowało pod nazwą "qe-1"
  • na jednym węźle obliczeniowym z wykorzystaniem 12 rdzeni obliczeniowych
  • dla zadania przydzielone zostanie 5GB pamięci operacyjnej
  • zlecający deklaruje, że zadanie zakończy się w czasie krótszym niż 20 godzin (po tym czasie zadanie zostanie przerwane przez system kolejkowy)
  • zadanie zostaje przypisane do grantu o numerze GYY-XX
  • Plik sterujący S.dat powinien być umieszczony w katalogu z którego uruchamiane jest zadanie
  • Polecenie "module load apps/espresso/6.1.0" ustawia środowisko (dostęp do programu, zmienne środowiskowe) niezbędne do uruchomienia programu.
  • Polecenie "mpirun -n 12 pw.x < S.in" uruchamia właściwy program obliczeniowy w środowisku równoległym MPI.

Partycja Okeanos

#!/bin/tcsh
#SBATCH --job-name="name_of_my_job"
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=12
#SBATCH --account=GYY-XX
#SBATCH --partition=okeanos
#SBATCH --output="my_results.out"

module swap PrgEnv-cray PrgEnv-intel
module load espresso/6.1.0
srun -n 12 pw.x < S.in

Partycja Rysy

W celu uruchomienia aplikacji na GPU niezbędne jest podanie opcji --gres=gpu:liczba_gpu.

#!/bin/bash -l
#SBATCH --job-name="my_job_name"
#SBATCH --nodes=1
#SBATCH --gres=gpu:1
#SBATCH --cpus-per-task=1
#SBATCH --ntasks-per-node=1
#SBATCH --account=GYY-XX
#SBATCH --time=01:00:00
#SBATCH --qos=normal

srun hello_world_cuda

Przykładowy program hello_world_cuda znajduje się w sekcji Podstawy GPU.

Wstawianie zadania do kolejki

Polecenie sbatch służy do wstawiania zadań do systemu kolejkowego. Wszystkie flagi, które można wyspecyfikować w tym poleceniu, alternatywnie podaje się w pierwszym bloku komentarza skryptu kolejkowego w liniach zaczynających się od #SBATCH . Niektóre opcje tego polecenia są specyficzne dla danego komputera.

Info

Zlecanie zadań na system topola możliwe jest bezpośrednio z węzła dostępowego hpc.icm.edu.pl. W przypadku pozostałych systemów możliwy/wymagany jest dodatkowy krok logowania wykonany z komputera hpc.icm.edu.pl, np. ssh rysy, ssh okeanos.

Więcej o komputerach dostępnych w ICM tutaj.

Tryb wsadowy

Podczas uruchamiania obliczeń w trybie wsadowym (batch) użytkownik nie może komunikować się z wykonywanym programem. Dlatego niezbędne jest wcześniejsze przygotowanie informacji potrzebnych w toku wykonywania wszystkich zaplanowanych czynności, tak aby program mógł je wykorzystać w stosownym momencie. Zakres tych informacji, ich format oraz sposób przygotowania zależy od konkretnego programu. Podczas przygotowywania zadania wsadowego należy poprawnie przewidzieć ciąg pytań generowanych przez program w miarę jego wykonywania i przygotować odpowiedzi na wszystkie takie komunikaty. Rozbieżność między pytaniami generowanymi przez program, a odpowiedziami znajdującymi się w pliku wejściowym może spowodować niepoprawny przebieg zadania wsadowego.

Wstawienie do kolejki zadania opisanego skryptem MojeZadanie.batch wykonujemy komendą:

sbatch MojeZadanie.batch

Umieści ona w systemie kolejkowym zadanie wsadowe (bez możliwości interakcji z wykonywanym programem). Dodatkowe opcje wykonania zadania możemy wprowadzać w skrypcie lub podać jako parametry polecenia sbatch.

Tryb interaktywny

Aby uzyskać dostęp do zasobów w trybie interaktywnym z dostępem do powłoki (shell), należy wykonać komendę:

srun -p <partition_name>  -A <grant_name> -N 1 -n 12 --time=1:00:00 --pty /bin/bash -l # cluster: topola, okeanos
srun -A <grant_name> -N 1 -n 12 --time=1:00:00 --gres=gpu:2 --pty /bin/bash -l # cluster: rysy

Alternatywnie, można najpierw zaalokować zasoby, a następnie uruchomić sesję interaktywną

salloc -p <partition_name>  -A <grant_name> -N 1 -n 12 --time=1:00:00 # cluster: topola, okeanos
salloc -A <grant_name> -N 1 -n 12 --time=1:00:00 --gres=gpu:2 # cluster: rysy
# następnie 
srun /bin/bash -l 

Ma to tą zaletę, że jeżeli będziemy musieli ponownie uruchomić zadanie (np. bo nasz program się zawiesił) to nie będziemy musieli czekać aż SLURM przydziali nam zasoby.

Quality of Service (QOS)

Parametr ten określa na jak długo możliwa jest alokacja zasobów oraz priorytet w uruchomieniu zadania.

Aby przypisać zadanie do konkretnego qos'a należy ustalić zmienną:

--qos=NAZWA_QOSa

Szczegóły qos'ów dostępnych w ICM znajdują się tu.

Ta strona używa plików cookies.
Polityka Prywatności    AKCEPTUJĘ