PBS: GNU параллельно: хосты различаются, работа с несколькими ЦП, работа с несколькими хостами

С PBSpro я могу запросить ресурсы для запуска моей работы. Моя работа в параллельном кластере сводится к запуску одного и того же файла несколько раз, каждый раз с другим идентификатором индекса / задания. Каждая задача порождает свои собственные подпроцессы, и каждая задача в общей сложности использует 4 ЦП. Эта работа смущающе параллельна, с каждой задачей, независимой друг от друга, и, таким образом, хорошо подходит для параллельного инструмента GNU. Чтобы наилучшим образом использовать кластер и сжимать мои задачи там, где есть место, я помещаю запрос ресурсов в PBS следующим образом:PBS -l select=60:ncpus=4:mpiprocs=1, Результирующий $PBS_NODEFILE затем содержит список хостов, назначенных для задачи.

Проблема заключается в том, что менеджер заданий PBSpro может назначать несколько заданий одному узлу или только 1 задание узлу, и каким-то образом эту информацию нужно передавать в GNU параллельно. Делать это с --sshloginfile $PBS_NODEFILE не переносит информацию о различных ресурсах, доступных на каждом узле (и кажется, что параллельно GNU использует только уникальные имена из этого списка).

Что не так, так это то, что GNU параллельно видит X количество ядер (количество ядер для хоста / узла) независимо от того, было ли назначено только 1 задание этому хосту. Ограничение количества заданий на хост приводит к неэффективному использованию хоста с незанятыми ядрами или к запуску большего количества задач на хосте, чем доступных ресурсов, превышающих подписку на ядра.

Проблема сводится к:

  • Как можно эффективно выполнять параллельные задачи через PBSpro,
  • каждая задача использует более 1 процессора,
  • по случайному (выделенному PBS) выбору узлов,
  • каждый с разным количеством назначенных ресурсов,
  • которые не обязательно соответствуют фактическим физическим ресурсам узла.

1 ответ

Использовать -S флаг, чтобы указать серверы и x/$SERVERNAME его вариант для ограничения количества процессоров (x) для этого сервера.

Первым шагом является использование bash для генерации ввода -S флаг

NCPU=4

HOSTS=`cat $PBS_NODEFILE | uniq -c | awk 'BEGIN{OFS=""}{print $1*$NCPU,"/",$2}'|tr '\n' ','|sed 's/,$/ /'` ( кредит Хиу)

Эта команда bash выводит список серверов, каждый из которых содержит количество доступных процессорных ядер.

После этого запустите параллельно следующим образом:

PERC=$((100/$NCPU))

seq 0 999 | parallel -j $PERC% -N1 -u -S $HOSTS "cd $PBS_O_WORKDIR; python3 $WORKING_PATH$INPUT_FILENAME {}"

Куда:

  • seq 0 999 выполняет 1000 задач с идентификаторами от 0 до 999 включительно
  • -j $PERC% знак равно -j 25% (100% / 4 для 4 процессоров)
  • -N1 отправить только 1 аргумент для каждой задачи
  • -u печатает вывод немедленно (и имеет некоторые преимущества в скорости)
Другие вопросы по тегам