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