Перемещает ли пакетная система PBS несколько последовательных заданий между узлами?

Если мне нужно запустить много последовательных программ «параллельно» (потому что проблема проста, но требует много времени — мне нужно прочитать много разных наборов данных для одной и той же программы), решение будет простым, если я использую только один узел . Все, что я делаю, это продолжаю отправлять последовательные задания с амперсандом после каждой команды, например. в сценарии работы:

./program1 &
./program2 &
./program3 &
./program4

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

Но что, если мне нужно запустить 110 разных экземпляров одной и той же программы для чтения 110 разных наборов данных? Если я отправлю несколько узлов (скажем, 14) со сценарием, который отправляет 110 команд ./program#, будет ли пакетная система запускать каждое задание на разных процессорах на разных узлах или пытаться запускать их все на одном и том же, 8-ядерный узел?

Я пытался использовать простой код MPI для чтения различных данных, но в результате возникали различные ошибки: примерно 100 из 110 процессов завершались успешно, а остальные давали сбой. Я также рассматривал массивы заданий, но не уверен, поддерживает ли их моя система.

Я тщательно протестировал последовательную программу на отдельных наборах данных — ошибок времени выполнения нет, и я не превышаю доступную память на каждом узле.


person Lt Dax    schedule 28.03.2011    source источник


Ответы (2)


Нет, PBS не будет автоматически распределять задания между узлами вместо вас. Но это обычное дело, и у вас есть несколько вариантов.

  • Самый простой и в некотором смысле наиболее выгодный для вас — это сгруппировать задачи в куски размером в 1 узел и отправить эти пакеты как отдельные задания. Это позволит быстрее приступить к работе; задание с 1 узлом обычно планируется быстрее, чем (скажем) задание с 14 узлами, просто потому, что в расписании больше дыр размером с один узел, чем 14. Это работает особенно хорошо, если все задания занимают примерно одинаковое количество времени, потому что тогда сделать деление довольно просто.

  • Если вы хотите сделать все это за одно задание (скажем, для упрощения ведения бухгалтерского учета), вы можете иметь или не иметь доступа к команде pbsdsh; есть хорошее обсуждение этого здесь. Это позволяет вам запускать один скрипт на всех процессорах вашего задания. Затем вы пишете сценарий, который запрашивает $PBS_VNODENUM, чтобы выяснить, какое из заданий nnodes*ppn это является, и запускает соответствующую задачу.

  • Если не pbsdsh, то Gnu parallel — еще один инструмент, который может значительно упростить эти задачи. Это похоже на xargs, если вы с этим знакомы, но команды будут выполняться параллельно, в том числе на нескольких узлах. Таким образом, вы отправляете свое (скажем) задание на 14 узлов, и на первом узле выполняется параллельный скрипт gnu. Приятно то, что это сделает планирование за вас, даже если задания не все одинаковой длины. Совет, который мы даем пользователям нашей системы по использованию gnu parallel для подобных вещей, следующий: rel="noreferrer">здесь. Обратите внимание, что если gnu parallel не установлен в вашей системе, и по какой-то причине ваши системные администраторы не будут этого делать, вы можете установить его в своем домашнем каталоге, это не сложная сборка.

person Jonathan Dursi    schedule 28.03.2011
comment
Большое спасибо, теперь я реализую некоторые из ваших предложений. - person Lt Dax; 28.03.2011

Вам следует рассмотреть массивы заданий.

Вкратце, вы вставляете #PBS -t 0-109 в свой сценарий оболочки (где диапазон 0-109 может быть любым целым диапазоном, который вы хотите, но вы заявили, что у вас есть 110 наборов данных), и крутящий момент будет:

  • запустить 110 экземпляров вашего скрипта, выделив каждому указанные вами ресурсы (в скрипте с тегами #PBS или в качестве аргументов при отправке).
  • назначьте уникальное целое число от 0 до 109 переменной среды PBS_ARRAYID для каждого задания.

Предполагая, что у вас есть доступ к переменным среды в коде, вы можете просто указать каждому заданию выполняться с набором данных номер PBS_ARRAYID.

person Shep    schedule 07.04.2012