Aby rozpocząć sesję interaktywną, na ui.wcss.pl
należy skorzystać ze skryptu sub-interactive
:
$ sub-interactive [-n <NODES>] [-c <CORES>] [-m <MEMORY>] [-t <TIME_LIMIT>] [-x] [-h]
gdzie
-c CORES
- liczba rdzeni, maks. 24 (domyślnie 1)-n NODES
- liczba węzłów, maks. 2 (domyślnie 1)-m MEMORY
- ilość pamięci RAM w GB, maks. 45 (domyślnie 3)-t TIME_LIMIT
- czas trwania sesji interaktywnej w godzinach, maks. 6 (domyślnie 1)-x
- umożliwienie przekazywania x11 (domyślnie zablokowane)-h
- wywołanie wiadomości pomocniczej (help)Użytkownik może korzystać jedynie z dwóch sesji interaktywnych
sub-interactive
w tym samym czasie.
Przykładowo, aby rozpocząć sesję interaktywną na 6 godzin, korzystającą z 4 cpu, 12GB pamięci RAM oraz z włączonym przekazywaniem x11:
$ sub-interactive -t 6 -c 4 -m 12 -x
Wywołanie skryptu sub-interactive
bez dodatkowych argumentów uruchomi krótką sesję interaktywną dla domyślnej ilości zasobów obliczeniowych, tj. 1 węzeł, 1cpu, 1 godzina, 3GB pamięci RAM, bez przekazywania x11.
Użytkownicy wciąż mogą zlecać zadania interaktywne na pozostałych partycjach (np.
short
oraznormal
) z wykorzystaniem komendysrun
(instrukcja w sekcji poniżej), jednakże czas oczekiwania na rozpoczęcie takiego zadania interaktywnego będzie znacznie dłuższy.
sub-interactive
Komenda sub-interactive
korzysta z dedykowanych zasobów obliczeniowych przypisanych do partycji SLURM "interactive". Zasoby te nie są współdzielone z innymi partycjami, znacząco zwiększając ich dostępność dla użytkowników. Ponadto, czas oczekiwania na sesję interaktywną sub-interactive
jest znacznie krótszy niż w przypadku pozostałych partycji.
Dla partycji "interactive" (a tym samym sesji interaktywnych sub-interactive
) nałożono następujące limity zasobów obliczeniowych per użytkownik:
-t 6:00:00
)-c 24
)-N 2
)--mem 45GB
)Zaleca się użytkownikom, aby w miarę możliwości alokowali możliwie jak najmniejszą ilość zasobów na zadania interaktywne (tj. dopasowaną do swoich realnych potrzeb), nie blokując tym samym dostępu do szybkich zadań interaktywnych innym użytkownikom. Przykładowo, alokacja zadania interaktywnego, służącego sporządzeniu pliku wsadowego za pomocą programu z GUI i przetestowaniu go w swoim programie obliczeniowym, najpewniej może być uruchomiona na 1 rdzeniu CPU z małą ilością pamięci RAM, np. 2GB:
$ sub-interactive -c 1 -m 2
Partycja "interactive" służy wyłącznie zadaniom interaktywnym!
Zlecanie zadań za pomocą plików wsadowychsbatch
na partycji "interactive" będzie karane. Ponadto, w przypadku partycji "interactive" efektywność wykorzystania zasobów CPU i pamięci RAM będzie monitorowana.
Aby uruchomić zadanie interaktywne na dowolnej partycji i w dowolnej konfiguracji zasobów obliczeniowych, należy skorzystać z polecenia srun:
srun [-p nazwa_partycji] --pty nazwa_programu
gdzie:
-p partycja | Określa partycję na której zostanie wykonane zadanie. W przypadku ominięcia tego parametru, zadanie zostanie wykonana na domyślnej partycji |
--pty | Uruchamia tryb pseudoterminala na którym będą wyświetlane na bieżąco wyniki wykonanywanego zadania |
nazwa_programu | Nazwa polecenia lub programu do wykonania |
Przykładowo:
abcd@ui: ~ $ srun -p short -t 10 --pty /usr/bin/ls -l /home/abcd
Aby uzyskać w pełni interaktywną sesję z serwera obliczeniowego, należy wykonać srun z programem bash jak poniżej:
abcd@ui: ~ $ srun -p short -t 10 --pty bash
[wcss] abcd@r31c02b16 ~ >
Tekst z instrukcji wideo można zaznaczać, kopiować i wkejać w swoim terminalu.
Zadanie wsadowe można wykonać za pomocą polecenie sbatch. Aby wysłać zadanie do kolejki, należy najpierw przygotować odpowiedni skrypt, który zawiera informacje na temat alokacji zasobów oraz wykonanywane programy.
Przykładowy skrypt myjob.sh
:
#!/bin/bash
#SBATCH -N1
#SBATCH -c10
#SBATCH --mem=10gb
#SBATCH --time=1:00:00
#SBATCH --mail-user=<adres_e-mail>
#SBATCH --job-name=<nazwa_zadania>
source /usr/local/sbin/modules.sh
python3 program.py
Taki skrypt można uruchomić za pomocą polecenia:
abcd@ui: ~ $ sbatch mojob.sh
Tekst z instrukcji wideo można zaznaczać, kopiować i wkejać w swoim terminalu.
Tablice zadań (ang. array job) są pomocne w przypadku chęci wykonania tego samego skryptu z różnymi parametrami (tzw. parameter sweep). Skrypty będą wykonane jednocześnie na różnych węzłach, a wyniki są zapisywane w różnych plikach.
Przykładowy skrypt arrayjob.sh
wypisujący losowo wygenerowaną liczbę od 1 do 50:
#!/bin/bash
#SBATCH -N1
#SBATCH -c5
#SBATCH --mem=250
#SBATCH -t1
# Generuj losową liczbę z zakresu 1-50
rand=`shuf -i 1-50 -n 1`
# Wypisuj generowaną liczbe do pliku
echo "Generowaną liczbę to: ${rand}"
i zgłosić zadanie do kolejki poleceniem
abcd@ui: ~>sbatch --array=1-3 arrayjob.sh
W wyniku wykonania skryptu powstają 3 pliki
abcd@ui: ~>ls
slurm-581784_1.out slurm-581784_2.out slurm-581784_3.out
abcd@ui: ~>more slurm-*
::::::::::::::
slurm-581784_1.out
::::::::::::::
Generowaną liczbę to: 47
::::::::::::::
slurm-581784_2.out
::::::::::::::
Generowaną liczbę to: 37
::::::::::::::
slurm-581784_3.out
::::::::::::::
Generowaną liczbę to: 32
Kolejny przykład z wykorzystanie Pythona. argument.py
import sys
print(int(sys.argv[1])**2)
Następnie należy sporządzić odpowiedni skrypt zadania arrayjob.sh
, na przykład
#!/bin/bash
#SBATCH -N1
#SBATCH -c5
#SBATCH --mem=250
#SBATCH -t1
#SBATCH --array=1-5 # lista ID podzadań
module load Python
python3 argument.py $SLURM_ARRAY_TASK_ID
i zgłosić zadanie do kolejki poleceniem
sbatch arrayjob.sh
Takie zadanie zwróci 5 plików o domyślnym formacie nazw JOBID_TASKID.out
, a w każdym z nich zawarty będzie kwadrat liczby odpowiadającej numerze ID podzadania. W ogólności tablica zadań nie musi być iterowana co jeden. Iterator może zostać podany po znaku :
. Przykładowa tablica od 1 do 10 z iteratorem o wartości 2 będzie zapisana jako --array=1-10:2
.
Zadanie tablicowe posiada kilka dodatkowych zmiennych środowiskowych.
Zmienna | Opis |
---|---|
SLURM_ARRAY_JOB_ID |
JOBID pierwszego zadania w tablicy |
SLURM_ARRAY_TASK_ID |
liczba równa wartości indeksującej podzadanie |
SLURM_ARRAY_TASK_COUNT |
całkowita liczba zadań w tablicy |
SLURM_ARRAY_TASK_MAX |
indeks ostatniego zadania w tablicy |
SLURM_ARRAY_TASK_MIN |
indeks pierwszego zadania w tablicy |
W podanym wcześniej przykładzie z argumentem SLURM_ARRAY_JOB_ID
jest równe wartości 177
, co odpowiada też zapisowi 177_1
. Wartość zmiennej SLURM_JOB_ID
dla kolejnych zadań w tablicy będzie przypisana w formie niezawierającej tablicowego indeksu zadania, czyli
Wartość SLURM_ARRAY_TASK_MIN
będzie równa 1, SLURM_ARRAY_TASK_MAX = 9
, a SLURM_ARRAY_TASK_COUNT = 5
.
job step
Zadanie składa się z dwóch sekcji: żądania zasobów oraz kolejności wykonywania zadań. Żądania zasobów to określenie wymaganej liczby CPU/GPU, czasu trwania zadania, potrzebnej ilości pamięci RAM etc. Kolejność wykonywania zadań opisuje natomist to co należy zrobić (np. kroki obliczeniowe, wybór oprogramowanie jakie ma zostać uruchomione, parametry itp.)
Zazwyczaj zadanie jest tworzone za pomocą skryptu zgłoszeniowego (shell script). Na przykład, komentarze zaczynające się od SBATCH
na początku skryptu Bash są interpretowane przez Slurm jako parametry opisujące żądania zasobów oraz innych opcji zadania SLURM. Pełną listę parametrów można uzyskać z podręcznika sbatch (man sbatch
).
Pierwsza linia pliku zgłoszeniowego musi być linią shebang (
#!/bin/bash
). Następna linia musi zawierać dyrektywy SBATCH. Na końcu można umieścić dowolną inną linię.
Skrypt sam w sobie stanowi krok zadania. Inne kroki zadania tworzone są za pomocą polecenia srun
.
#!/bin/bash
#
#SBATCH --job-name=test
#SBATCH --output=test_%j.txt
#
#SBATCH --ntasks=1
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=200
srun hostname
srun sleep 60
byłby żądaniem jednego procesora przez 60 minut i 200 MB pamięci RAM w domyślnej kolejce.
Po uruchomieniu zostaje wykonany pierwszy krok zadania srun hostname
, który uruchamia polecenie UNIX hostname
na węźle, na którym został przydzielony żądany procesor. Następnie, drugim krokiem zadania jest uruchomienie polecenie sleep
. Parametr --job-name
pozwala nadać zadaniu znaczącą nazwę, a parametr --output
definiuje plik, do którego ma zostać przesłany wynik zadania ( %j zostanie zastąpiony identyfikatorem zadania (Job ID) ).
Jeśli parametr
--output
nie jest określony to domyślną nazwą pliku jestslurm-%j.out
. Włączenie identyfikatora zadania (Job ID) w nazwę pliku wyjściowego jest przydatne, ponieważ zapobiega równoczesnemu zapisowi wielu zadań do tego samego pliku wyjściowego. Ważne jest, aby nie pozwalać wielu zadaniom zapisywać do tego samego pliku ponieważ powoduje to nieprawidłowe wyjście i tworzy niepotrzebne obciążenie systemu plików.
Domyślnie SLURM zapisuje wyniki do odrębnych plików.
Gdy skrypt zgłoszeniowy jest poprawny, musisz go przesłać do Slurm'a za pomocą polecenia sbatch
, które po udanym zgłoszeniu zwraca identyfikator (JobID) przypisany do zadania.
> sbatch submit.sh
sbatch: Submitted batch job 1234
Jest możliwe zgłoszenie nowego zadania do kolejki z poziomu skryptu SBATCH.
Po zgłoszeniu zadania do kolejki za pomocą sbatch
, jego wykonanie będzie przebiegać według następujących kroków/stanów:
Jeśli zadanie zostanie poprawnie wykonane, otrzymuje status zakończone (
COMPLETED
).
Jeśli zadanie nie zostanie poprawnie wykonane, otrzymuje status niepowodzenie (
FAILED
).
Na superkomputerze każdy z użytkowników posiada przypisaną domyślną Usługę "Przetwórz na superkomputerze", w ramach której domyślnie są uruchamiane wszystkie zadania obliczeniowe. W sytuacji, w której użytkownik posiada dostęp do więcej niż jednej Usługi "Przetwórz na superkomputerze", zadania zlecone bez parametru
-A <usługa>
obciążą domyślną usługę użytkownika.
Użytkownik superkomputera samodzielne decyduje, z zasobów której usługi chciałby skorzystać podczas zlecania zadania w systemie kolejkowania SLURM. W przypadku komendy srun
jest to robione poprzez użycie argumentu -A <usługa>
, a w skryptach sbatch
za pomocą odpowiedniej opcji w nagłówku skryptu #SBATCH -A <usługa>
.
Przykładowo:
$ srun -N 1 -c 2 -t 01:00:00 -A hpc-XXX-XXXXXXXX test_script.sh
Więcej informacji na temat działania systemu rejestru zużycia zasobów znajduję się w dokumentacji Rejestr zużycia zasobów przez Usługi "Przetwórz na superkomputerze".
Zalecamy poświęcić szczególną uwagę na to z której usługi korzystamy domyślnie oraz z której chcemy korzystać dla danego zadania obliczeniowego.
Użytkownicy mają możliwość zmiany domyślnej usługi do wykonywania obliczeń za pomocą komendy set-default-service
.
Wywołanie komendy set-default-service
bez żadnych parametrów wyświetla listę wszystkich dostępnych usług wraz z identyfikatorem usługi ustawionej domyślnie:
$ set-default-service
-------------------------------------------------------
You are currently a member of the following Services:
hpc-XXX-XXXXXXXXXX hpc-YYY-YYYYYYYYYY hpc-ZZZ-ZZZZZZZZZZ
Your default service is: hpc-YYY-YYYYYYYYYY
-------------------------------------------------------
Wywołanie komendy z parametrem -h
pokaże wiadomość pomocy i listę możliwych opcji i parametrów.
$ set-default-service -h
set-default-service <account> Set specified Service as the default Service
set-default-service -l List all available Services
set-default-service -d Print current default Service
set-default-service -h Show this help screen
Aby ustawić domyślną usługę należy podać jej identyfikator jako jedyny argument, a następnie potwierdzić chęć zmiany domyślnej usługi wpisując y
:
$ set-default-service hpc-XXX-XXXXXXXXXX
Setting hpc-XXX-XXXXXXXXXX as the default Service
Modified users...
ZZZZZ
Would you like to commit changes? (You have 30 seconds to decide)
(N/y): y
Default Service set successfully
-------------------------------------------------------
Parametr -d
służy do podania nazwy obecnie ustawionej domyślnej usługi
$ set-default-service -d
hpc-XXX-XXXXXXXXXX
Parametr -l
wyświetla listę wszystkich usług, do których należy dany użytkownik
$ set-default-service -l
hpc-XXX-XXXXXXXXXX hpc-YYY-YYYYYYYYYY hpc-ZZZ-ZZZZZZZZZZ
W przypadku, gdy użytkownik próbuje jako domyślną usługę ustawić usługę, do której nie przynależy, program zwraca informacje o błędzie:
$ set-default-service hpc-SSS-SSSSSSSSSS
You don't belong to the specified Service, or this Service does not exit. Aborting