gnu parallel одно задание на процессор

#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)? Или это недокументированное поведение ™ или ошибка пользователя ™?