Что делает -ntasks или -n задач в SLURM?
Я использовал SLURM для использования некоторого вычислительного кластера, и у него были -ntasks
или -n
. Я, очевидно, прочитал документацию для него (http://slurm.schedmd.com/sbatch.html):
sbatch не запускает задачи, он запрашивает распределение ресурсов и отправляет пакет script. Этот параметр советует контроллеру Slurm что этапы работы, выполняемые в рамках распределения, запустит максимум число задач и обеспечить достаточные ресурсы. По умолчанию используется одна задача за node, но обратите внимание, что параметр -cpus-for-task будет измените это значение по умолчанию.
конкретная часть, которую я не понимаю, что это означает:
выполняемый в рамках распределения, запускается максимальное число задач и обеспечить достаточные ресурсы.
У меня есть несколько вопросов:
- Я предполагаю, что мой первый вопрос - это то, что означает слово "задача", а разница - со словом "работа" в контексте SLURM. Обычно я рассматриваю работу как работу bash script под sbatch, как в
sbatch my_batch_job.sh
. Не уверен, что означает задача.
- Если я приравниваю слово задание к заданию, я думал, что он будет работать с одинаковым bash script несколько раз в соответствии с аргументом
-n, --ntasks=<number>
. Тем не менее, я, очевидно, проверил его в кластере, запустил echo hello
с --ntask=9
, и я ожидал, что sbatch будет эхо привет 9 раз для stdout (который собран в slurm-job_id.out
, но, к моему удивлению, было одно исполнение моего эха привет script Тогда что делает эта команда? Кажется, она ничего не делает или, по крайней мере, я не могу понять, что должно делать.
Я знаю, что параметр -a, --array=<indexes>
существует для нескольких заданий. Это другая тема. Я просто хочу знать, что делать --ntasks
, в идеале, с примером, чтобы я мог проверить его в кластере.
Ответы
Ответ 1
Параметры "--ntasks" определяют количество экземпляров вашей команды.
Для общей настройки кластера и при запуске вашей команды с помощью "srun" это соответствует количеству рангов MPI.
В отличие от опции "-cpus-per-task" укажите, сколько CPU может использовать каждая задача.
Ваш результат удивляет меня. Запустили ли вы свою команду в script или через srun?
Вы видите script:
#!/bin/bash
#SBATCH --ntasks=8
## more options
echo hello
Это всегда должно выводиться только одна строка, потому что script выполняется только для отправки node не рабочего.
Если ваш script выглядит как
#!/bin/bash
#SBATCH --ntasks=8
## more options
srun echo hello
srun заставляет script запускать вашу команду на рабочих узлах, и в результате вы должны получить 8 строк приветствия.
Ответ 2
Параметр --ntasks
полезен, если у вас есть команды, которые вы хотите выполнять параллельно в одном пакетном скрипте. Это могут быть две отдельные команды, разделенные &
или двумя командами, используемыми в канале bash (|
).
Например
Использование по умолчанию 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
. В этом случае для каждой команды srun должно быть указано --export=ALL
иначе переменные окружения, установленные в сценарии sbatch, не наследуются командой srun.
Дополнительные примечания:
При использовании каналов bash может потребоваться указать --nodes = 1, чтобы запретить команды по обе стороны каналов, работающих на отдельных узлах.
При использовании &
для одновременного запуска команд wait
является жизненно важным. В этом случае без команды wait
задание 0 будет отменено, если задание 1 выполнено успешно.