Перемещает ли пакетная система PBS несколько последовательных заданий между узлами? - PullRequest
5 голосов
/ 28 марта 2011

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 28 марта 2011

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

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

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

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

2 голосов
/ 07 апреля 2012

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

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

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

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

...