Dostęp do systemu kolejkowego odbywa się za pośrednictwem węzła pod adresem ui.wcss.pl
, na który można zalogować się poprzez NoMachine, gdzie użytkownik ma dostęp do interfejsu graficznego, bądź protokołem ssh
za pośrednictwem terminala.
Typowa procedura logowania za pośrednictwiem ssh
dla użytkownika o nazwie abcd
:
\> ssh abcd@ui.wcss.pl
# należy zaakceptować fingerprint
# oraz podać hasło użytkownika
Password:******
abcd@ui ~\>
Ze względu na wygodę oraz bezpieczeństwo zdecydowanie rekomendujemy logowanie za pomocą klucza SSH, aby nie musieć wpisywać hasła przy każdym logowaniu.
Aby uzyskać informacje o partycjach oraz ich stanie na klastrze, należy posłużyć się komendą
sinfo
Przykładowe wyjście po wpisaniu komendy:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
test* up infinite 0 n/a
pracelab up infinite 445 idle~ r22c01b[02-16],
W przypadku nieokreślenia zasobów srun
automatycznie alokuje tzw. ustawienia domyślne (2 rdzenie, 2-4GB pamięci itd.). Aby zaalokować inne wartości, można użyć opcji:
Wyrażenie [skrót, pełna komenda] | Definicja |
---|---|
-Nβ , --nodes=β |
Liczba węzłów obliczeniowych |
-nβ , --ntasks=β |
Całkowita liczba podzadań (tasks) w zgłoszeniu (domyślnie jedno) |
-cβ , --cpus-per-task=β |
Liczba rdzeni przypadająca na każde z podzadań |
--mem=β |
Ilość alokowanej pamięci w MB (o ile nie określono inaczej) |
--mem-per-cpu=β |
Ilość pamięci przypadającej na każdy zaalokowany rdzeń |
-tβ , --time=β |
Limit czasu dla zadania w minutach (alternatywnie hh:mm:ss ) |
gdzie β
oznacza dowolnie wybraną liczbę. Aby zażądać konkretnej partycji bądź węzła, należy użyć opcji
-p, --partition=<wybrana_partycja>
-w, --nodelist=<lista_węzłów>
.Przykładowa alokacja z uruchomieniem zadania interaktywnego:
srun -p pracelab -N1 -c20 --mem=10gb -t10 --pty bash
Aby poznać więcej funkcji, najlepiej jest użyć w terminalu komendy srun --help
, która wyświetli wbudowaną pomoc programu.
Aby uruchomić zadanie interaktywne dla określonego programu, należy użyć komendy:
srun -I --pty program
W tej komendzie:
srun
– alokuje zasoby i zleca wykonanie zadania-I
– abrewiacja od --immediate
--pty
– uruchamia tryb pseudoterminalaprogram
– dowolny program.Przykładowe programy, które mogą być użyteczne w takim trybie, to bash
lub python
. Z zadania interaktywnego można wyjść poprzez zakończenie procesu, na przykład w przypadku bash
przez wpisanie komendy exit
lub skrótem klawiaturowym ctrl
+d
(w systemie Linux). Komenda srun
poza uruchamianiem trybu interaktywnego jest raczej rzadko stosowana.
Aby wysłać zadanie do kolejki, należy najpierw przygotować odpowiedni skrypt. Skrypt taki powinien przede wszystkim zawierać informacje na temat alokacji zasobów.
Przykładowo plik myjob.sh
:
#!/bin/bash
#SBATCH -N1
## jeden węzeł
#SBATCH -c10
## 10 rdzeni per proces
#SBATCH --mem=10gb
## 10 gigabajtów pamięci RAM
#SBATCH --time=1:00:00
## limit czasu ustawiony na 1h
# Dodatkowo może on zawierać użyteczne argumenty takie jak zlecenie wysłania
# wiadomości e-mail po ukończeniu zadania lub ustawienie konkretnej nazwy zadania
#SBATCH --mail-user=<adres_e-mail>
#SBATCH --job-name=<nazwa_zadania>
# Aby polecenie `module` działało prawidłowo należy dostosować środowisko zadania:
source /usr/local/sbin/modules.sh
# Następnie ładowany do środowiska jest odpowiedni moduł i włączana jest symulacja.
module load Python
python3 program.py
sbatch myjob.sh
- zleci zadanie do systemu kolejkowego.
Alternatywnie, można skorzystać ze skryptów "sub" (służących do zgłaszania zadań) jeżeli takowe zostały wcześniej przygotowane przez pracowników. Aby uzyskać dostęp do skryptów należy skorzystać z polecenia:
abcd@ui ~\> bem2
a następnie można wpisać sub-
i nacisnąć przycisk TAB na klawiaturze aby wyświetlić dostępne skrypty.
abcd@ui ~\> sub-
sub-abaqus-2021 sub-cp2k-8.1 sub-gaussian-2016-C.01 sub-orca-4.2.1
sub-abinit-9.4.1 sub-cpmd-4.3 sub-gromacs-2021 sub-r-4.1.0
sub-adf-2021.102 sub-dirac-19 sub-matlab-R2021a sub-raspa-2.0
sub-comsol-5.6 sub-fds-6.7.6 sub-namd-2.14
sub-comsol-5.6-llm sub-fluent-21.2 sub-nwchem-7.0.2
W celu wyświetlenia pomocy danego skryptu wystarczy wpisać jego nazwę i kliknąć przycisk ENTER. Przykład dla skryptu dla oprogramowania comsol-5.6
:
abcd@ui ~\> sub-comsol-5.6
comsol 5.6
Usage: sub-comsol-5.6 [PARAMETERS] INPUT_FILE OUTPUT_FILE
Parameters:
-p PARTITION Set partition (queue). Default = normal
-n NODES Set number of nodes. Default = 1
-c CORES Up to 48. Default = 48
-m MEMORY In GB, up to 180 (must be integer value). Default = 360
-t TIME_LIMIT In hours. Default = 6
Czym różni się sbatch
od srun
?
https://stackoverflow.com/questions/43767866/slurm-srun-vs-sbatch-and-their-parameters
sstat
- wyświetl informacje o działających zadaniach.
Więcej informacji: https://slurm.schedmd.com/sstat.html
sstat --jobs=job_id
sstat --parsable --jobs=job_id --format=JobID,AveCPU,AveVMSize
sstat --helpformat
Podstawowy status zadania, na przykład czy zadanie jest uruchomione bądź zatrzymane, jest dostępny za pomocą komendy squeue
.
Nazwa kolumny ST
jest abrewiacją od słowa state. Jeżeli zadanie z jakiegoś powodu nie jest uruchomione, powód jest podany w ostatniej kolumnie.
abcd@ui: ~ $ squeue -u abcd
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
142 test bash abcd R 0:18 1 wn1701
lub
abcd@ui: ~ $ squeue -u abcd --long
Mon Jul 05 10:44:43 2021
JOBID PARTITION NAME USER STATE TIME TIME_LIMI NODES NODELIST(REASON)
142 test bash abcd RUNNING 8:23 UNLIMITED 1 wn1701
Spis najbardziej istotnych kodów statusu znajduje się poniżej. W dokumentacji Slurma można znaleźć dokładny spis statusów oraz powodów.
Status | Kod | Definicja |
---|---|---|
COMPLETED | CD | Zadanie zostało ukończone pomyślnie |
COMPLETING | CG | Zadanie jest w trakcie kończenia pracy |
FAILED | F | Zadanie zakończyło się błędem |
PENDING | PD | Oczekuje na alokację zasobów |
PREEMPTED | PR | Zadanie zostało wywłaszczone przez inne zadanie |
RUNNING | R | Uruchomione (w trakcie pracy) |
SUSPENDED | S | Zatrzymane z dealokacją zasobów |
STOPPED | ST | Zatrzymane z zachowaniem alokacji zasobów |
W przypadku chęci sprawdzenia dokładniejszego statusu zadania wraz z ilością przydzielonych zasobów, należy posłużyć się komendą scontrol show jobid -d <job_id>
.
abcd@ui: ~ $ squeue -u abcd
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
473 test bash abcd R 0:13 1 wn1701
abcd@ui: ~ $ scontrol show job -d 473
JobId=473 JobName=bash
UserId=abcd(9999) GroupId=kdm(30199) MCS_label=N/A
Priority=4294901420 Nice=0 Account=(null) QOS=normal
JobState=RUNNING Reason=None Dependency=(null) # aktualny stan zadania
Requeue=1 Restarts=0 BatchFlag=0 Reboot=0 ExitCode=0:0
DerivedExitCode=0:0
RunTime=00:04:43 TimeLimit=UNLIMITED TimeMin=N/A # czas pracy oraz limit czasu
SubmitTime=2021-07-01T14:34:42 EligibleTime=2021-07-01T14:34:42 # data zgłoszenia zadania do kolejki
AccrueTime=Unknown
StartTime=2021-07-01T14:34:42 EndTime=Unknown Deadline=N/A # data rozpoczęcia/zakończenia
SuspendTime=None SecsPreSuspend=0 LastSchedEval=2021-07-01T14:34:42
Partition=test AllocNode:Sid=ui:3582 # przypisana partycja
ReqNodeList=(null) ExcNodeList=(null) # żądana lista węzłów
NodeList=wn1701 # przypisana lista węzłów
BatchHost=wn1701
NumNodes=1 # liczba przypisanych węzłów
NumCPUs=40 # liczba przypisanych rdzeni
NumTasks=1 # liczba podzadań
CPUs/Task=40 # rdzenie przypadające na podzadanie
ReqB:S:C:T=0:0:*:*
TRES=cpu=2,node=1,billing=2
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
JOB_GRES=(null)
Nodes=wn1701 CPU_IDs=10-11 Mem=0 GRES=
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
Features=(null) DelayBoot=00:00:00
OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
Command=bash
WorkDir=/home/abcd # katalog bieżący dla zadania
Power= # zużyta moc elektryczna (NIY)
NtasksPerTRES:0
Aby usunąć zadanie, należy znać jego ID. Numer ten może zostać odczytany poleceniem
squeue -u <username>
gdzie username
należy zastąpić swoją nazwą użytkownika. Przykładowe wyjście może wyglądać następująco:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
613 test bash abcd R 0:05 1 wn1701
614 test bash abcd R 1:05 1 wn1701
Po odczytaniu wartości JOBID
możliwe jest zakończenie tego konkretnego zadania poleceniem
scancel 613
Można jednocześnie zakończyć więcej niż jedno zadanie, oddzielając spacją kolejne argumenty, przykładowo:
scancel 613 614
Wszystkie zadania należące do konkretnego użytkownika można usunąć komendą
scancel -u <username>
Tablice zadań (ang. array job) są pomocne w przypadku chęci wykonania tzw. parameter sweepa. Przykładowy skrypt wykorzystujący argument podany w linii polecenia argument.py
może wyglądać tak:
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
.
Aby usunąć wszystkie zadania z powyższego przykładu, należy użyć komendy scancel 177
. Usunąć wybrany zakres zadań z tablicy (na przykład od 3 do 5) można komendą scancel 177_[3-5]
.
Protokół komunikacyjny MPI (Message Parsing Interface) umożliwia pracę aplikacji na wielu rdzeniach lub węzłach jednocześnie (tzw. obliczenia rozproszone), o ile jest ona kompatybilna z protokołem. MPI może jednak służyć również do włączania wielu instancji jednego programu w obrębie pojedynczego zadania.
Przykładowy mpijob.sh
uruchamiający 10 procesów MPI na dwóch węzłach:
#!/bin/bash
#SBATCH -N2 # dwa węzły
#SBATCH -n10 # 10 podzadań MPI
#SBATCH --ntasks-per-node=5 # po 5 podzadań na węzeł
#SBATCH -c1 # jeden rdzeń na każde podzadanie
#SBATCH --mem-per-cpu=300 # każdemu rdzeniowi przydzielone zostanie 300 MB pamięci
#SBATCH -t10 # limit czasu na wykonanie: 10 min
module load Python
module load OpenMPI
mpiexec python3 symulacja.py
Rozdzielanie zadania na wiele węzłów może okazać się przydatne, gdy jeden węzeł nie posiada oczekiwanej liczby wolnych rdzeni lub też w przypadku, gdy prędkość obliczeń jest ograniczona przepustowością pamięci RAM.
Komenda | PBS | SLURM |
---|---|---|
kolejki / partycje | qstat -q |
sinfo |
lista zadań | qstat -r , qstat -i |
squeue |
lista zadań użytkownika | qstat -u <username> |
squeue -u <username> |
zlecanie zadań | qsub |
sbatch / srun |
status zadania | qstat |
squeue <job_id> , scontrol show job <job_id> |
usuwanie zadania | qdel <job_id> |
scancel <job_id> |
usuwanie wszystkich zadań użytkownika | qselect -u <username> | xargs qdel , qdel -u <username> |
scancel -u <username> |
sesja interaktywna w pseudoterminalu | qsub -I |
srun --pty <program> |
Dyrektywy dla systemu kolejkowego slurm
mogą znajdować się w pliku, w którym znajdują się jednocześnie dyrektywy systemu kolejkowego PBS
. Interpreter uzna dyrektywy nienależące do niego za komentarze i nie zakłócą one wykonywania zadania.
Argument | #PBS |
#SLURM |
---|---|---|
nazwa zadania | -N <nazwa> |
-J <nazwa> |
kolejka / partycja | -q <nazwa> |
-p <nazwa> |
liczba węzłów | -l select=<liczba> |
-N <liczba> |
całkowita liczba podzadań / procesów MPI | N/A | -n <liczba> |
całkowita liczba rdzeni na podzadanie | N/A | -c <liczba> |
liczba rdzeni obliczeniowych | -l ncpus=<liczba> |
N/A |
liczba procesów MPI na węzeł | -l mpiprocs=<liczba> |
--ntasks-per-node=<liczba> |
ilość pamięci RAM na węzeł | -l mem=<ilość> |
--mem=<ilość> |
limit czasu | -l walltime=<hh:mm:ss> |
-t <minuty> , -t <dni-hh:mm:ss> |
Warto zwrócić uwagę, że alokacja liczby rdzeni w systemie kolejkowym SLURM domymyślnie określa całkowite wielkości, a nie per węzeł, tak jak ma to miejsce w systemie PBS.
Zmienna | PBS | SLURM |
---|---|---|
ID zadania | PBS_JOBID |
SLURM_JOBID |
katalog zgłoszenia | PBS_O_WORKDIR |
SLURM_SUBMIT_DIR |
host zgłoszenia | PBS_O_HOST |
SLURM_SUBMIT_HOST |
lista węzłów | PBS_NODEFILE |
SLURM_JOB_NODELIST |
ID podzadania | PBS_ARRAYID |
SLURM_ARRAY_TASK_ID |
Szczegółowe informacje o węźle można otrzymać, dodając do polecenia odpowiednie parametry i wybierając węzeł, który nas interesuje:
abcd@ui: ~ $ sinfo --Node --long --node r21c01b01
Thu Jul 01 10:11:00 2021
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
r21c01b01 1 pracelab idle 48 2:24:1 191488 0 1 (null) none
--Node
oznacza wyświetlenie inforacji o węźle. --long
zapewnia wyświetlenie między innymi pól CPUS
oraz MEMORY
. Nazwę węzła podaje się jako argument dla opcji --node
. Skrócona wersja powyższej komendy to sinfo -Nln r21c01b01
. Ostatni wyraz jest odczytaną z komendy sinfo
nazwą węzła. W przypadku nieokreślenia konkretnego węzła wyświetlona zostanie pełna lista wszystkich węzłów. Aby otrzymać informację o wszystkich węzłach na danej partycji, można zastąpić n
argumentem p
i podaniem nazwy partycji np. sinfo -Nlp pracelab
. Poszczególne węzły mogą różnić się ilością posiadanej pamięci RAM.
Jeszcze bardziej szczegółową alternatywą jest użycie komendy scontrol
:
abcd@ui: ~ $ scontrol show node r21c01b01
NodeName=r21c01b01 Arch=x86_64 CoresPerSocket=24
CPUAlloc=0 CPUTot=48 CPULoad=0.00
AvailableFeatures=(null)
ActiveFeatures=(null)
Gres=(null)
NodeAddr=r21c01b01 NodeHostName=r21c01b01 Version=20.11.7
OS=Linux 4.18.0-305.3.1.el8_4.x86_64 #1 SMP Wed Jun 2 03:19:21 EDT 2021
RealMemory=191488 AllocMem=0 FreeMem=190637 Sockets=2 Boards=1
MemSpecLimit=2048
State=IDLE ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
Partitions=pracelab
BootTime=2021-06-30T17:59:03 SlurmdStartTime=2021-06-30T17:59:22
CfgTRES=cpu=48,mem=187G,billing=48
AllocTRES=
CapWatts=n/a
CurrentWatts=0 AveWatts=0
ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s
Comment=(null)
Dla każdego zgłoszonego zadania środowisko tworzy odpowiednie zmienne środowiskowe. Informacje można wyświetlić za pomocą komendy env
.
Przykład opisujący wybrane (dzięki komendzie grep
) zmienne:
abcd@ui: ~ $ srun --pty bash
abcd@wn1701: ~ $ env | grep SLURM
SLURM_NODEID=0 # relatywne ID węzła
SLURM_TASK_PID=1033362 # ID procesu
SLURM_SUBMIT_DIR=/home/abcd # lokalizacja zgłoszonego skryptu / zadania
SLURM_STEPID=0 # ID aktualnego kroku zadania
SLURM_PROCID=0 # relatywny ID procesu
SLURM_JOB_GID=30199 # ID grupy
SLURMD_NODENAME=wn1701 # nazwa węzła
SLURM_TASKS_PER_NODE=1 # liczba podzadań dla per węzeł
SLURM_NNODES=1 # liczba węzłów przydzielonych dla zadania
SLURM_JOB_NODELIST=wn1701 # lista przydzielonych węzłów
SLURM_CLUSTER_NAME=bem2 # nazwa klastra
SLURM_NTASKS=1 # liczba podzadań
SLURM_JOB_CPUS_PER_NODE=2 # liczba rdzeni per węzeł
SLURM_JOB_NAME=bash # nazwa zadania
SLURM_JOB_ID=148 # ID zadania
SLURM_CPUS_ON_NODE=2 # liczba procesorów na węźle
SLURM_JOB_NUM_NODES=1 # całkowita liczba przydzielonych węzłów
SLURM_JOB_PARTITION=test # partycja na której znajdują się przydzielone zasoby
SLURM_JOB_USER=abcd # nazwa użytkownika