Что задачи --ntasks или -n делают в SLURM?

Я использовал SLURM для использования некоторого вычислительного кластера, и он имел -ntasks или же -n, Я, очевидно, прочитал документацию для этого ( http://slurm.schedmd.com/sbatch.html):

sbatch не запускает задачи, он запрашивает распределение ресурсов и отправляет пакетный скрипт. Эта опция сообщает контроллеру Slurm, что шаги задания, выполняемые в пределах выделения, запустят максимальное количество задач и предоставят достаточные ресурсы. По умолчанию это одна задача на узел, но учтите, что параметр --cpus-per-task изменит это значение по умолчанию.

конкретная часть я не понимаю, что это значит:

Выполнение в пределах выделения приведет к запуску максимального количества задач и предоставлению достаточных ресурсов.

У меня есть несколько вопросов:

  1. Я предполагаю, что мой первый вопрос - что означает слово "задача", и разница между словом "работа" в контексте SLURM. Я обычно думаю о работе как о запуске скрипта bash под sbatch, как в sbatch my_batch_job.sh, Не уверен, что значит задача.
  2. Если бы я сравнил слово 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
Другие вопросы по тегам