Связать несколько заданий SLURM с зависимостью

В предыдущем вопросе я спросил, как поставить задание B для запуска после задания A, что делается с помощью

sbatch --dependency=after:123456:+5 jobB.slurm

где 123456 — это идентификатор задания A, а :+5 означает, что оно начнется через пять минут после задания A. Теперь мне нужно сделать это для нескольких заданий. Работа B должна зависеть от работы A, работа C от B, работа D от C.

sbatch jobA.slurm вернет Submitted batch job 123456, и мне нужно будет передать идентификатор задания вызову с зависимостью для всех заданий, кроме первого. Поскольку я использую загруженный кластер, я не могу полагаться на увеличение идентификаторов заданий на единицу, так как кто-то может поставить задание в очередь между ними.

Таким образом, я хочу написать сценарий, который принимает сценарии заданий (*.slurm) Я хочу запускать в качестве аргументов, например.

./run_jobs.sh jobA.slurm jobB.slurm jobC.slurm jobD.slurm

Затем сценарий должен запуститься для всех переданных ему сценариев заданий,

sbatch jobA.slurm # Submitted batch job 123456
sbatch --dependency=after:123456:+5 jobB.slurm # Submitted batch job 123457
sbatch --dependency=after:123457:+5 jobC.slurm # Submitted batch job 123458
sbatch --dependency=after:123458:+5 jobD.slurm # Submitted batch job 123459

Каков оптимальный способ сделать это с помощью bash?


person mhovd    schedule 11.01.2021    source источник
comment
Каков характер зависимости? И насколько похожи сценарии работы? Просто потому, что, в зависимости от ответов на эти вопросы, цель может быть легче достигнута, если просто поставить sbatch <next script> в конце каждого скрипта или что-то подобное.   -  person Biggsy    schedule 12.01.2021
comment
Это было бы решением, но мне нужно, чтобы они были разнесены по времени на ~ 5 минут, чего не было бы, если бы я вызывал jobB из jobA. Чтобы ответить на ваш вопрос, я не могу запускать две работы одновременно, так как это приведет к их провалу (без возможности улучшить это состояние).   -  person mhovd    schedule 12.01.2021
comment
Было бы практично вставить sleep 300 в сценарий отправки в начале или в конце? Если это так, вы можете сделать, как было предложено, или отправить их все с одним и тем же именем задания и опцией --dependency=singleton.   -  person damienfrancois    schedule 13.01.2021
comment
dependency=singleton было бы невозможно, так как я хочу, чтобы задания выполнялись параллельно, так как выполнение некоторых из них может занять несколько дней.   -  person mhovd    schedule 13.01.2021
comment
Что касается sleep для отложенной отправки, задания помещаются в очередь и иногда запускаются одновременно, даже если они были отправлены отдельно друг от друга во времени.   -  person mhovd    schedule 13.01.2021
comment
Итак, задание B должно начаться >= через 5 минут после запуска задания A, иначе оно завершится ошибкой. Почему это приводит к их провалу? Это как-то связано с ограничениями диспетчера рабочей нагрузки? Или что-то делать с одновременным чтением входных данных? Или что-то другое? Просто потому, что понимание этого поможет найти подходящее решение.   -  person Biggsy    schedule 13.01.2021
comment
Точную причину сложно объяснить, но я безуспешно пытался найти решение, позволяющее запускать два задания одновременно. Пять минут, наверное, слишком много, две было бы вполне нормально.   -  person mhovd    schedule 13.01.2021


Ответы (1)


Вы можете использовать опцию --parsable, чтобы получить идентификатор ранее отправленной работы:

#!/bin/bash

ID=$(sbatch --parsable $1)
shift 
for script in "$@"; do
  ID=$(sbatch --parsable --dependency=after:${ID}:+5 $script)
done
person Marcus Boden    schedule 18.01.2021
comment
Кажется, это прекрасно работает, и это именно то, что я искал. Благодарю вас! - person mhovd; 19.01.2021