Celem tej instrukcji jest wykonanie pierwszych kroków na klastrze Eden. Po jej przejściu:
Logowanie do systemu Eden jest możliwe przez SSH.
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 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:
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.
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.
Jeżeli chcesz przerwać swoje zadanie, najpierw sprawdź jego identyfikator JOBID:
squeue -u LOGIN_EDEN
Następnie użyj:
scancel JOBID
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:
Widzimy m.in. kolejkę student.
Możemy też sprawdzić, jakie zasoby są obecnie wolne:
sfree
Przykładowy wynik:
O, widzimy że zarówno węzeł stud-1, jak i stud-2 mają wolne CPU. Uruchommy sesję z:
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:
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.
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.
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:
#SBATCH,Pierwsza linia powinna wskazywać interpreter, np.:
#!/usr/bin/env bash
Utwórzmy prosty program w Pythonie:
echo 'print("Hello Eden")' > hello.py
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.
Przed wysłaniem zadania upewnij się, że katalog na logi istnieje.
Slurm nie utworzy go automatycznie.
mkdir -p slurm_logs
Wysyłamy zadanie do kolejki:
sbatch hello.sh
Slurm zwróci komunikat podobny do:
Submitted batch job 1752516
Przykład:
Liczba na końcu to JOBID zadania.
Możemy sprawdzić, czy zadanie znajduje się w kolejce:
squeue -u LOGIN_EDEN
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:
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:
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ć.
Slurm jest systemem zarządzania klastrami i planowania zadań powszechnie wykorzystywanym w środowiskach HPC i na superkomputerach.
Jego głównym zadaniem jest:
Typowy przebieg pracy wygląda następująco:
sbatch, w którym określa potrzebne zasoby i polecenia do wykonania, a następnie wysyła zadanie do kolejki.Oficjalna dokumentacja:
TODO
Tutorial przygotowany na podstawie materiałów opracowanych przez Tymona Tumialisa. Dziękujemy za przygotowanie instrukcji, przykładów oraz materiałów graficznych.