SLURM `srun` vs` sbatch` и их параметры

95

Я пытаюсь понять, в чем разница между SLURM srunи sbatchкомандами. Я буду рад общему объяснению, а не конкретным ответам на следующие вопросы, но вот некоторые конкретные моменты путаницы, которые могут стать отправной точкой и дать представление о том, что я ищу.

Согласно документации , он srunпредназначен для отправки заданий и sbatchпредназначен для отправки заданий для последующего выполнения, но практическая разница мне не ясна, и их поведение кажется одинаковым. Например, у меня есть кластер с 2 узлами, каждый с 2 ​​процессорами. Если я выполню srun testjob.sh &5 раз подряд, пятое задание будет аккуратно поставлено в очередь до тех пор, пока процессор не станет доступным, как и выполнение sbatch testjob.sh.

Чтобы сделать вопрос более конкретным, я думаю, что хорошее место для начала может быть: какие вещи, которые я могу сделать с одним, я не могу сделать с другим, и почему?

Многие аргументы обеих команд одинаковы. Те , которые кажутся наиболее важными являются --ntasks, --nodes, --cpus-per-task, --ntasks-per-node. Как они связаны друг с другом и чем отличаются для srunvs sbatch?

Одно конкретное отличие заключается в том, что srunэто вызовет ошибку, если у testjob.shнего нет разрешения на выполнение, то есть chmod +x testjob.shтогда, sbatchкогда он с радостью запустит его. Что происходит «под капотом», из-за чего это происходит?

В документации также упоминается, что srunобычно используется внутри sbatchскриптов. Это приводит к вопросу: как они взаимодействуют друг с другом и каков «канонический» вариант использования для каждого из них? В частности, я бы когда-нибудь использовал srunсам по себе?

dkv
источник

Ответы:

110

В документации говорится

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

пока

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

Оба они принимают практически одинаковый набор параметров. Основное отличие состоит в том, что srunон интерактивный и блокирующий (вы получаете результат в своем терминале, и вы не можете писать другие команды, пока он не будет завершен), в то время как sbatchэто пакетная обработка и неблокирование (результаты записываются в файл, и вы можете отправлять другие команды немедленно).

Если вы используете знак srunв фоновом режиме &, то вы удаляете функцию «блокирования» srun, которая становится интерактивной, но не блокирующей. Тем не менее, он по-прежнему интерактивен, а это означает, что вывод будет загромождать ваш терминал, а srunпроцессы связаны с вашим терминалом. Если вы отключитесь, вы потеряете контроль над ними, или они могут быть убиты (в зависимости от того, используют они stdoutили нет). И они будут убиты, если компьютер, к которому вы подключаетесь для отправки заданий, будет перезагружен.

Если вы используете sbatch, вы отправляете свою работу, и она обрабатывается Slurm; вы можете отключиться, убить свой терминал и т. д. без каких-либо последствий. Ваша работа больше не связана с запущенным процессом.

Что я могу сделать с одним, чего не могу с другим, и почему?

Функция, которая доступна sbatchи недоступна, srun- это массивы заданий . Поскольку srunэто можно использовать в sbatchсценарии, нет ничего, с чем вы не могли бы сделать sbatch.

Как они связаны друг с другом и чем они отличаются для srun и sbatch?

Все параметры --ntasks, --nodes, --cpus-per-task, --ntasks-per-nodeимеют одинаковое значение в обеих командах. Это верно почти для всех параметров, за заметным исключением --exclusive.

Что происходит «под капотом», из-за чего это происходит?

srunнемедленно выполняет сценарий на удаленном хосте, sbatchкопирует сценарий во внутреннее хранилище и затем загружает его на вычислительный узел при запуске задания. Вы можете проверить это, изменив свой сценарий отправки после того, как он был отправлен; изменения не будут приняты во внимание (см. это ).

Как они взаимодействуют друг с другом и каковы «канонические» варианты использования каждого из них?

Обычно вы используете его sbatchдля отправки задания и srunв сценарии отправки для создания шагов задания, как их называет Slurm. srunиспользуется для запуска процессов. Если ваша программа является параллельной программой MPI, srunпозаботится о создании всех процессов MPI. В противном случае программа srunбудет запускаться столько раз, сколько указано в --ntasksпараметре. Существует множество вариантов использования в зависимости от того, работает ли ваша программа параллельно или нет, имеет ли она длительное время работы или нет, состоит из одного исполняемого файла или нет и т. Д. Если не указано иное, srunнаследует по умолчанию соответствующие параметры того sbatchили того, sallocкоторый он запускает. под ( отсюда ).

В частности, я бы когда-нибудь использовал srun отдельно?

Кроме небольших тестов, нет. Обычно используется srun --pty bashдля получения оболочки для выполнения вычислительной задачи.

Дэмиенфрансуа
источник
5
Спасибо за ответ, это лучше, чем я мог надеяться. Одно продолжение, так как это было одним из моих первоначальных затруднений: зачем вообще звонить srunв сценарий отправки? Возможно, я не понимаю, что означает «этап работы». Например, если у меня есть сценарий с именем, runjob.shкоторый содержит #!/bin/bash srun myjob.sh, есть ли практическая разница между вызовом (a) sbatch runjob.shvs (b) sbatch myjob.shvs (c) srun myjob.shvs (d) srun runjob.sh? (Очевидно, последнее глупо, но мне любопытно).
dkv 05
3
возможно, вы могли бы просмотреть слайды тренинга, который я недавно провел, чтобы узнать, как srun используется в сценарии отправки
damienfrancois
4
Похоже, что все примеры на слайдах (а также учебник на странице CECI) используются srunвнутри sbatchсценария отправки. Однако я обнаружил, что команды без srunсценария отправки будут выполняться таким же образом. Есть ли разница между четырьмя вышеупомянутыми вызовами?
dkv 05
8
Все ваши примеры будут выполняться одинаково, только если (1) выделено для одного процессора и (2) программа является чисто последовательной. Чтобы увидеть различия, запросите более одной задачи. Другое отличие состоит в том, что если вы не используете srun в sbatch, команда sstat не вернет никакой полезной информации,
Дэмиенфрансуа
1
@Atcold, эта версия может быть более современной: github.com/damienfrancois/slurm-helper/blob/master/slurm.vim
damienfrancois
5

На самом деле это не полностью отвечает на вопрос, но я нашел дополнительную информацию, которая может быть полезна для кого-то в будущем:


Из связанной темы я нашел с аналогичным вопросом:

Вкратце, sbatch и salloc выделяют ресурсы для задания, а srun запускает параллельные задачи по этим ресурсам. При вызове в рамках распределения заданий srun запускает параллельные задачи для некоторых или всех выделенных ресурсов. В этом случае srun по умолчанию наследует соответствующие параметры sbatch или salloc, под которыми он работает. Затем вы можете (обычно) предоставить srun различные параметры, которые переопределят то, что он получает по умолчанию. Каждый вызов srun в рамках задания называется шагом задания.

srun также можно вызывать вне распределения заданий. В этом случае srun запрашивает ресурсы, и, когда эти ресурсы предоставляются, запускает задачи по этим ресурсам как одно задание и шаг задания.

Есть относительно новая веб-страница, на которой более подробно описаны параметры -B и --exclusive.

doc / html / cpu_management.shtml


Дополнительная информация на странице часто задаваемых вопросов SLURM .

Команда srun имеет два разных режима работы. Во-первых, если он не выполняется в существующем задании (то есть не в выделении заданий Slurm, созданном salloc или sbatch), то он создает распределение заданий и порождает приложение. При запуске в рамках существующего распределения команда srun только порождает приложение. В этом вопросе мы обратимся только к первому режиму работы и сравним создание распределения заданий с помощью команд sbatch и srun.

Команда srun предназначена для интерактивного использования, когда кто-то отслеживает вывод. Выходные данные приложения рассматриваются как выходные данные команды srun, обычно на пользовательском терминале. Команда sbatch предназначена для отправки сценария для последующего выполнения, а ее выходные данные записываются в файл. Параметры команд, используемые при распределении заданий, практически идентичны. Наиболее заметное различие в параметрах заключается в том, что команда sbatch поддерживает концепцию массивов заданий, а srun - нет. Еще одно существенное отличие - отказоустойчивость. Сбои, связанные с заданиями sbatch, обычно приводят к повторной постановке в очередь и повторному выполнению задания, тогда как сбои, связанные с srun, обычно приводят к созданию сообщения об ошибке с ожиданием, что пользователь ответит соответствующим образом.


Еще один актуальный разговор здесь

dkv
источник