Что делает -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 выполнено успешно.