Próbuję zrozumieć, jaka jest różnica między poleceniami SLURM srun
a sbatch
poleceniami. 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ą , srun
jest dla zadań składających, a sbatch
to 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ą srun
a sbatch
?
Jedna szczególna różnica jest taka, że srun
spowoduje błąd, jeśli testjob.sh
nie ma zgody wykonywalny IE chmod +x testjob.sh
natomiast sbatch
chętnie uruchom go. Co się dzieje „pod maską”, co powoduje, że tak się dzieje?
Dokumentacja wspomina również, że srun
jest to powszechnie używane w sbatch
skryptach. 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 srun
sam?
srun
wewnątrz skryptu zgłoszeniowego? Być może jestem zdezorientowany co do znaczenia „etapu pracy”. Na przykład, jeśli mam skrypt o nazwie,runjob.sh
który zawiera#!/bin/bash srun myjob.sh
, czy istnieje praktyczna różnica między wywołaniem (a)sbatch runjob.sh
vs (b)sbatch myjob.sh
vs (c)srun myjob.sh
vs (d)srun runjob.sh
? (Oczywiście to ostatnie jest głupie, ale jestem ciekawy).