Как запустить разные независимые параллельные задания на разных узлах, используя slurm, используя концепцию рабочий / мастер? - PullRequest
0 голосов
/ 23 января 2019

У меня есть программа, которая использует концепцию master / salve для распараллеливания.Существует главный каталог и несколько рабочих каталогов.Я должен сначала запустить исполнительный файл в главном каталоге, затем перейти к рабочим каталогам и запустить рабочий руководитель в каждом каталоге.Мастер ожидает, пока работник завершит свою работу и отправит результаты мастеру для дальнейших расчетов.Задания рабочих каталогов не зависят друг от друга, поэтому их можно запускать на разных машинах (узлах).Мастер и рабочие общаются друг с другом, используя протокол связи TCP / IP.
Я работаю в кластере с 16 узлами, и каждый узел имеет 28 ядер с менеджером заданий на слэмы.Я могу работать с 20 работниками на 1 узле в полном порядке.в настоящее время мой сценарий slurm выглядит следующим образом:

#!/bin/bash
#SBATCH -n 1               # total number of tasks requested
#SBATCH --cpus-per-task=18 # cpus to allocate per task
#SBATCH -p shortq            # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00        # run time (hh:mm:ss) - 12.0 hours in this.

cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!

cd /To-Parent 
# This is the directory that contains all worker (wrk)directories

parallel -i bash -c "cd {} ; worker.exe /h 127.0.0.1:4004" -- 
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14 
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}

Мне было интересно, как я могу изменить этот сценарий, чтобы разделить задания, выполняемые на рабочих, между несколькими узлами.Например, задания, связанные с wrk1 - wrk5, выполняются на узле 1, задания, связанные с wrk6 - wrk10, выполняются на узле 2 и т. Д.?

1 Ответ

0 голосов
/ 24 января 2019

Во-первых, вам нужно разрешить Slurm выделять отдельные узлы для вашей работы, поэтому вам нужно удалить опцию --cpus-per-task и вместо этого запросить 18 задач .

Во-вторых, вам нужночтобы получить имя хоста, на котором мастер работает как 127.0.0.1, больше не будет действительным в многоузловой установке.

В-третьих, просто добавьте srun перед вызовом bash в parallel--exclusive -n 1 -c 1 он будет отправлять каждый экземпляр рабочего, порожденный parallel, каждому из ЦП в выделении.Они могут находиться на том же узле или на других узлах.

Таким образом, следующее может работать (не проверено)

#!/bin/bash
#SBATCH -n 18               # total number of tasks requested
#SBATCH -p shortq            # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00        # run time (hh:mm:ss) - 12.0 hours in this.

cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!
MASTER_HOSTNAME=$(hostname)

cd /To-Parent 
# This is the directory that contains all worker (wrk)directories

parallel -i srun --exclusive -n 1 -c 1 bash -c "cd {} ; worker.exe /h $MASTER_HOSTNAME:4004" -- 
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14 
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}

Обратите внимание, что в вашем примере с 18 задачами и 20 каталогами для обработки,Вначале в задании будут работать 18 рабочих, а затем два дополнительных будут «микропланироваться» при завершении предыдущего задания.

...