Запуск сценария SLURURM с несколькими узлами, начнется шаги работы с 1 задачей
-
26-12-2019 - |
Вопрос
Я пытаюсь запустить большое количество шагов заданий, используя пакетный скрипт. Различные шаги могут быть совершенно разными программами и нужны именно один CPU каждый. Сначала я попытался сделать это, используя аргумент --multi-prog
для srun
. К сожалению, при использовании всех процессоров, назначенных на мою работу таким образом, производительность ухудшается массово. Время выполнения увеличивается до почти его сериализованного значения. Выписываю, я мог бы немного улучшить это. Я не мог найти ничего онлайн в отношении этой проблемы, поэтому я предположил, что это будет проблемой конфигурации кластера, которую я использую.
Итак, я пытался выйти другой маршрут. Я реализовал следующий скрипт (запущенный через sbatch my_script.slurm
):
#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48
NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
#My call looks like this:
#srun --exclusive -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
srun --exclusive -n1 hostname &
pids[${PROC}]=$! #Save PID of this background process
done
for pid in ${pids[*]};
do
wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done
.
Я знаю, что аргумент --exclusive
на самом деле не нужен в моем случае. Сценарии оболочки называются различные двоичные файлы и их аргументы. Оставшаяся часть моего скрипта зависит от того факта, что все процессы закончили, отсюда и генеракодицетагкод. Я изменил вызов, чтобы сделать его минимальным рабочим примером.
Сначала это казалось решением. К сожалению, при увеличении количества узлов, используемых в моем распределении рабочих мест (например, увеличивая генеракодицетагкод к числу большее, чем количество процессоров на узел в моем кластере), скрипт больше не работает, возвращается
srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1
.
и продолжая использовать только один узел (I.E. 48 процессоров в моем случае, который проходит через шаги задания так же быстро, как и раньше, все процессы на других узлах (ых) впоследствии убиты).
Это кажется ожидаемым поведением, но я не могу этого понять. Почему каждый шаг работы в заданном распределении должен включать минимальное количество задач, равных количеству узлов, включенных в распределение. Я обычно на самом деле не волнует вообще о количестве узлов, используемых в моем выделении.
Как я могу реализовать свой пакетный скрипт, поэтому его можно надежно использовать на нескольких узлах?
Решение
нашел это!Номенклатура и многие варианты командной строки, чтобы спутать меня.Решение дано путем
#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48
NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
#My call looks like this:
#srun --exclusive -N1 -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
srun --exclusive -N1 -n1 hostname &
pids[${PROC}]=$! #Save PID of this background process
done
for pid in ${pids[*]};
do
wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done
.
Это указывает, чтобы запустить работу на одном узле, включающем только одну задачу.