Система очередей

Система очередей Slurm #

Для того чтобы запустить задачу на кластере, необходимо использовать систему управления заданиями Slurm. Обычно для этого создается специальный скрипт, и ставится в очередь с помощью команды sbatch. Этот скрипт содержит информацию о необходимых ресурсах (число узлов кластера, количество ядер процессора, необходимое количество оперативной памяти и необходимое время). В остальном этот скрипт является обычным bash-скриптом, в нем можно настроить нужные переменные среды и запустить необходимую программу. Этот скрипт будет запущен лишь на одном ядре из выделенного списка. В обязанности скрипта входит запуск программы на всех остальных узлах, например, с помощью mpirun.

Пример #

Начнем с простого примера для задачи sleep на одно ядро с максимальным временем выполнения 5 минут. Создайте файл sleep.sh со следующим содержимым:

#!/bin/bash
#SBATCH --job-name sleep
#SBATCH --nodes=1
#SBATCH --time=05:00

echo "Start date: $(date)"
sleep 60
echo "  End date: $(date)"

Отправка задачи на кластер осуществляется с помощью команды sbatch:

sbatch sleep.sh

Строчки, начинающиеся с #SBATCH, содержат параметры для команды sbatch. Эти параметры можно также указывать явно при вызове sbatch. Например:

sbatch  --job-name sleep  --nodes=1  --time=5:00  sleep.sh

Команда sbatch #

Основные параметры команды sbatch:

  • -D path или --chdir=path
    Определяет рабочую директорию для задания. Если не задана, то рабочей является текущая директория.
  • -e path/file или --error=path/file
  • -o path/file или --output=path/file
    Задаются имена файлов ошибок (stderr), и стандартного вывода (stdout). По умолчанию оба вывода объединяются в один файл slurm-<job_id>.out в текущей директории.
  • --mail-type=NONE,FAIL,BEGIN,END,ALL и др.
    События, при которых отправлять уведомления по e-mail. NONE – не отправлять уведомления, FAIL — в случае аварийного прекращения задачи, BEGIN — в момент запуска задачи, END — в момент завершения задачи, n — не отправлять уведомления. Можно указать несколько событий через запятую. Подробное описание и другие типы событий доступны в документации man sbatch.
  • --mail-user=e-mail
    Адрес получателя уведомлений. По умолчанию — хозяин задачи.
  • -J name или --job-name=name
    Определяет имя задачи.
  • -p queue или --partition=queue
    Задаёт очередь в которую добавляется задача. На сервере есть несколько очередей. По умолчанию задачи ставятся в очередь x8core.
  • -n N или --ntasks=N
    Запрашивает N процессов для задачи.
  • -N N или --nodes=N
    Запрашивает N вычислительных узлов для задачи.
  • --nodes=N --ntasks-per-node=M
    Запрашивает N вычислительных узлов, и M процессов на каждом узле.
  • --cpus-per-task=N
    Дополнительно запрашивает N процессорных ядер на каждый процесс (например для гибридных задач MPI+OpenMP). По умолчанию выделяется одно ядро на процесс.
  • --mem=size
    Запрашивает необходимую память на каждом узле. Размер указывается с помощью целого числа и суффикса: K, M, G. Например, --mem=16G запросит 16 Гб памяти на каждом узле.
  • -t time или --time=time
    Ограничивает максимальное время выполнения задачи. По истечении этого времени программа будет завершена. Значение указывается в минутах, либо в одном из форматов ММ:CC, ЧЧ:ММ:СС. По умолчанию устанавливается значение 6 часов.
  • -C list или --constraint=list
    Указывает дополнительные ограничения на выделяемые узлы. Список может содержать несколько элементов, перечисленных через запятую. Список используемых на текущий момент ограничений: ib – наличие InfiniBand на узле, avx, avx2, avx512 – процессоры узла поддерживают расширенные наборы команд AVX, AVX2 и AVX-512 соответственно.

Переменные окружения, которые устанавливает Slurm:

  • SLURM_SUBMIT_DIR
    Директория, в которой находился пользователь во время отправки задачи в очередь.
  • SLURM_JOB_ID
    Уникальный номер задачи.
  • SLURMD_NODENAME
    Текущий узел, на котором запущен скрипт.
  • SLURM_NTASKS
    Количество выделенных процессорных ядер.

Дополнительную информацию можно получить в документации man sbatch.

Команда squeue #

Просмотреть состояние задач в очереди можно с помощью команды squeue. Команда squeue -u user покажет только задачи пользователя user. Текущее состояние задачи отмечено в столбце ST.

  • PD — задача находится в очереди, ждет освобождения ресурсов.
  • R — задача в данный момент выполняется.
  • Описание других состояний см. в документации man squeue.

В столбце NODELIST перечислены узлы, выделенные для задачи.

С помощью команды squeue -l можно также увидеть запрошенное время для каждой задачи, а с помощью squeue --start можно узнать ожидаемое время запуска задачи.

Команда scancel #

Если по каким-то причинам задача так и не начала запускаться, например, запрошено слишком много ядер, или памяти, то удалить задачу из очереди можно с помощью команды scancel <job_id>. Точно так же задачу можно удалить, если она уже выполняется (при этом она будет сразу завершена).

Программа slurmtop #

slurmtop позволяет мониторить основную информацию о состоянии кластера (общая информация, занятость узлов и очередь задач). Для выхода из программы нажмите клавишу q.

Очереди задач на кластере #

На кластере действует несколько очередей для задач. Все узлы кластера разбиты на несколько групп. Каждая очередь может использовать только узлы из одной или нескольких определённых групп. Для каждой очереди устанавливается своё ограничение по времени выполнения задачи. Также есть возможность ограничения доступа разных групп пользователей к разным очередям.

Очередь 001–004 005–012 013–016 017–020 021–030 Всего ядер Макс. время
x8core + 64 24 ч.
x10core + + 120 24 ч.
x12core + + 432 24 ч.
mix + + + + + 616 12 ч.
e5core + + + 296 24 ч.
long * 10 180 ч.
* В очереди long доступны только 10 ядер на узле cl1n016.

Чтобы отправить задачу, например, в очередь x12core нужно добавить параметр -p x12core для комады sbatch:

sbatch -p x12core -J big-problem --nodes=2 --ntasks-per-node=24  qbig.sh

Или добавить строчку

#SBATCH -p x12core

в скрипт для sbatch. По умолчанию в настоящее время используется очередь x8core.