Wprowadzenie
SLURM Workload Manager, wcześniej znany jako Simple Linux Utility for Resource Management (SLURM), to darmowy program o otwartym kodzie źródłowym służący do planowania zadań dla jąder systemów Linux/Unix. SLURM jest szeroko stosowany w centrach obliczeniowych na całym świecie jako system kolejkowy do zarządzania obliczeniami na superkomputerach i klastrach komputerowych - warto dodać, że około 60% superkomputerów największej mocy z listy TOP500 jest pod kontrolą SLURM.
SLURM zapewnia trzy kluczowe funkcje:
- przydziela użytkownikom wyłącznego i/lub niewyłącznego dostępu do zasobów (węzłów obliczeniowych) zazwyczaj na określony czas w celu umożliwienia im wykonywania zadania
- daje możliwość uruchamiania, wykonywania i monitorowania zadań na zestawie przydzielonych węzłów obliczeniowych
- decyduje o kolejności uruchamiania rywalizujących o zasoby zadań poprzez zarządzanie kolejką oczekujących zadań.
Warto dodać, że SLURM umożliwia nie tylko uruchamianie zadań wysoce zrównoleglonych jak i rozproszonych ale pozwala również na wykorzystanie do obliczeń dodatkowych zasobów takich jak karty graficzne lub koprocesory Xeon Phi znacznie przyspieszające obliczenia. Ponadto system kolejkowy pozwala na tworzenie zależności między zadaniami jak również może poinformować użytkownika mailem o dacie i czasie rozpoczęcia i/lub zakończenia wykonywania danego zadania.
SLURM posiada kilka trybów pracy, które umożliwiają efektywne wykorzystanie zasobów klastra - najważniejsze z nich to:
- Tryb interaktywny - tryb ten pozwala użytkownikom na interaktywną pracę na węźle gdzie uzyskano dostęp do zasobów klastra. Użytkownik może uruchomić zadania bezpośrednio z wiersza poleceń, co jest przydatne do eksperymentów, testów i debugowania kodu.
- Tryb wsadowy (batch) - o najczęściej używany tryb w SLURM, który pozwala użytkownikom dodawać zadania (joby) do kolejki (składać zlecenia). Zadania są wykonywane automatycznie w kolejności zgłoszenia, a SLURM rozdziela dostępne zasoby w klastrze, aby efektywnie obsłużyć wszystkie zgłoszone zadania. Ten tryb jest szczególnie przydatny do przetwarzania wsadowego, gdzie wiele zadań jest uruchamianych jednocześnie na wielu węzłach klastra.
Oprócz tych dwóch podstawowych trybów, SLURM oferuje także wiele zaawansowanych opcji konfiguracyjnych, które pozwalają dostosować zarządzanie zasobami do konkretnych potrzeb użytkownika i klastra komputerowego.
Tryb wsadowy
Tryb wsadowy w SLURM to jeden z podstawowych trybów pracy w tym systemie zarządzania zasobami w klastrach obliczeniowych. Jest to tryb przeznaczony do obsługi zadań, które nie wymagają natychmiastowego dostępu do zasobów klastra (jak np. testowanie kodu), ale mogą być planowane i uruchamiane w określonym czasie.
Kluczowe elementy trybu wsadowego:
- Dodawanie zadań (jobów) do kolejki - użytkownicy przygotowują zlecenia, które zawierają informacje o wymaganych zasobach (np. liczba węzłów, liczba rdzeni, ilość pamięci) oraz komendę lub skrypt, który ma być wykonany. Zlecenia te są następnie przesyłane do systemu SLURM w celu umieszczenia ich w kolejce.
- Kolejka zadań - zadania składane w trybie wsadowym są umieszczane w kolejce oczekujących zadań. SLURM zarządza tą kolejką i przydziela dostępne zasoby w klastrze zgodnie z priorytetami i kolejnością zgłoszenia. Zadania są uruchamiane automatycznie, gdy zostaną dostępne odpowiednie zasoby.
- Planowanie i zarządzanie zasobami - SLURM efektywnie zarządza zasobami klastra, zapewniając, że zadania są uruchamiane na dostępnych węzłach, z uwzględnieniem określonych ograniczeń i priorytetów. Można dostosować priorytety zadań, czas ich wykonywania oraz inne parametry w zależności od potrzeb.
- Możliwość monitorowania - użytkownicy mogą monitorować stan swoich zadań, sprawdzając, czy są one w kolejce, w trakcie wykonywania lub już zakończone. SLURM dostarcza narzędzi do monitorowania i diagnozowania postępu zadania.
Tryb wsadowy jest szczególnie przydatny w przypadku, gdzie wiele zadań jest wykonanych jednocześnie na zasobach klastra. Użytkownicy mogą dostosować swoje zadania do wymagań swoich aplikacji, a SLURM zapewnia efektywne zarządzanie zasobami, minimalizując konflikty o dostęp do zasobów i zapewniając równomierne wykorzystanie klastra.
Podstawowe komendy i ich parametry
SLURM oferuje wiele podstawowych komend, które pozwalają użytkownikom zarządzać zadaniami i zasobami w klastrze komputerowym
sbatch oraz srun - służą do uruchamiania zadań w trybie wsadowym, ale różnią się swoim zastosowaniem i sposobem użycia.
Komenda sbatch
- jest używana do dodawania zadań do wykonania w trybie wsadowym. Po wprowadzeniu komendy sbatch, użytkownik dostarcza plik wsadowy (skrypt) lub parametry, które opisują zadanie, w tym wymagane zasoby i komendę do wykonania.
- po dodaniu zadania za pomocą sbatch, zadanie jest umieszczane w kolejce oczekujących zadań, a SLURM automatycznie zarządza jego uruchomieniem w odpowiednim czasie, na dostępnych węzłach klastra i z określonymi zasobami.
Przykładowe zastosowanie komendy sbatch:
sbatch moj_plik_wsadowy.sh
Najważniejsze opcje komend sbatch oraz srun:Komenda srun
- jest używana do uruchamiania jednorazowych poleceń lub krótkich skryptów w trybie wsadowym, bez konieczności tworzenia osobnego pliku wsadowego.
- użytkownik wprowadza komendę srun, a następnie podaje parametry, takie jak liczba węzłów, liczba rdzeni i inne, aby określić zasoby potrzebne do uruchomienia zadania.
- jest przydatna, gdy użytkownik chce szybko uruchomić pojedyncze zadanie lub skrypt bez konieczności tworzenia osobnego pliku wsadowego
Przykładowe zastosowanie komendy srun:
srun -n 4 -c 2 moje_polecenie
- -J / --job-name= - określa nazwę zadania w systemie kolejkowym
- --mail-user= - określa email użytkownika na który ma zostać wysłana wiadomość o stanie zadania
- --mail-type= - pozwala określić, w jakich sytuacjach system SLURM ma wysyłać powiadomienia e-mail do użytkownika, który złożył zadanie wsadowe (dostępne stany to: NONE, BEGIN, END, FAIL, REQUEUE, ALL - warto dodać, że można podać więcej stanów niż jeden i wtedy należy podać je w formie listy przedzielanej przecinkami)
- -o / --output= - określa plik do zapisywania standardowego wyjścia stdout z zadania
- -e / --error= - określa plik gdzie zostanie zapisane standardowe wyjście błędu
- -t / --time= - określa maksymalny czas trwania zadania gdzie czas jest w formacie [D-]HH:MM:SS)
- -p / --partition= - określa partycję, czyli kolejkę, klastra, na którą ma zostać skierowane zadanie
- -N / --nodes= - określa liczbę węzłów, na których zostanie uruchomione zadanie
- -n / --ntasks= - określa liczbę żądanych procesów (rdzeni) dla całego zadania. Może być użyte łącznie lub wymiennie z --ntasks-per-node
- --ntasks-per-node= - określa liczbę żądanych procesów na każdym węźle. Może być użyte łącznie lub wymiennie z -n / --tasks
- -c / --cpus-per-task= - określa liczbę rdzeni CPU przydzielonych dla każdego procesu zadania
- --mem= - pozwala określić całkowitą ilość pamięci RAM wymaganą dla zadania wsadowego, można użyć jednostek takich jak MB, GB oraz TB
- --mem-per-cpu= - pozwala określić, ilość pamięci RAM wymaganą na jeden rdzeń CPU (per CPU) dla zadania wsadowego, opcja szczególnie przydatna gdy musimy kontrolować ilość pamięci na pojedynczy rdzeń, a nie całkowitą ilość pamięci, można również używać jednostek takich jak MB, GB lub TB
- --gres= - używana do określenia zasobów specjalnych, takich jak karty graficzne GPU (Graphics Processing Units) lub inne niestandardowe zasoby, które są wymagane do wykonania zadania wsadowego czyli umożliwia rezerwację i zarządzanie zasobami nie będącymi rdzeniami CPU ani pamięcią RAM. Jedynym typem zasobu zdefiniowanym na klastrze jest aktualnie "gpu", który odpowiada karcie nVidia Tesla T4
squeue - pozwala na przeglądanie listy zadań znajdujących się w kolejce. Komenda squeue wyświetla informacje o bieżących zadaniach, takie jak identyfikatory, stan zadania, użytkownik, czas wykonania etc.
Przykładowe zastosowanie komendy:
squeue
scancel - pozwala na anulowanie zadania znajdującego się w kolejce lub uruchomionego zadania. Komendy używa się wraz z identyfikatorem zadania, które chcemy anulować.
Przykładowe zastosowanie komendy:
scancel numer_zadania
scontrol - pozwala na zaawansowaną kontrolę i zarządzanie zadaniami i zasobami SLURM poprzez różne opcje konfiguracyjne i komendy. Komenda może mieć także zastosowanie do wyświetlania właściwości kolejki (partycji) lub węzła obliczeniowego
Przykładowe zastosowanie komendy scontrol do wyświetlenia właściwości partycji:
scontrol show partition nazwa_kolejki
Przykładowe zastosowanie komendy scontrol do wyświetlenia właściwości węzła:
scontrol show node nazwa_wezla
sinfo - wyświetla informacje o dostępnych węzłach w klastrze, w tym ich dostępności, liczbę dostępnych rdzeni, ilość dostępnej pamięci etc.
Przykładowe zastosowanie komendy:
sinfo -Nl
Plik wsadowy a linia poleceń
Plik wsadowy (batch script) w systemie zarządzania zasobami SLURM to skrypt lub plik tekstowy, który zawiera instrukcje i parametry niezbędne do uruchomienia zadania w trybie wsadowym na klastrze obliczeniowym. Pliki wsadowe są używane do zdefiniowania zadania, określenia wymaganych zasobów, załadowania lub aktywacji środowiska obliczeń, podania komendy do wykonania oraz innych ustawień związanych z przetwarzaniem.
Plik wsadowy możemy podzielić na dwie części
część gdzie definiujemy elementy SLURM, nalezy pamiętać, że każdą opcję komendy sbatch trzeba poprzedzić #SBATCH
plik_wsadowy_1_part1#!/bin/bash #SBATCH -J moje_zadanie #SBATCH --output=wynik.txt #SBATCH --error=bledy.txt # Definicja zasobów #SBATCH -N 1 #SBATCH --cpus-per-task=36 #SBATCH --ntasks-per-node=1 #SBATCH -p bo-science #SBATCH --mem-per-cpu=5G
W tej części definiujemy takie elementy jak nazwa zadania czy plik wynikowy oraz podajemy zasoby na jakich chcemy uruchomić zadanie. Ten plik wsadowy określa zadanie o nazwie "moje-zadanie", które będzie działać na jednym wężle, z łącznie 36 rdzeniami CPU na każde zadanie (jedno). Zadanie zostanie przypisane do partycji "bo-science" gdzie zostanie uruchomione część nastepnego podpunktu. Standardowe wyjście i wyjście błędów będą zapisywane w odpowiednich plikach
część gdzie definiujemy nasze środowisko oraz podajemy komendę/y do uruchomienia obliczeń
plik_wsadowy_1_part2# Zaladowanie srodowiska obliczen module load gaussian9_E_01 module list # Wywolanie obliczen cd $SLURM_SUBMIT_DIR g09 plik_obliczen_gaussiana_G09.com
W systemie zarządzania zasobami SLURM można określić część opcji komendy sbatch w pliku wsadowym (skrypcie wsadowym) a część w linii poleceń. Jest to przydatne bo pozwala na elastyczne dostosowywanie parametrów zadania, przy jednoczesnym wykorzystaniu wspólnego pliku wsadowego do wielu uruchomień. Opcje określone w pliku wsadowym nadpisują opcje podane w linii poleceń. To oznacza, że opcje w pliku wsadowym będą one miały pierwszeństwo nad opcjami podanymi w linii poleceń.
Uruchomienie pliku
#!/bin/bash # Definicja zasobów #SBATCH -N 1 #SBATCH --cpus-per-task=36 #SBATCH --ntasks-per-node=1 #SBATCH -p bo-science # Zaladowanie srodowiska obliczen module load gaussian9_E_01 module list # Wywolanie obliczen cd $SLURM_SUBMIT_DIR g09 plik_obliczen_gaussiana_G09.com
za pomocą komendy
sbatch -J moje_zadanie --output=wynik.txt --error=bledy.txt --mem-per-cpu=5G moj_plik_wsadowy_2
będzie równoznaczne z uruchomieniem poprzedniego przykładowego pliku za pomocą czystej komendy sbatch:
sbatch moj_plik_wsadowy_1
Jest to przydatne aby zachować elastyczność i dostosować niektóre parametry zadania na podstawie określonej sytuacji lub dynamicznie zmieniać je przy każdym uruchomieniu.
Przykładowe pliki
Poniżej znajdują się przykładowe pliki kolejkowe do obliczeń na klastrze BlueOcean
Gaussian G09
przykladowy_plik_wsadowy_G09#!/bin/bash #SBATCH -J moje_zadanie #SBATCH --output=wynik.txt #SBATCH --error=bledy.txt # Definicja zasobów #SBATCH -N 1 #SBATCH --cpus-per-task=36 #SBATCH --ntasks-per-node=1 #SBATCH -p bo-science #SBATCH --mem-per-cpu=5G # Zaladowanie srodowiska obliczen module load gaussian9_E_01 module list # Wywolanie obliczen cd $SLURM_SUBMIT_DIR g09 plik_obliczen_gaussiana_G09.com
tak przygotowany plik wsadowy należy dodać do kolejki za pomocą komendy
sbatch przykladowy_plik_wsadowy_G09