Система очередей 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 устройств.