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:

Wskazówka

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.

Zagrożenie

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ład 2024-05-03
  • rok-miesiąc-dzieńTgodzina:minuta:sekunda - sekundy są opcjonalne, na przykład 2024-06-15T15:00
  • now+<liczba><jednostka> - gdzie jednostka to domyślnie sekunda, możliwe jednostki to: minutes, hours, days i weeks, na przykład now+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
Zagrożenie

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.

Adnotacja

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.

Adnotacja

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
Adnotacja

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>