PBS: GNU параллельно: хосты различаются, работа с несколькими процессорами, несколько работ для некоторых хостов - PullRequest
0 голосов
/ 11 мая 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 11 мая 2018

Используйте флаг -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 * 1031 включительно *
  • -j $PERC% = -j 25% (100% / 4 для 4 процессоров)
  • -N1 для отправки только 1 аргумента для каждой задачи
  • -u печатает вывод немедленно (и имеет некоторые преимущества в скорости)
...