Slurm
Slurm jest systemem kolejkowania używanym w klastrze. Jest on dość rozbudowany i zachęcamy do zapoznania się z dokumentacją producenta.
W tym artykule zostaną przedstawione najczęściej używane oraz inne przydatne polecenia wraz z przykładami użycia.
Podstawowe polecenia:
salloc
- alokowanie zadań, przeważnie interaktywnychsrun
- współbieżne uruchamianie zadańsbatch
- wsadowe uruchamianie zadańscancel
- wysyłanie sygnałów do zadań, przeważnie w celu ich anulowaniasqueue
- informacje o kolejkachsinfo
- informacje o partycjach i węzłachsacct
- informacje rozliczeniowe ukończonych zadańsstat
- informacje rozliczeniowe trwających zadańscontrol
- informacje oraz zarządzanie stanem i konfiguracją Slurmsacctmgr
- informacje oraz zarządzanie kontami rozliczeniowymi Slurm
Wszystkie polecenia posiadają wbudowaną pomoc wywoływaną parametrem --help
oraz podręcznik użytkownika wywoływany za pomocą polecenia man
, na przykład: man salloc
.
Zadania
Dostępnych jest kilka metod tworzenia zadań, zachęcamy do zapoznania się z poradnikami:
Parametry zadań
Parametry przekazywane są do wywołań poleceń powłoki typu salloc
w klasycznej formie dla poleceń systemów *NIX. Skrypty uruchamiane za pomocą sbatch
przyjmują te same parametry w formie komentarzy Bash zaczynających się od #SBATCH
znajdujących się na początku pliku. Obie metody przyjmują zarówno pełne nazwy parametrów jak i ich skrócone formy.
Wszystkie parametry w formie komentarzy powinny znajdować się bezpośrednio po znaczniku interpretera, tzw. shebang (#!
). Obsługiwane są jedynie skrypty Bash. Należy umieszczać pozostałe komentarze po sekcji kontrolnej #SBATCH
aby uniknąć problemów z parsowaniem skryptu przez Slurm. Przykładowo:
zadanie_przyklad.sh
#!/usr/bin/env bash
#SBATCH --job-name=witaj
#SBATCH --partition=cpu
#SBATCH --cpus-per-task=1
#SBATCH --time=00:05:00
#SBATCH --output=zadanie-%j.out
#SBATCH --mail-type=ALL
#SBATCH --mail-user=WPISZ_SWOJ_PELEN_EMAIL
# pozostałe komentarze Bash i dalszy kod
Lista najczęściej używanych parametrów tworzenia zadań (oraz ich krótkie formy jeśli istnieją):
Organizacyjne
--job-name=trening20
(-J trening20
) - nazwa zadania--partition=XXX,YYY
(-p XXX,YYY
) - nazwa lub nazwy partycji dla których przeznaczone jest zadanie--immediate=30
(-I30
) - wymuszenie 30s oczekiwania na dostępność zasobów, jeśli w tym czasie zadanie nie zostanie rozpoczęte to zakończ działanie - domyślnie zadanie oczekuje w nieskończoność lub do ręcznego anulowania
Czasy
Czas trwania zadania
Obsługiwane formaty czasu trwania zadania to:
minuty
minuty:sekundy
godziny:minuty:sekundy
dni-godziny
dni-godziny:minuty
dni-godziny:minuty:sekundy
Parametry czasu trwania zadania:
--time=03:00:00
(-t 03:00:00
) - maksymalny czas trwania zadania--time-min=01:30:00
- minimalny wartość do której może zostać zmniejszony czas trwania zadania aby umożliwić wcześniejsze jego wykonanie
Czas rozpoczęcia zadania
Parametr --begin=
pozwala na okreslenie czasu rozpoczęcia zadania dając tym samym wskazówkę dla systemu Slurm. Jest to swego rodzaju słaba rezerwacja zasobów, która jednak nie musi być zrealizowana. Administracja klastra może tworzyć twarde rezerwacje zasobów, które muszą być przez system zrealizowane.
Obsługiwane formaty czasu rozpoczęcia zadania to:
godzina:minuta:sekunda
- sekundy są opcjonalne, jeśli dana godzina już minęła to zapis oznacza następny dzieńrok-miesiąc-dzień
- na przykład2024-05-03
rok-miesiąc-dzieńTgodzina:minuta:sekunda
- sekundy są opcjonalne, na przykład2024-06-15T15:00
now+<liczba><jednostka>
- gdzie jednostka to domyślnie sekunda, możliwe jednostki to:minutes
,hours
,days
iweeks
, na przykładnow+1hour
Sprzętowe
Konfiguracja liczby węzłów, podzadań i rdzeni procesora:
--nodes=2
(-N2
) - liczba węzłów, domyślnie 1--ntasks=4
(-n4
) - liczba podzadań, domyślnie 1 podzadanie = 1 rdzeń CPU--cpus-per-task=2
(-c2
) - liczba rdzeni dla każdego podzadania, domyślnie 1
Opcje służące do konfiguracji ilości RAM wykluczają się wzajemnie i należy wybrać tylko jedną znich:
--mem=32G
- całkowita pula RAM dostępna dla zadania na danym węźle--mem-per-cpu=1G
- minimalna ilość RAM dla każdego CPU przypisanego do podzadania--mem-per-gpu=24G
- minimalna ilość RAM dla każdego GPU przypisanego do podzadania
Konfiguracja GPU:
--gpus=1
(-G1
) - liczba i ewentualnie typ GPU - na przykład--gpus=nvidia_geforce_rtx_4090:1
Specyfikacja typu GPU ogranicza możliwości rozmieszczania zadań i może wydłużyć czas oczekiwania na zasoby, więc należy stosować ją z rozwagą.
Węzły posiadają zdefiniowane własności (features w nomenklaturze Slurm), które mogą być użyte do bardziej elastycznej definicji zasobów dla zadań.
Za pomocą parametrów --constraint=
(-C
) oraz --prefer=
można wyspecyfikować własności wymagane lub preferowane przez zadanie. System postara się wypełnić preferowane własności, ale jeśli się to nie uda to zadanie będzie uruchomione po spełnieniu wymaganych.
Lista dostępnych własności znajduje się w sekcji zasoby klastra. Można ją także uzyskać za pomocą polecenia:
sinfo -o "%10N %10c %10m %40f %40G"
Przykładowy wynik:
NODELIST CPUS MEMORY AVAIL_FEATURES GRES
c1n1 8 51200 x86-64-v3 (null) g1n[1-5] 14 51200 x86-64-v3,cc8.0,cc8.6,cc8.9,vram24g gpu:nvidia_geforce_rtx_4090:1(S:0)
Własności można wyrażać między innymi używając operacji logicznych takich jak koniunkcja - &
czy alternatywa - |
. Zalecamy zapoznanie się z dokumentacją tych parametrów w podręcznikach man
.
W przypadku GPU własności są zdefiniowane sposób podobny do zachowania algorytmu kolejkowania. Przykładowo określenie --constraint=vram24g
może spowodować uruchomienie zadania na dowolnym GPU posiadającym 24GB lub więcej VRAM. Ten sam mechanizm dotyczy użytego CUDA CC - --constraint=vram24g&cc8.6
będzie skutkować uruchomieniem zadania na RTX 3090 lub 4090, ale już nie na A100 posiadającym CC 8.0.
Możliwe jest także zajęcie całego węzła za pomocą parametru --exclusive
, ale nie jest to zalecana metoda.
Informacje o zadaniach
Wyświetlenie wszystkich ostatnich zadań użytkownika:
squeue
Filtrowanie tylko uruchomionych zadań:
squeue -t RUNNING
Wyświetlenie informacji o uruchomionym zadaniu:
scontrol show jobid -dd <id Zadania>
GPU
Wyświetlenie aktualnych statystyk zużycia GPU dla zadania:
sstat --format=JobID,TRESUsageInTot%115 -j 349 --allsteps
Przykładowy wynik dla zadania uruchomionego na jednym węźle z GPU:
JobID TRESUsageInTot
------------ ------------------------------------------------------------------------------------------------------------------- 349.extern cpu=00:00:05,energy=0,fs/disk=21612682,gres/gpumem=21644M,gres/gpuutil=100,mem=787940K,pages=386,vmem=0
Pozycja gres/gpumem=21644M
oznacza aktualnie zajęty VRAM, a gres/gpuutil=100
to procent zajęcia rdzeni GPU.
Wynik polecenia dotyczy tylko stanu zadania w momencie wykonania sstat
. Po zakończeniu danego zadania zostanie obliczony stopień wykorzystania zasobów przez cały okres. Na tej podstawie wyliczana jest efektywność zużycia zasobów.
Te informacje można uzyskać dla zakończonych zadań:
sacct -j 349 --format=JobID,TRESUsageInAve%115
Oraz dla całej historii użytkownika, na przykład w ramach czasowych:
sacct --starttime 2024-04-27 --format=JobID,TRESUsageInAve%115
Informacje zwracane przez powyższe polecenia mogą być rozbudowane. Przedstawione zostały tylko podstawowe spośród dostepnych parametrów i wartości. Zalecamy zapoznanie się z dokumentacją twórców Slurm.
Kontrola nad zadaniami
Anulowanie zadania:
scancel <id zadania>
Możliwe jest wykonanie powyższej operacji dla danego stanu zadania, na przykład oczekującego na uruchomienie:
scancel -t PENDING
Zadania oczekujące mogą być przeniesione w tryb zatrzymania, co zapobiegnie ich uruchomieniu gdy zasoby staną się dostępne:
scontrol hold <id zadania>
Wznowienie ze stanu zatrzymania:
scontrol release <id zadania>
Przerwanie i ponowne uruchomienie takiego samego zadania:
scontrol requeue <id zadania>