SLURM `srun` vs` sbatch` и их параметры
Я пытаюсь понять, какая разница между SLURM srun
и sbatch
. Я буду доволен общим объяснением, а не конкретными ответами на следующие вопросы, но вот некоторые конкретные моменты путаницы, которые могут быть отправной точкой и дать представление о том, что я ищу.
Согласно документации , srun
предназначен для отправки заданий, а sbatch
- для отправки заданий для последующего исполнения, но разница неясна для меня, и их поведение, похоже, одинаково. Например, у меня есть кластер с двумя узлами, каждый с двумя процессорами. Если я выполню srun testjob.sh &
5x подряд, он будет стоять в очереди на пятое задание до тех пор, пока процессор не станет доступен, как будет выполняться sbatch testjob.sh
.
Чтобы сделать вопрос более конкретным, я думаю, что хорошим местом для начала может быть: Что я могу сделать с тем, что я не могу сделать с другим, и почему?
Многие аргументы для обеих команд одинаковы. Наиболее релевантными являются --ntasks
, --nodes
, --cpus-per-task
, --ntasks-per-node
. Как они связаны друг с другом и как они отличаются для srun
vs sbatch
?
Единственное отличие состоит в том, что srun
приведет к ошибке, если testjob.sh
не имеет исполняемого разрешения, т.е. chmod +x testjob.sh
, тогда как sbatch
с радостью запустит его. Что происходит "под капотом", что приводит к этому?
В документации также упоминается, что srun
обычно используется внутри сценариев sbatch
. Это приводит к вопросу: Как они взаимодействуют друг с другом, и какова "каноническая" усекаса для каждого из них? В частности, могу ли я когда-либо использовать srun
самостоятельно?
Ответы
Ответ 1
В документации указано
srun is used to submit a job for execution in real time
while
sbatch is used to submit a job script for later execution.
Оба они принимают практически одинаковый набор параметров. Основное отличие состоит в том, что srun
является интерактивным и блокирующим (вы получаете результат в своем терминале, и вы не можете писать другие команды до его завершения), а sbatch
- пакетная обработка и неблокирование (результаты записываются в файл и вы можете сразу отправить другие команды).
Если вы используете srun
в фоновом режиме с знаком &
, вы удаляете функцию блокировки srun
, которая становится интерактивной, но не блокирующей. Он по-прежнему является интерактивным, что означает, что выход будет загромождать ваш терминал, а процессы srun
связаны с вашим терминалом. Если вы отключитесь, вы потеряете контроль над ними, или они могут быть убиты (в зависимости от того, используют ли они stdout
или нет в основном). И они будут убиты, если машина, к которой вы подключаетесь для отправки заданий, перезагружается.
Если вы используете sbatch
, вы отправляете свою работу, и она обрабатывается Slurm; вы можете отключить, убить терминал и т.д. без каких-либо последствий. Ваша работа больше не связана с текущим процессом.
Что я могу сделать с тем, что я не могу сделать с другим, и почему?
Функция, доступная для sbatch
, а не srun
, - это задания. Поскольку srun
может использоваться в sbatch
script, вы ничего не можете сделать с sbatch
.
Как они связаны друг с другом и как они отличаются для srun vs sbatch?
Все параметры --ntasks
, --nodes
, --cpus-per-task
, --ntasks-per-node
имеют одинаковое значение в обеих командах. Это верно для почти всех параметров, за исключением --exclusive
.
Что происходит "под капотом", что приводит к тому, что это так?
srun
немедленно запускает script на удаленном хосте, а sbatch
копирует script во внутреннюю память, а затем загружает его в вычисление node при запуске задания. Вы можете проверить это, изменив ваше представление script после его отправки; изменения не будут приняты во внимание (см. this).
Как они взаимодействуют друг с другом, и какова "каноническая" усекаса для каждого из них?
Вы обычно используете sbatch
для отправки задания и srun
в представлении script для создания шагов задания, которые называет Slurm. srun
используется для запуска процессов. Если ваша программа является параллельной программой MPI, srun
заботится о создании всех процессов MPI. Если нет, srun
будет запускать вашу программу столько раз, сколько задано опцией --ntasks
. Существует много вариантов использования в зависимости от того, является ли ваша программа параллельной или нет, имеет длительное время или нет, состоит из одного исполняемого файла или нет и т.д. Если не указано иное, srun
наследует по умолчанию соответствующие параметры sbatch
или salloc
, с которым он работает (от здесь).
В частности, могу ли я когда-либо использовать srun?
Кроме небольших тестов, нет. Обычно используется srun --pty bash
, чтобы получить оболочку на задании вычисления.
Ответ 2
На самом деле это не полностью отвечает на вопрос, но вот еще одна информация, которую я нашел, может быть полезной для кого-то в будущем:
Из связанный поток, который я нашел с похожим вопросом:
Вкратце, sbatch и salloc выделяют ресурсы для задания, в то время как srun запускает параллельные задачи в этих ресурсах. При вызове в распределении задания srun запускает параллельные задачи для некоторых или всех выделенных ресурсов. В этом случае srun наследует по умолчанию соответствующие параметры sbatch или salloc, в которых он работает. Затем вы можете (обычно) предоставлять srun различные параметры, которые будут переопределять то, что он получает по умолчанию. Каждый вызов srun в задании известен как шаг задания.
srun также может быть выведен за пределы распределения заданий. В этом случае srun запрашивает ресурсы, и когда эти ресурсы предоставляются, запускает задачи по этим ресурсам как одно задание и шаг задания.
Существует относительно новая веб-страница, в которой более подробно рассматриваются варианты -B и -exclusive.
DOC/HTML/cpu_management.shtml
Дополнительная информация с Страница SLURM FAQ.
Команда srun имеет два разных режима работы. Во-первых, если не выполняться в рамках существующего задания (т.е. Не в распределении задания Slurm, созданного salloc или sbatch), тогда он создаст распределение заданий и вызовет приложение. Если выполняется в существующем распределении, команда srun только запускает приложение. По этому вопросу мы рассмотрим только первый режим работы и сравним создание распределения заданий с помощью команд sbatch и srun.
Команда srun предназначена для интерактивного использования, а кто-то контролирует вывод. Вывод приложения рассматривается как вывод команды srun, как правило, на пользовательский терминал. Команда sbatch предназначена для отправки script для последующего исполнения, а ее вывод записывается в файл. Параметры команды, используемые в распределении задания, почти идентичны. Наиболее заметная разница в настройках заключается в том, что команда sbatch поддерживает концепцию рабочих массивов, а srun - нет. Другое существенное различие заключается в отказоустойчивости. Неудачи, связанные с заданиями sbatch, обычно приводят к тому, что задание запрашивается и выполняется снова, в то время как сбои, связанные с srun, обычно приводят к появлению сообщения об ошибке с ожиданием того, что пользователь будет отвечать соответствующим образом.