.. _slurm: ====================== Система очередей Slurm ====================== Для того чтобы запустить задачу на кластере, необходимо использовать систему управления заданиями Slurm. Обычно для этого создаётся специальный скрипт, и ставится в очередь с помощью команды ``sbatch``. Этот скрипт содержит информацию о необходимых ресурсах (число узлов кластера, количество ядер процессора, количество и тип графических ускорителей, необходимое количество оперативной памяти и необходимое время). В остальном этот скрипт является обычным bash-скриптом, в нём можно настроить нужные переменные среды и запустить необходимую программу. Этот скрипт будет запущен лишь на одном ядре из выделенного списка. В обязанности скрипта входит запуск программы на всех остальных узлах, например, с помощью ``mpirun`` или ``srun``. Пример скрипта -------------- Начнём с простого примера для задачи ``sleep`` на одно ядро с максимальным временем выполнения 5 минут. Создайте файл ``sleep.sh`` со следующим содержимым .. code-block:: slurm :linenos: #!/bin/bash #SBATCH --job-name=sleep #SBATCH --nodes=1 #SBATCH --time=05:00 echo "Start date: $(date)" sleep 60 echo " 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-.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 ``. Точно так же задачу можно удалить, если она уже выполняется (при этом она будет сразу завершена). Команда ``scontrol`` -------------------- Если нужно изменить параметры уже поставленной в очередь задачи, то можно использовать команду ``scontrol``. Например, чтобы изменить максимальное время расчёта выполните :: scontrol update jobid= timelimit= где ```` – идентификатор задачи, ```` – новый лимит времени (увеличить максимальное время можно только до начала расчёта). Описание других параметров команды см. в документации ``man scontrol``. Вспомогательные команды ----------------------- Команда ``slurmtop`` отображает основную информацию о состоянии кластера (общая информация, занятость узлов и очередь задач). Для выхода из программы нажмите клавишу ``q``. Команда ``pestat`` показывает краткую сводку о занятости узлов кластера. При запуске с параметром ``pestat -G`` будет также отображена информация о количестве и типе GPU устройств.