SLURM Отправить несколько задач на узел?

Я нашел несколько очень похожих вопросов, которые помогли мне прийти к сценарию, который, кажется, работает, однако я все еще не уверен, полностью ли я понимаю, почему, поэтому этот вопрос ...

Моя проблема (пример): на 3 узлах я хочу запустить 12 задач на каждом узле (всего 36 задач). Также каждая задача использует OpenMP и должна использовать 2 процессора. В моем случае узел имеет 24 процессора и 64 ГБ памяти. Мой сценарий был бы таким:

#SBATCH --nodes=3
#SBATCH --ntasks=36
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=2000

export OMP_NUM_THREADS=2

for i in {1..36}; do
    srun -N 1 -n 1 ./program input${i} >& out${i} &
done

wait

Кажется, это работает так, как мне нужно, последовательно выполняя задачи на узле до тех пор, пока все ЦП на этом узле не будут использоваться, а затем продолжая выполнять дальнейшие задачи на следующем узле, пока все ЦП снова не будут использоваться, и т. Д.

Мой вопрос .. Я не уверен, что это действительно то, что он делает (?), Поскольку я не полностью понял страницу руководства srun относительно -n, и я не использовал srun раньше. В основном моя путаница возникает из-за "-n": на странице руководства для -n сказано: "По умолчанию одна задача на узел, ..", поэтому я ожидал, что если я использую "srun -n 1", то будет только одна задача. запускать на каждом узле, что, похоже, не так. Кроме того, когда я попробовал, например, "srun -n 2 ./program" кажется, что одна и та же программа запускается дважды, как две разные задачи, без возможности использовать разные входные файлы ... что я не могу понять, почему это когда-либо будет полезно?


person Shiwayari    schedule 25.08.2017    source источник


Ответы (2)


Ваша установка верна, за исключением того, что вы должны использовать параметр --exclusive для srun (который в данном случае имеет другое значение, чем для sbatch).

Что касается вашего замечания относительно полезности srun, поведение программы может быть изменено на основе переменной среды $SLURM_TASK_ID или ранга в случае программы MPI. Ваша путаница возникает из-за того, что ваша программа не написана для параллельной работы (а именно из двух потоков OMP), в то время как srun предназначена для запуска параллельных программ, большую часть времени на основе MPI.

person damienfrancois    schedule 25.08.2017

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

ваш сценарий SLURM будет

#SBATCH --nodes=3
#SBATCH --ntasks=36
#SBATCH --cpus-per-task=2
#SBATCH --mem-per-cpu=2000

export OMP_NUM_THREADS=2

srun -n 36 ./program.sh

и ваша оболочка program.sh будет

#!/bin/sh

exec ./program input${SLURM_PROCID} > out${SLURM_PROCID} 2>&1 
person Gilles Gouaillardet    schedule 26.08.2017