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

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

Пример скрипта

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

1#!/bin/bash
2#SBATCH --job-name=sleep
3#SBATCH --nodes=1
4#SBATCH --time=05:00
5
6echo "Start date: $(date)"
7sleep 60
8echo "  End date: $(date)"

Первая строка всегда должна указывать на программу-интерпретатор скрипта, например /bin/bash. В строках 2–4 указаны параметры задачи: название, количество узлов, максимальное время выполнения. В строках 6-8 указаны команды, которые будут выполнены на вычислительном узле.

Отправка задачи на кластер осуществляется с помощью команды 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 в текущей директории.
  • -J name или --job-name=name
    Определяет имя задачи.
  • -p queue или --partition=queue
    Задаёт очередь в которую добавляется задача. На сервере есть несколько очередей. По умолчанию задачи ставятся в очередь cpu.
  • -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). По умолчанию выделяется одно ядро на процесс.
  • --gpus=N или --gpus=type:N
    Дополнительно запрашивает доступ к N графическим ускорителям типа type (если тип явно указан).
  • --mem=size
    Запрашивает необходимую память на каждом узле. Размер указывается с помощью целого числа и суффикса: K, M, G. Например, --mem=16G запросит 16 Гб памяти на каждом узле.
  • -t time или --time=time
    Ограничивает максимальное время выполнения задачи. По истечении этого времени программа будет завершена. Значение указывается в минутах, либо в одном из форматов ММ:CC, ЧЧ:ММ:СС, ДД-ЧЧ.

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

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

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

Команда salloc

В отличие от команды sbatch, которая ставит готовый скрипт в очередь задач, команда salloc позволяет выделить узлы и использовать их в интерактивном режиме. Основные параметры те же, что у команды sbatch.

Команда squeue

Просмотреть состояние задач в очереди можно с помощью команды squeue. Команда squeue -u user покажет только задачи пользователя user. Текущее состояние задачи отмечено в столбце ST. * PD — задача находится в очереди, ждёт освобождения ресурсов. * R — задача в данный момент выполняется. * Описание других состояний см. в документации man squeue.

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

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

Команда scancel

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

Команда scontrol

Если нужно изменить параметры уже поставленной в очередь задачи, то можно использовать команду scontrol. Например, чтобы изменить максимальное время расчёта выполните

scontrol update jobid=<id> timelimit=<limit>

где <id> – идентификатор задачи, <limit> – новый лимит времени (увеличить максимальное время можно только до начала расчёта).

Описание других параметров команды см. в документации man scontrol.

Вспомогательные команды

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

Команда pestat показывает краткую сводку о занятости узлов кластера. При запуске с параметром pestat -G будет также отображена информация о количестве и типе GPU устройств.