Дождитесь завершения всех заданий пользователя перед отправкой последующих заданий в кластер PBS.

Я пытаюсь настроить некоторые bash-скрипты, чтобы они запускались на (pbs) кластер.

Отдельные задачи выполняются несколькими сценариями, которые запускаются основным сценарием. Пока что эти основные сценарии запускают несколько сценариев в фоновом режиме (путем добавления &), заставляя их работать параллельно на одной многоядерной машине. Я хочу заменить эти вызовы на qsubs, чтобы распределить нагрузку по узлам кластера.

Однако некоторые задания зависят от завершения других до того, как они смогут начаться. До сих пор это достигалось wait операторами в основном скрипте. Но как лучше всего это сделать с помощью grid engine?

Я уже нашел этот вопрос, а также -W after:jobid[:jobid...] документацию в справочную страницу qsub, но я надеюсь, что есть лучший способ. Мы говорим о нескольких тысячах заданий, которые сначала должны выполняться параллельно, и о другом наборе того же размера, который будет выполняться одновременно после завершения последнего из них. Это означало бы, что мне пришлось ставить в очередь много заданий в зависимости от большого количества заданий.

Я мог бы снизить это, используя фиктивное задание между ними, ничего не делая, но полагаясь на первую группу заданий, от которых могла бы зависеть вторая группа. Это уменьшит количество зависимостей с миллионов до тысяч, но все же: это кажется неправильным, и я даже не уверен, что такая длинная командная строка будет принята оболочкой.

  • Нет ли способа дождаться завершения всех моих заданий (что-то вроде qwait -u <user>)?
  • Или все задания, отправленные с помощью этого скрипта (что-то вроде qwait [-p <PID>])?

Конечно, можно было бы написать что-то подобное, используя qstat и sleep в цикле while, но я думаю, что этот вариант использования достаточно важен, чтобы иметь встроенное решение, и я просто не мог его понять.

Что бы вы порекомендовали/использовали в такой ситуации?

Приложение I:

Поскольку это было запрошено в комментарии:

$ qsub --version
version: 2.4.8

Может быть также полезно определить точную систему pbs:

$ qsub --help
usage: qsub [-a date_time] [-A account_string] [-b secs]
      [-c [ none | { enabled | periodic | shutdown |
      depth=<int> | dir=<path> | interval=<minutes>}... ]
      [-C directive_prefix] [-d path] [-D path]
      [-e path] [-h] [-I] [-j oe] [-k {oe}] [-l resource_list] [-m n|{abe}]
      [-M user_list] [-N jobname] [-o path] [-p priority] [-P proxy_user] [-q queue]
      [-r y|n] [-S path] [-t number_to_submit] [-T type] [-u user_list] [-w] path
      [-W otherattributes=value...] [-v variable_list] [-V] [-x] [-X] [-z] [script]

Поскольку комментарии указывают на массивы заданий, я просмотрел справочную страницу qsub со следующими результатами:

[...]
DESCRIPTION
[...]
       In addition to the above, the following environment variables will be available to the batch job.
[...]
       PBS_ARRAYID
              each member of a job array is assigned a unique identifier (see -t)
[...]
OPTIONS
[...]
       -t array_request
               Specifies the task ids of a job array. Single task arrays are allowed.
               The array_request argument is an integer id or a range of integers. Multiple ids or id ranges can be combined in a comman delimeted list. Examples : -t 1-100 or -t 1,10,50-100
[...]

Приложение II:

Я попробовал решение torque, предложенное Дмитрием Чубаровым, но это не работает, как описано.

Без массива заданий он работает так, как ожидалось:

testuser@headnode ~ $ qsub -W depend=afterok:`qsub ./test1.sh` ./test2 && qstat
2553.testserver.domain
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver         Test1            testuser               0 Q testqueue
2553.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver         Test1            testuser               0 R testqueue
2553.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2553.testserver         Test2            testuser               0 R testqueue

Однако при использовании массивов заданий второе задание не запустится:

testuser@headnode ~ $ qsub -W depend=afterok:`qsub -t 1-2 ./test1.sh` ./test2 && qstat
2555.testserver.domain
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver       Test1-1          testuser               0 Q testqueue
2554-2.testserver       Test1-1          testuser               0 Q testqueue
2555.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver       Test1-1          testuser               0 R testqueue
2554-2.testserver       Test1-2          testuser               0 R testqueue
2555.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2555.testserver         Test2            testuser               0 H testqueue

Я предполагаю, что это связано с отсутствием указания массива в идентификаторе задания, который возвращается первым qsub:

testuser@headnode ~ $ qsub -t 1-2 ./test1.sh
2556.testserver.domain

Как видите, ...[] не указывает на то, что это массив заданий. Кроме того, в выводе qsub нет ...[], но ...-1 и ...-2 указывают на массив.

Таким образом, остается вопрос, как отформатировать -W depend=afterok:..., чтобы задание зависело от указанного массива заданий.


person mschilli    schedule 26.08.2013    source источник
comment
Существует несколько систем очередей, созданных на основе PBS; Вы точно знаете, что используете? У некоторых есть такие функции, как массивы заданий — серия независимо выполняемых заданий, которые можно рассматривать как единое целое для целей зависимостей (или отмены, или..)   -  person Jonathan Dursi    schedule 26.08.2013
comment
@JonathanDursi: К сожалению, я не знаю точную систему. Есть ли способ понять это? --version не сообщает ничего, кроме номера версии, и справочная страница также не содержит никаких подробностей. Если нет возможности узнать на себе, я могу написать администратору кластера в крайнем случае.   -  person mschilli    schedule 26.08.2013
comment
@DmitriChubarov: я добавил вывод --version и --help. Надеюсь, это пойдет на пользу.   -  person mschilli    schedule 27.08.2013
comment
@JonathanDursi: я добавил части, связанные с массивом заданий, на справочную страницу qsub. Это поможет вам ответить на вопрос?   -  person mschilli    schedule 27.08.2013
comment
Я думаю, вы используете Torque 2.4.8; несколько старый, но он имеет некоторую начальную поддержку массивов заданий. Ответ @DimitriChubarov ниже поможет вам встать на правильный путь.   -  person Jonathan Dursi    schedule 27.08.2013


Ответы (1)


Заполнение в соответствии с решением, предложенным Джонатаном в комментариях.

Существует несколько менеджеров ресурсов, основанных на оригинальной Portable Batch System: OpenPBS, TORQUE и PBS Professional. Системы значительно разошлись и используют другой синтаксис команд для новых функций, таких как массивы заданий.

Массивы заданий — это удобный способ отправки нескольких похожих заданий на основе одного и того же сценария задания. Цитата из мануала:

Иногда пользователям нужно отправить большое количество заданий на основе одного и того же сценария задания. Вместо использования сценария для повторного вызова qsub теперь существует функция, известная как массивы заданий, позволяющая создавать несколько заданий с помощью одной команды qsub.

Для отправки массива заданий PBS предоставляет следующий синтаксис:

 qsub -t 0-10,13,15 script.sh

это отправляет задания с идентификаторами от 0,1,2,...,10,13,15.

Внутри скрипта переменная PBS_ARRAYID содержит идентификатор задания в массиве и может использоваться для выбора необходимой конфигурации.

Массив заданий имеет свои определенные параметры зависимости.

КРУТЯЩИЙ МОМЕНТ

Менеджер ресурсов TORQUE, который, вероятно, используется в OP. Предоставляются дополнительные параметры зависимости, которые можно увидеть в следующем примере:

$ qsub -t 1-1000 script.sh
1234[].pbsserver.domainname
$ qsub -t 1001-2000 -W depend=afterokarray:1234[] script.sh
1235[].pbsserver.domainname

Это приведет к следующему выводу qstat

1234[]         script.sh    user          0 R queue
1235[]         script.sh    user          0 H queue   

Проверено на версии крутящего момента 3.0.4

Полный синтаксис afterokarray находится в руководстве qsub(1).

ПБС Профессионал

В PBS Professional зависимости могут одинаково работать с обычными заданиями и заданиями массива. Вот пример:

$ qsub -J 1-1000 -ry script.sh
1234[].pbsserver.domainname
$ qsub -J 1001-2000 -ry -W depend=afterok:1234[] script.sh
1235[].pbsserver.domainname

Это приведет к следующему выводу qstat

1234[]         script.sh    user          0 B queue
1235[]         script.sh    user          0 H queue   

Обновление версий Torque

Зависимости массивов стали доступны в Torque начиная с версии 2.5.3. Массивы заданий версии 2.5 несовместимы с массивами заданий версий 2.3 и 2.4. В частности, синтаксис [] был введен в Torque начиная с версии 2.5.

Обновление по использованию задания-разделителя

Для версий крутящего момента до 2.5 может работать другое решение, основанное на отправке фиктивных заданий-разделителей между пакетами заданий, которые необходимо разделить. Он использует три типа зависимостей: on, before и after.

Рассмотрим следующий пример

 $ DELIM=`qsub -Wdepend=on:1000 dummy.sh `
 $ qsub -Wdepend=beforeany:$DELIM script.sh
 1001.pbsserver.domainname
 ... another 998 jobs ...
 $ qsub -Wdepend=beforeany:$DELIM script.sh
 2000.pbsserver.domainname
 $ qsub -Wdepend=after:$DELIM script.sh
 2001.pbsserver.domainname
 ...

Это приведет к такому состоянию очереди

1000         dummy.sh    user          0 H queue
1001         script.sh   user          0 R queue   
...
2000         script.sh   user          0 R queue   
2001         script.sh   user          0 H queue
...   

То есть задание №2001 запустится только после завершения предыдущих 1000 заданий. Вероятно, элементарные средства массива заданий, доступные в TORQUE 2.4, также можно использовать для отправки задания сценария.

Это решение также будет работать для TORQUE версии 2.5 и выше.

person Dmitri Chubarov    schedule 27.08.2013
comment
Исправлена ​​синтаксическая ошибка в примере torque. Идентификатор задания массива в предложении afterokarray должен иметь суффикс массива []. - person Dmitri Chubarov; 28.08.2013
comment
Даже с исправленным синтаксисом это не работает для меня. Я обновил вопрос результатами соответствующего теста. - person mschilli; 28.08.2013
comment
@ sg-lecram извините, эта функция afterokarray присутствует в Torque 2.5.8, но еще недоступна в Torque 2.4.8. - person Dmitri Chubarov; 28.08.2013
comment
Спасибо за вашу помощь. +1 за это. Но есть ли другой способ добиться этого без обновления системы PBS? Может быть, отправив второй массив позже и дождавшись всех заданий соответствующего пользователя в сценарии отправки (как это предлагается в моих qwait примерах)? - person mschilli; 28.08.2013
comment
@ sg-lecram Думаю, я нашел разумный компромисс, который должен работать для версий Torque до 2.5. Пожалуйста, проверьте это. - person Dmitri Chubarov; 29.08.2013