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
печатает вывод немедленно (и имеет некоторые преимущества в скорости)