Получить идентификатор работы SLURM от работы, начатой ​​Strigger - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть R-анализ, состоящий из трех частей (partA, partB и partC). Я отправляю каждую часть в SLURM (например, sbatch partA), и каждая часть распараллеливается через #SBATCH --array=1-1500. Части серийные, поэтому мне нужно подождать, пока одна из них закончится, прежде чем начинать следующую. Сейчас я вручную запускаю каждую работу, но это не лучшее решение.

Я хотел бы автоматизировать три вызова sbatch. Например:

  1. sbatch partA
  2. когда partA сделано, sbatch partB
  3. когда partB сделано, sbatch partC

Я использовал это решение , чтобы получить идентификатор задания partA, и передать его strigger для выполнения шага 2, описанного выше. Однако я застрял в этой точке, потому что Я не знаю, как получить идентификатор задания partB из strigger. Вот как выглядит мой код:

#!/bin/bash

# step 1: sbatch partA
partA_ID=$(sbatch --parsable partA.sh)

# step 2: sbatch partB
strigger --set --jobid=$partA_ID --fini --program=/path/to/partB.batch

# step 3: sbatch partC
... ?

Как выполнить шаг 3?

1 Ответ

0 голосов
/ 26 апреля 2018

strigger не является подходящим инструментом для достижения этой цели, он больше ориентирован на администраторов, чем на обычных пользователей. Только slurm user может фактически установить триггеры (см. «Важное примечание» на справочной странице Strigger ).

В вашем случае вы должны отправить все три задания одновременно с установленными между ними зависимостями.

Например:

$ partA_ID=$(sbatch --parsable partA.sh)
$ partB_ID=$(sbatch --parsable --dependency=afterany:${partA_ID} partB.sh)
$ partC_ID=$(sbatch --parsable --dependency=afterany:${partB_ID} partC.sh)

При этом будут отправлены три массива заданий, но второй начнется только после завершения всех заданий в первом. А третий запускается только после завершения всех заданий во втором.

Альтернативой может быть

$ partA_ID=$(sbatch --parsable partA.sh)
$ partB_ID=$(sbatch --parsable --dependency=aftercorr:${partA_ID}  partB.sh)
$ partC_ID=$(sbatch --parsable --dependency=aftercorr:${partB_ID}  partC.sh)

Это передаст три массива заданий, но все задания второго не начнутся до тех пор, пока не закончится соответствующее задание в первом (то есть задание с таким же $SLURM_ARRAY_TASK_ID). И все задания в третьем запускаются только после того, как соответствующее задание во втором завершено.

Подробнее см. Раздел --dependency в справочной странице sbatch .

...