Что задачи --ntasks или -n делают в SLURM?
Я использовал SLURM для использования некоторого вычислительного кластера, и он имел -ntasks
или же -n
, Я, очевидно, прочитал документацию для этого ( http://slurm.schedmd.com/sbatch.html):
sbatch не запускает задачи, он запрашивает распределение ресурсов и отправляет пакетный скрипт. Эта опция сообщает контроллеру Slurm, что шаги задания, выполняемые в пределах выделения, запустят максимальное количество задач и предоставят достаточные ресурсы. По умолчанию это одна задача на узел, но учтите, что параметр --cpus-per-task изменит это значение по умолчанию.
конкретная часть я не понимаю, что это значит:
Выполнение в пределах выделения приведет к запуску максимального количества задач и предоставлению достаточных ресурсов.
У меня есть несколько вопросов:
- Я предполагаю, что мой первый вопрос - что означает слово "задача", и разница между словом "работа" в контексте SLURM. Я обычно думаю о работе как о запуске скрипта bash под sbatch, как в
sbatch my_batch_job.sh
, Не уверен, что значит задача. - Если бы я сравнил слово task с job, то подумал, что он будет запускать один и тот же идентичный скрипт bash несколько раз в соответствии с аргументом
-n, --ntasks=<number>
, Тем не менее, я, очевидно, проверил это в кластере, побежалecho hello
с--ntask=9
и я ожидал, что sbatch 9 раз отзовется в stdout (который собирается вslurm-job_id.out
, но, к моему удивлению, мой эхо-скрипт выполнялся один раз. Тогда что вообще делает эта команда? Кажется, он ничего не делает или, по крайней мере, я не вижу, что делать.
Я знаю -a, --array=<indexes>
опция существует для нескольких рабочих мест. Это другая тема. Я просто хочу знать, что --ntasks
Предположим, что в идеале с примером, чтобы я мог проверить это в кластере.
3 ответа
--ntasks
Параметр полезен, если у вас есть команды, которые вы хотите запустить параллельно в одном пакетном скрипте. Это могут быть две отдельные команды, разделенные &
или две команды, используемые в bash pipe (|
).
Например
Использование по умолчанию ntasks=1
#!/bin/bash
#SBATCH --ntasks=1
srun sleep 10 &
srun sleep 12 &
wait
Выкину предупреждение
Создание шага задания временно отключено, повторная попытка
Количество заданий по умолчанию было задано равным одному, и поэтому второе задание не может быть запущено до тех пор, пока первое задание не будет завершено. Эта работа закончится примерно через 22 секунды. Чтобы сломать это:
sacct -j515058 --format=JobID,Start,End,Elapsed,NCPUS
JobID Start End Elapsed NCPUS
------------ ------------------- ------------------- ---------- ----------
515058 2018-12-13T20:51:44 2018-12-13T20:52:06 00:00:22 1
515058.batch 2018-12-13T20:51:44 2018-12-13T20:52:06 00:00:22 1
515058.0 2018-12-13T20:51:44 2018-12-13T20:51:56 00:00:12 1
515058.1 2018-12-13T20:51:56 2018-12-13T20:52:06 00:00:10 1
Здесь задание 0 запускается и завершается (через 12 секунд), затем следует задание 1 (через 10 секунд). Чтобы общее время пользователя составило 22 секунды.
Чтобы запустить обе эти команды одновременно:
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 sleep 10 &
srun --ntasks=1 sleep 12 &
wait
Выполнение той же священной команды, как указано выше
sacct -j 515064 --format=JobID,Start,End,Elapsed,NCPUS
JobID Start End Elapsed NCPUS
------------ ------------------- ------------------- ---------- ----------
515064 2018-12-13T21:34:08 2018-12-13T21:34:20 00:00:12 2
515064.batch 2018-12-13T21:34:08 2018-12-13T21:34:20 00:00:12 2
515064.0 2018-12-13T21:34:08 2018-12-13T21:34:20 00:00:12 1
515064.1 2018-12-13T21:34:08 2018-12-13T21:34:18 00:00:10 1
Здесь общая работа заняла 12 секунд. Нет риска того, что задания ожидают ресурсы, поскольку в пакетном сценарии указано количество задач, поэтому у задания есть ресурсы для одновременного выполнения такого количества команд.
Каждая задача наследует параметры, указанные для пакетного сценария. Вот почему --ntasks=1
необходимо указать для каждой задачи srun, иначе каждая задача использует --ntasks=2
и поэтому вторая команда не будет запущена, пока не выполнится первая задача.
Еще одна оговорка о задачах, наследующих параметры пакета, если --export=NONE
указывается в качестве параметра пакета. В этом случае --export=ALL
следует указывать для каждой команды srun, иначе переменные окружения, установленные в сценарии sbatch, не наследуются командой srun.
Дополнительные примечания:
При использовании каналов bash может потребоваться указать --nodes=1, чтобы запретить команды по обе стороны каналов, работающих на отдельных узлах.
Когда используешь &
запускать команды одновременно, wait
жизненно важно В этом случае без wait
команда, задача 0 будет отменена, если задание 1 выполнено успешно.
Параметр "--ntasks" указывает, сколько экземпляров вашей команды будет выполнено. Для общей настройки кластера, и если вы запускаете команду с "srun", это соответствует количеству рангов MPI.
Напротив, опция "--cpus-per-task" указывает, сколько процессоров может использовать каждая задача.
Ваш вывод меня тоже удивляет. Вы запустили свою команду в скрипте или через srun? Сценарий выглядит так:
#!/bin/bash
#SBATCH --ntasks=8
## more options
echo hello
Это всегда должно выводить только одну строку, потому что скрипт выполняется только на отправляющем узле, а не на рабочем.
Если ваш сценарий выглядит
#!/bin/bash
#SBATCH --ntasks=8
## more options
srun echo hello
srun заставляет скрипт выполнить вашу команду на рабочих узлах, и в результате вы должны получить 8 строк приветствия.
Задачи — это процессы, которые задание выполняется параллельно на одном или нескольких узлах. выделяет ресурсы для вашей работы, но даже если вы запросите ресурсы для нескольких задач, он запустит ваш сценарий работы в одном процессе только на одном узле. используется для запуска шагов задания из пакетного сценария.--ntasks=N
указывает выполнить N копий шага задания.
Например,
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=2
означает, что вы хотите запустить два процесса параллельно, и каждый процесс будет иметь доступ к двум процессорам.sbatch
выделит четыре процессора для вашего задания, а затем запустит пакетный сценарий в одном процессе. В пакетном сценарии вы можете создать шаг параллельного задания, используя
srun --ntasks=2 --cpus-per-task=2 step.sh
Это запустит два процесса параллельно, оба из которых будут выполнятьstep.sh
сценарий. С той же работы вы также можете запустить
srun --ntasks=1 --cpus-per-task=4 step.sh
Это запустит один процесс, который может получить доступ ко всем четырем графическим процессорам (хотя и выдаст предупреждение).
Стоит отметить, что в пределах выделенных ресурсов ваш скрипт задания может делать что угодно, и его не нужно использовать для создания шагов задания (но вам нужно запустить шаг задания на нескольких узлах). Например, следующий сценарий будет выполнять оба шага параллельно:
#!/bin/bash
#SBATCH --ntasks=1
step1.sh &
step2.sh &
wait
Если вы хотите запускать шаги задания с помощью и параллельно выполнять два разных шага, тогда ваше задание должно выделить две задачи, а ваши шаги задания должны запрашивать только одну задачу. Вам также необходимо предоставить--exclusive
аргументsrun
, чтобы шаги задания использовали отдельные ресурсы.
#!/bin/bash
#SBATCH --ntasks=2
srun --ntasks=1 --exclusive step1.sh &
srun --ntasks=1 --exclusive step2.sh &
wait