SLURM `srun` vs` sbatch` i ich parametry

101

Próbuję zrozumieć, jaka jest różnica między poleceniami SLURM sruna sbatchpoleceniami. Będę zadowolony z ogólnego wyjaśnienia, a nie konkretnych odpowiedzi na poniższe pytania, ale oto kilka konkretnych punktów nieporozumień, które mogą być punktem wyjścia i dać wyobrażenie o tym, czego szukam.

Zgodnie z dokumentacją , srunjest dla zadań składających, a sbatchto za złożenie pracy dla późniejszego wykonania, ale w praktyce różnica jest dla mnie jasne, a ich zachowanie wydaje się być takie same. Na przykład mam klaster z 2 węzłami, każdy z 2 procesorami. Jeśli wykonam srun testjob.sh &5 razy z rzędu, będzie to ładnie ustawiać w kolejce piąte zadanie, aż procesor stanie się dostępny, podobnie jak wykonywanie sbatch testjob.sh.

Aby to pytanie było bardziej konkretne, myślę, że dobrym punktem wyjścia może być: Jakie są rzeczy, które mogę zrobić z jednym, czego nie mogę zrobić z drugim i dlaczego?

Wiele argumentów obu poleceń jest takich samych. Te, które wydają się najbardziej istotne jest --ntasks, --nodes, --cpus-per-task, --ntasks-per-node. W jaki sposób są one ze sobą powiązane i jak różnią się między sobą sruna sbatch?

Jedna szczególna różnica jest taka, że srunspowoduje błąd, jeśli testjob.shnie ma zgody wykonywalny IE chmod +x testjob.shnatomiast sbatchchętnie uruchom go. Co się dzieje „pod maską”, co powoduje, że tak się dzieje?

Dokumentacja wspomina również, że srunjest to powszechnie używane w sbatchskryptach. Prowadzi to do pytania: w jaki sposób współdziałają ze sobą i jaki jest „kanoniczny” przypadek użycia dla każdego z nich? A konkretnie, czy kiedykolwiek użyłbym srunsam?

dkv
źródło

Odpowiedzi:

117

Dokumentacja mówi

srun is used to submit a job for execution in real time

podczas

sbatch is used to submit a job script for later execution.

Obaj akceptują praktycznie ten sam zestaw parametrów. Główną różnicą jest to, że srunjest interaktywny i blokujący (wynik otrzymujesz na swoim terminalu i nie możesz pisać innych poleceń, dopóki nie zostanie ukończony), podczas gdy sbatchjest to przetwarzanie wsadowe i nieblokujące (wyniki są zapisywane do pliku i możesz przesłać inne polecenia od razu).

Jeśli używasz srunw tle ze &znakiem, usuwasz funkcję „blokowania” programu srun, która staje się interaktywna, ale nie blokuje. Jest jednak nadal interaktywny, co oznacza, że ​​dane wyjściowe zaśmiecają twój terminal, a srunprocesy są połączone z twoim terminalem. Jeśli się rozłączysz, stracisz nad nimi kontrolę lub mogą zostać zabici (w zależności od tego, stdoutczy w zasadzie używają, czy nie). I zostaną zabite, jeśli maszyna, z którą łączysz się w celu przesyłania zadań, zostanie ponownie uruchomiona.

Jeśli używasz sbatch, przesyłasz swoją pracę i jest ona obsługiwana przez Slurm; możesz odłączyć, zabić terminal itp. bez żadnych konsekwencji. Twoja praca nie jest już połączona z działającym procesem.

Jakie rzeczy mogę zrobić z jednym, czego nie mogę zrobić z drugim i dlaczego?

Funkcją, która jest dostępna sbatchi niedostępna, sruntablice zadań . Jak srunmożna użyć w sbatchskrypcie, nie ma nic, z czym nie można by zrobić sbatch.

W jaki sposób są one ze sobą powiązane i czym się różnią w przypadku srun vs sbatch?

Wszystkie parametry --ntasks, --nodes, --cpus-per-task, --ntasks-per-nodemają takie samo znaczenie w obydwu komend. Dotyczy to prawie wszystkich parametrów, z godnym uwagi wyjątkiem --exclusive.

Co się dzieje „pod maską”, co powoduje, że tak się dzieje?

srunnatychmiast wykonuje skrypt na zdalnym hoście, sbatchkopiuje skrypt do pamięci wewnętrznej, a następnie przesyła go do węzła obliczeniowego po rozpoczęciu zadania. Możesz to sprawdzić, modyfikując swój skrypt przesyłania po jego przesłaniu; zmiany nie będą brane pod uwagę (zobacz to ).

W jaki sposób współdziałają ze sobą i jaki jest „kanoniczny” przypadek użycia każdego z nich?

Zwykle używasz sbatchdo przesłania zadania i srunskryptu przesyłania do tworzenia kroków zadania, jak nazywa je Slurm. srunsłuży do uruchamiania procesów. Jeśli Twój program jest równoległym programem MPI, srunzajmie się utworzeniem wszystkich procesów MPI. Jeśli nie, srunuruchomi Twój program tyle razy, ile określono w --ntasksopcji. Istnieje wiele przypadków użycia w zależności od tego, czy Twój program jest równoległy czy nie, ma długi czas działania czy nie, składa się z jednego pliku wykonywalnego lub nie, itd. O ile nie określono inaczej, srundomyślnie dziedziczy odpowiednie opcje programu sbatchlub sallocktóre jest uruchamiane pod ( stąd ).

A konkretnie, czy kiedykolwiek użyłbym samego srun?

Poza małymi testami, nie. Typowym zastosowaniem jest srun --pty bashuzyskanie powłoki w zadaniu obliczeniowym.

damienfrancois
źródło
6
Dziękuję za odpowiedź, to lepsze niż cokolwiek, na co mogłem liczyć. Jedna kontynuacja, ponieważ był to jeden z moich początkowych punktów pomyłki: po co zawracać sobie głowę wywoływaniem srunwewnątrz skryptu zgłoszeniowego? Być może jestem zdezorientowany co do znaczenia „etapu pracy”. Na przykład, jeśli mam skrypt o nazwie, runjob.shktóry zawiera #!/bin/bash srun myjob.sh, czy istnieje praktyczna różnica między wywołaniem (a) sbatch runjob.shvs (b) sbatch myjob.shvs (c) srun myjob.shvs (d) srun runjob.sh? (Oczywiście to ostatnie jest głupie, ale jestem ciekawy).
dkv
3
może mógłbyś przejrzeć slajdy z sesji szkoleniowej, którą niedawno przeprowadziłem, aby znaleźć pomysły na wykorzystanie srun w skrypcie zgłoszeń: cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois
5
Wygląda na to, że wszystkie przykłady na slajdach (a także samouczek na stronie CECI) są używane srunw sbatchskrypcie przesyłania. Jednak odkryłem, że polecenia bez srunskryptu przesyłania będą działać w ten sam sposób. Czy rzeczywiście istnieje różnica między czterema inwokacjami, o których wspomniałem powyżej?
dkv
9
Wszystkie twoje przykłady będą działały w ten sam sposób tylko wtedy, gdy (1) alokacja dotyczy jednego procesora i (2) program jest czysto sekwencyjny. Aby zobaczyć różnice, poproś o więcej niż jedno zadanie. Inną różnicą jest to, że jeśli nie użyjesz srun w sbatchu, polecenie sstat nie zwróci żadnych przydatnych informacji
damienfrancois
1
@Atcold ta wersja może być bardziej aktualna
damienfrancois
6

To właściwie nie w pełni odpowiada na pytanie, ale oto kilka dodatkowych informacji, które znalazłem, które mogą być pomocne dla kogoś w przyszłości:


Z pokrewnego wątku, który znalazłem z podobnym pytaniem:

W skrócie, sbatch i salloc przydzielają zasoby do zadania, podczas gdy srun uruchamia zadania równoległe w tych zasobach. Po wywołaniu w ramach alokacji zadań, srun uruchomi równoległe zadania dla niektórych lub wszystkich przydzielonych zasobów. W takim przypadku srun domyślnie dziedziczy odpowiednie opcje sbatchu lub salloc, w ramach którego działa. Możesz wtedy (zwykle) udostępnić srunowi różne opcje, które zastąpią to, co domyślnie otrzymuje. Każde wywołanie srun w zadaniu jest nazywane krokiem zadania.

srun można również wywołać poza alokacją zadań. W takim przypadku srun żąda zasobów, a gdy te zasoby zostaną przyznane, uruchamia zadania w tych zasobach jako pojedyncze zadanie i krok zadania.

Istnieje stosunkowo nowa strona internetowa, która zawiera bardziej szczegółowe informacje dotyczące opcji -B i --exclusive.

doc / html / cpu_management.shtml


Dodatkowe informacje ze strony SLURM FAQ .

Polecenie srun ma dwa różne tryby działania. Po pierwsze, jeśli nie zostanie uruchomione w ramach istniejącego zadania (tj. Nie w ramach alokacji zadania Slurm utworzonej przez salloc lub sbatch), wówczas utworzy przydział zadań i utworzy aplikację. Jeśli jest uruchamiane w ramach istniejącej alokacji, polecenie srun powoduje tylko utworzenie aplikacji. W przypadku tego pytania zajmiemy się tylko pierwszym trybem działania i porównamy tworzenie przydziału zadań za pomocą poleceń sbatch i srun.

Polecenie srun jest przeznaczone do użytku interaktywnego, w którym ktoś monitoruje dane wyjściowe. Dane wyjściowe aplikacji są postrzegane jako dane wyjściowe polecenia srun, zwykle na terminalu użytkownika. Polecenie sbatch służy do przesłania skryptu do późniejszego wykonania, a jego dane wyjściowe są zapisywane do pliku. Opcje poleceń używane podczas przydzielania zadań są prawie identyczne. Najbardziej zauważalną różnicą w opcjach jest to, że polecenie sbatch obsługuje koncepcję tablic zadań, podczas gdy srun nie. Inną istotną różnicą jest odporność na uszkodzenia. Niepowodzenia związane z zadaniami wsadowymi zwykle skutkują ponownym żądaniem zadania i ponownym wykonaniem, podczas gdy awarie związane z srun zazwyczaj skutkują wygenerowaniem komunikatu o błędzie z oczekiwaniem, że użytkownik zareaguje w odpowiedni sposób.


Tutaj kolejna ważna rozmowa

dkv
źródło