Запуск сценария SLURURM с несколькими узлами, начнется шаги работы с 1 задачей

StackOverflow https://stackoverflow.com//questions/24056961

  •  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
.

Это указывает, чтобы запустить работу на одном узле, включающем только одну задачу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top