#parallel-processing #hpc #gnu-parallel #torque
#параллельная обработка #hpc #gnu-parallel #крутящий момент
Вопрос:
Я пытаюсь использовать gnu parallel GNU parallel (версия 20160922) для запуска большого количества заданий по стыковке белков (с использованием UCSF Dock 6.7). Я работаю в высокопроизводительном кластере с несколькими десятками узлов, каждый из которых имеет 28-40 ядер. Система работает под управлением CentOS 7.1.1503 и использует torque для управления заданиями.
Я пытаюсь отправить каждый конфигурационный файл в dock.n.d в исполняемый файл dock, по одному на ядро в кластере. Вот мой файл PBS:
#PBS -l walltime=01:00:00
#PBS -N pardock
#PBS -l nodes=1:ppn=28
#PBS -j oe
#PBS -o /home/path/to/pardock.log
cd $PBS_O_WORKDIR
cat $PBS_NODEFILE temp.txt
#f=$(pwd)
ls dock.in.d/*.in | parallel -j 300 --sshloginfile $PBS_NODEFILE "/path/to/local/bin/dock6 -i {} -o {}.out"
Это отлично работает на одном узле, как написано выше. Но когда я масштабируюсь, скажем, до 300 процессоров (с -l procs=300
) через несколько узлов, я начинаю получать эти ошибки:
parallel: Warning: ssh to node026 only allows for 99 simultaneous logins.
parallel: Warning: You may raise this by changing /etc/ssh/sshd_config:MaxStartups and MaxSessions on node026.
Чего я не понимаю, так это почему так много логинов. Каждый узел имеет только 28-40 ядер, поэтому, как указано в $ PBS_NODEFILE, я бы ожидал, что в любой момент времени на этих узлах будет только 28-40 логинов SSH.
Я что-то неправильно понимаю или неправильно выполняю? Пожалуйста, сообщите, какую другую информацию я могу предоставить или в каком направлении мне следует двигаться, чтобы заставить это работать.
Обновить
Итак, моей проблемой выше было сочетание -j 300
и использование $PBS_NODEFILE
, которое имеет отдельную запись для каждого ядра на каждом узле. Так что в этом случае, похоже, я должен использовать -j 1
. Но тогда все задания, похоже, выполняются на одном узле.
Итак, остается мой вопрос: как заставить gnu parallel балансировать задания между узлами, используя все ядра, но не создавая чрезмерного количества входов в систему по SSH из-за нескольких заданий на ядро.
Спасибо!
Ответ №1:
Вы просите GNU Parallel игнорировать количество ядер и запускать 300 заданий на каждом сервере.
Попробуйте вместо:
ls dock.in.d/*.in | parallel --sshloginfile $PBS_NODEFILE /path/to/local/bin/dock6 -i {} -o {}.out
--jobs 100%
По умолчанию это будет одно задание на ядро на всех машинах.
Если вам не разрешено использовать все ядра на компьютерах, вы можете добавить X/
к хостам in --sshloginfile
, чтобы указать X как количество ядер:
28/server1.example.com
20/server2.example.com
16/server3.example.net
Это заставит GNU Parallel пропустить обнаружение ядер и вместо этого использовать 28, 20 и 16 соответственно. Это в сочетании с -j 100%
может контролировать, сколько заданий вы хотите запустить на разных серверах.
Комментарии:
1. Я попробовал это, и parallel, похоже, не различает ядра на компьютере и ядра, назначенные МНЕ на компьютере. Например, если я запрашиваю 20 ядер на 28-ядерном узле, я начинаю видеть более 20 заданий dock6. (приближается к общему количеству ядер на узле). Является ли их способом указать parallel соблюдать ограничение ядра (например, представленное количеством записей, которые каждый узел имеет в $ PBS_NODEFILE)? Или это недокументированное поведение ™ или ошибка пользователя ™?