====== Tutorial ======
Celem tej instrukcji jest wykonanie pierwszych kroków na klastrze Eden. Po jej przejściu:
* zalogujesz się na Eden,
* sprawdzisz dostępne zasoby,
* uruchomisz pierwsze zadanie,
* sprawdzisz jego stan,
* zakończysz zadanie.
===== Logowanie =====
Logowanie do systemu Eden jest możliwe przez SSH.
==== Z sieci wydziałowej ====
Będąc w sieci wydziałowej, możesz połączyć się bezpośrednio:
ssh LOGIN_EDEN@eden.mini.pw.edu.pl
Zastąp ''LOGIN_EDEN'' swoim loginem na klastrze Eden.
==== Spoza sieci wydziałowej ====
Spoza sieci wydziałowej możesz połączyć się pośrednio, wykorzystując serwer wydziałowy jako tzw. //jump host//.
Służy do tego flaga ''-J'':
ssh -J LOGIN_MINI@ssh.mini.pw.edu.pl LOGIN_EDEN@eden.mini.pw.edu.pl
W tym przypadku najpierw następuje autoryzacja na serwerze wydziałowym, a następnie ruch jest automatycznie przekierowywany na klaster Eden.
Zastąp:
* ''LOGIN_MINI'' swoim loginem wydziałowym,
* ''LOGIN_EDEN'' swoim loginem na klastrze Eden.
Po poprawnym zalogowaniu powinieneś zobaczyć ekran powitalny Eden:
{{:pl:first_steps:tutorial_1.png?900|Ekran powitalny po zalogowaniu do Eden}}
**Eden, na który logujesz się przez SSH, jest tylko węzłem dostępowym. Nie wykonujemy na nim obliczeń!**
Po zalogowaniu mamy dostęp do terminala z systemem Linux oraz do systemu kolejkowego Slurm, za pomocą którego uruchamiamy zadania na klastrze.
===== Podstawowe komendy =====
Przydatne polecenia:
* ''sfree'' — wyświetla aktualnie wolne zasoby na klastrze.
* ''pestat'' — pokazuje status węzłów i informacje o tym, kto aktualnie używa zasobów.
* ''squeue'' — wyświetla całą kolejkę zadań.
* ''squeue -u LOGIN_EDEN'' — pokazuje tylko Twoje zadania.
* ''sinfo'' — wyświetla informacje o dostępnych partycjach (kolejkach) i stanie węzłów.
* ''sshare -l'' — wyświetla informacje o udziałach (FairShare) i priorytetach użytkowników.
==== Zatrzymanie zadania ====
Jeżeli chcesz przerwać swoje zadanie, najpierw sprawdź jego identyfikator ''JOBID'':
squeue -u LOGIN_EDEN
Następnie użyj:
scancel JOBID
===== Uruchamianie zadań interaktywnych =====
Sesja interaktywna jest wygodna do krótkich testów, eksperymentowania oraz sprawdzania kodu na węźle obliczeniowym.
Najpierw zobaczmy, jakie kolejki są dostępne:
sinfo
Przykładowy wynik:
{{:pl:first_steps:tutorial_2.png?900|Przykładowy wynik polecenia sinfo}}
Widzimy m.in. kolejkę ''student''.
Możemy też sprawdzić, jakie zasoby są obecnie wolne:
sfree
Przykładowy wynik:
{{:pl:first_steps:tutorial_3.png?900|Przykładowy wynik polecenia sfree}}
O, widzimy że zarówno węzeł ''stud-1'', jak i ''stud-2'' mają wolne CPU. Uruchommy sesję z:
* 1 CPU,
* 4 GB RAM,
* maksymalnym czasem pracy 30 minut.
Uruchamiamy:
srun -p student -A GROUP_NAME --cpus-per-task=1 --mem=4G --time=00:30:00 --pty bash
Zastąp ''GROUP_NAME'' nazwą swojej grupy.
Gdy system przyzna nam zasoby, możemy sprawdzić, na jakim węźle się znajdujemy:
hostname
Przykładowe uruchomienie sesji:
{{:pl:first_steps:tutorial_4.png?1000|Uruchomienie sesji interaktywnej i sprawdzenie nazwy węzła}}
Widzimy, że dostaliśmy ''stud-1''. Zmienił się również prompt terminala z ''@eden'' na ''@stud-1''. Oznacza to, że jesteśmy już na węźle obliczeniowym.
Możemy tutaj uruchamiać obliczenia, testować kod, uruchomić Pythona itd.
Po zakończeniu pracy wychodzimy z sesji:
exit
**Jeżeli przerwie się połączenie SSH, obliczenia uruchomione w sesji interaktywnej również zostaną przerwane.**
Można temu zapobiec, korzystając np. z ''tmux'' albo ''screen''.
==== Co oznaczają poszczególne opcje? ====
* ''srun'' — narzędzie służące do uruchamiania zadań. W tej konfiguracji pozwala na pracę interaktywną.
* ''-p student'' — wybiera partycję (kolejkę) o nazwie ''student''.
* ''-A GROUP_NAME'' — przypisuje zadanie do konkretnej grupy rozliczeniowej lub projektu.
* ''--cpus-per-task=1'' — żąda jednego rdzenia CPU.
* ''--gres=gpu:NUM_OF_GPUS'' — żąda dostępu do określonej liczby GPU, np. ''--gres=gpu:1''.
* ''--mem=MEM_IN_MBYTES'' — rezerwuje pamięć RAM dla całego zadania, np. ''--mem=4000M'' lub ''--mem=4G''.
* ''--time=TIME'' — ustala maksymalny czas trwania zadania w formacie ''DD-HH:MM:SS'', np. ''--time=00:30:00''. Po upływie tego czasu zadanie zostanie zakończone.
* ''--pty bash'' — tworzy interaktywny pseudoterminal z powłoką Bash.
===== Zadania wykonywane w tle =====
Do dłuższych obliczeń nie należy używać sesji interaktywnej. Lepszym rozwiązaniem są zadania wysyłane za pomocą ''sbatch''.
Opis zadania oraz wymagane zasoby zapisujemy w pliku tekstowym.
Plik składa się z:
* dyrektyw Slurma — linii zaczynających się od ''#SBATCH'',
* poleceń, które mają zostać wykonane.
Pierwsza linia powinna wskazywać interpreter, np.:
#!/usr/bin/env bash
==== Przykład krok po kroku ====
=== 1. Przygotowanie programu ===
Utwórzmy prosty program w Pythonie:
echo 'print("Hello Eden")' > hello.py
=== 2. Przygotowanie skryptu Slurm ===
Tworzymy plik ''hello.sh'' o następującej zawartości:
#!/usr/bin/env bash
#SBATCH --partition student
#SBATCH --account=GROUP_NAME
#SBATCH --cpus-per-task=1
#SBATCH --gres=gpu:0
#SBATCH --mem=4G
#SBATCH --time=00:10:00
#SBATCH --job-name=hello_test
#SBATCH --output=slurm_logs/hello_test-%j.log
python3 hello.py
Zastąp ''GROUP_NAME'' nazwą swojej grupy.
Symbol ''%j'' w nazwie pliku zostanie automatycznie zastąpiony numerem ''JOBID'' danego zadania.
=== 3. Utworzenie katalogu na logi ===
Przed wysłaniem zadania upewnij się, że katalog na logi istnieje.
Slurm nie utworzy go automatycznie.
mkdir -p slurm_logs
=== 4. Wysłanie zadania ===
Wysyłamy zadanie do kolejki:
sbatch hello.sh
Slurm zwróci komunikat podobny do:
Submitted batch job 1752516
Przykład:
{{:pl:first_steps:tutorial_5.png?700|Wysłanie zadania za pomocą sbatch}}
Liczba na końcu to ''JOBID'' zadania.
Możemy sprawdzić, czy zadanie znajduje się w kolejce:
squeue -u LOGIN_EDEN
=== 5. Sprawdzenie wyniku ===
Po zakończeniu zadania wynik znajdziemy w katalogu ''slurm_logs''.
Przykładowo, jeżeli ''JOBID'' zadania wynosi ''12345'':
cat slurm_logs/hello_test-12345.log
Powinniśmy zobaczyć:
Hello Eden
Przykład dla zadania o ''JOBID'' równym ''1752516'':
{{:pl:first_steps:tutorial_6.png?1000|Odczytanie wyniku zadania z pliku logu}}
==== Zadanie, które możemy zobaczyć w kolejce ====
Poprzedni program wykonuje się tak szybko, że możemy nie zdążyć zobaczyć go za pomocą ''squeue''.
Zmieńmy więc ''hello.py'' na:
import time
print("Hello Eden")
time.sleep(30)
print("Hello Eden after sleep")
Ponownie uruchamiamy:
sbatch hello.sh
i od razu sprawdzamy kolejkę:
squeue -u LOGIN_EDEN
Przykładowy wynik:
{{:pl:first_steps:tutorial_8.png?1000|Zadanie widoczne w kolejce Slurm}}
Jeżeli zadanie zostało już uruchomione, przez około 30 sekund powinniśmy zobaczyć je na liście.
W kolumnie ''ST'' wartość ''R'' oznacza, że zadanie jest aktualnie wykonywane (//Running//).
Po jego zakończeniu ponowne wykonanie:
squeue -u LOGIN_EDEN
nie powinno już go pokazywać.
===== Czym jest Slurm? =====
Slurm jest systemem zarządzania klastrami i planowania zadań powszechnie wykorzystywanym w środowiskach HPC i na superkomputerach.
Jego głównym zadaniem jest:
* przydzielanie użytkownikom zasobów obliczeniowych,
* zarządzanie kolejką zadań,
* uruchamianie zadań na dostępnych węzłach,
* zwalnianie zasobów po zakończeniu obliczeń.
Typowy przebieg pracy wygląda następująco:
- Użytkownik przygotowuje skrypt ''sbatch'', w którym określa potrzebne zasoby i polecenia do wykonania, a następnie wysyła zadanie do kolejki.
- Slurm sprawdza dostępność zasobów.
- Gdy odpowiednie zasoby są dostępne, Slurm je rezerwuje i uruchamia zadanie.
- Po zakończeniu obliczeń zasoby zostają zwolnione i mogą zostać przydzielone kolejnemu zadaniu.
Oficjalna dokumentacja:
[[https://slurm.schedmd.com/documentation.html|Dokumentacja Slurm]]
===== Dalsze kroki =====
TODO
----
//Tutorial przygotowany na podstawie materiałów opracowanych przez **Tymona Tumialisa**. Dziękujemy za przygotowanie instrukcji, przykładów oraz materiałów graficznych.//