Вы здесь

Запуск задач на кластере в системе SLURM

При запуске задачи пользователя на счет
- необходимо учитывать ограничения по ресурсам на вычислителях для пользователей (и не забывать о них);
- желательно использовать тот модуль установки переменных окружения, с которым программа была откомпилирована;
- пока задача не просчиталась, нельзя ее перекомпилировать, удалять исполняемый файл и менять входные данные.

Запуск программ осуществляется в системе SLURM. В результате запуска задача помещается в очередь заданий и ей присваивается уникальный идентификатор (его можно узнать командами mqinfo, mps или squeue, sacct). По умолчанию задаче пользователя выделяется по 1 ГБ оперативной памяти на каждое вычислительное ядро (при необходимости размер исполняемой программы в байтах можно узнать с помощью команды size).

Данная инструкция описывает общие и относящиеся к MPI-программам команды SLURM.
Особенности запуска параллельных OpenMP-, MATLAB-, ANSYS-программ рассматриваются в отдельных инструкциях:
    О запуске приложений с OpenMP, PGI Accelerator и OpenACC
    Использование системы Matlab для параллельных вычислений (подробно в Параллельный Matlab)
    Запуск программ из пакета ANSYS

Команды SLURM начинаются с буквы s.
На основе этих команд для удобства пользователей (в частности, обеспечения преемственности при переходе на SLURM, см. [6]) были реализованы упрощённые команды запуска MPI-, MATLAB-, ANSYS-программ и информационные команды (начинающиеся, за одним исключением, с буквы m).
Упрощённые команды и основные команды SLURM приведены ниже; подробнее о SLURM см., например, в [1-5]; полная информация выдаётся с помощью команды man.


Упрощённые команды

mqrun, замена mpirun, — запуск MPI-программы, аналог команды sbatch
mlrun, mlprun, mlgrun — запуск MATLAB-программ; matlab — запуск MATLAB
ansysrun — запуск ansysV, cfx5solve и fluent-программ, где V- номер текущей версии
mqinfo — выдача информации об узлах и очереди заданий с помощью команд sinfo и squeue:
                1) разновидность команды sinfo выдаёт информацию об узлах (см. Пример выдачи sinfo),
                в частности, о числе процессоров и ядер на узле в зависимости от типа узла (от раздела),
                об общем числе свободных ядер и др.;
                2) команда squeue выдаёт информацию об очереди заданий.
mps — выдача информации об узлах и задачах только самого пользователя, действует как команда
                mqinfo -u $USER -l
mqdel,  mkill — отмена выполнения задачи (ожидающей старта или уже стартовавшей),
                действуют как команда scancel

Команда mqrun (замена mpirun, аналог sbatch ) c параметрами –np и –maxtime (допустимы –n и –t для sbatch), задающими соответственно число процессов и время предполагаемого счета в минутах, запускает в пакетном режиме успешно откомпилированную С- или Fortran-программу, например
    mqrun -np 8 -maxtime 20 mytest

(вместо     mpirun –np 8 –maxtime 20 mytest )
где для mytest затребовано формирование 8 процессов, а время счета ограничено 20-ю минутами.
В ответ в строке вида
    Submitted batch job 1475

выдаётся уникальный идентификатор задачи в очереди заданий, здесь 1475.
Уникальный идентификатор используется в командах отмены выполнения задания, например
    mqdel 1475
    (или    mkill 1475)
Внимание!
1. Для запущенной таким образом задачи сохранена запись выходного файла в каталог вида имя_программы.номер. Номера возрастают, начиная с 1 (например, mytest.1).
Пользователь должен сам удалять ненужные каталоги.
2. Для увеличения оперативной памяти можно воспользоваться опцией -m <MB>, где MB - память в мегабайтах (например, -m 4000).
3. В команде mqrun доступны основные опции старой команды mpirun (в частности -stdin, -stdout, -stderr); смотрите
    mqrun -help


Основные команды SLURM

Команды запуска задач

Система SLURM позволяет с помощью команд srun и sbatch работать соответственно в интерактивном и пакетном режимах.
Пакетный режим является основным в работе с кластером.

Команда srun для запуска интерактивной программы имеет вид
    srun -n <число процессов> -t <время> <имя программы> [<параметры программы>] [&]


Команда sbatch для запуска программы в пакетном режиме имеет вид
    sbatch -n <число процессов> -t <время> <имя скрипта>

или
    sbatch -n <число процессов> -t <время> --wrap="srun <имя программы> [<параметры программы>]"


Внимание!
Библиотека OpenMPI работает только с командой sbatch и при этом перед именем программы вместо srun добавляется orterun:
    sbatch -n <число процессов> -t <время> --wrap="orterun <имя программы> [<параметры программы>]"


Параметры:
-n — задаёт число процессов (tasks); если не задано, то по умолчанию n=1;
-t — заказывает время для решения задачи; при отсутствии t выделяется 30 минут (по умолчанию);
20 часов - максимальное время, выделяемое для счета задачи в будние дни (с 9 часов понедельника до 16 часов пятницы);
85 часов - максимальное время, выделяемое для счета задачи на выходные (с 16 часов пятницы до 9 часов понедельника плюс 20 часов), т.е. на 85 часов задача запустится, если она войдет в решение в 16 часов ближайшей пятницы, иначе будет ждать следующей; аналогично, на 84 часа есть шанс запустить до 17 часов пятницы и т.д. до 9 часов понедельника;
100 часов - максимальное время, если к выходным добавляются праздничные дни;
Время может быть задано в виде:
    минуты       минуты:секунды      часы:минуты:секунды
    дни-часы     дни-часы:минуты     дни-часы:минуты:секунды

& — позволяет запустить интерактивную задачу в фоновом режиме, при котором пользователю доступна работа в командной строке и одновременно выдача результатов работы интерактивной задачи идет на экран.

Опция -N позволяет задать число узлов (nodes) для задачи, если пользователю это важно:
-N <кол-во узлов>

Для увеличения оперативной памяти можно воспользоваться опциями:
--mem-per-cpu=<MB> — задаёт минимальную память в расчёте на одно ядро в мегабайтах ; если не задано, то по умолчанию 1 ГБ;
 --mem=<MB> — задаёт память на узле в мегабайтах.
Эти опции взаимно исключают друг друга.

Опция --gres с указанием требуемого количества GPU в виде:
--gres=gpu:<кол-во GPU на одном узле>
задаёт запуск программы на узлах с GPU.
Если gres не задан, то количество GPU=0, т.е. GPU при счете не используются.

Опция -p позволяет указать раздел (partition) кластера для запуска задачи:
-p <раздел> или --partition=<раздел>
Если раздел не задан пользователем явно, то по умолчанию будет выбран раздел all, но при отсутствии в нем нужного числа свободных процессоров будут задействованы разделы umt_p2 и apollo.
Список разделов выдается командой sinfo -s , при этом all как раздел по умолчанию помечен *. Разделы all, umt_p2, apollo и debug покрывают весь кластер и взаимно не пересекаются, т.е. содержат разные узлы.
Опция -p debug позволяет запускать задачи в специально выделенном для отладки программ разделе debug с максимальным временем счета 20 минут.
Примеры команд запуска с заданием раздела.
    srun -p debug mytest
    mqrun -np 360 -maxtime 20 -p apollo myprog

или, используя соответствующие опции srun,
    mqrun -n 360 -t 20 -p apollo myprog

Опции mqrun выдаются по команде mqrun -help.

Пример. В результате интерактивного запуска
    srun hostname

выдаётся имя узла, на котором запущен соответствующий процесс, например,
    umt145


При запуске в пакетном режиме команда запуска программы задаётся либо в скрипте, либо через --wrap, например,
    sbatch mybat

или
    sbatch -n 2 --wrap="srun hostname"

где скрипт mybat
#!/bin/sh
#SBATCH -n 2
srun hostname &
wait

Внимание!
Команда srun внутри скрипта может запрашивать ресурсы только в тех пределах, которые установлены командой sbatch.
Скрипт запускается только на первом из выделенных узлов.
Запуск нескольких процессов осуществляется командой srun. При этом все опции, указанные в командной строке или самом скрипте в строках #SBATCH, приписываются к каждой команде srun данного скрипта, если не переопределены в ней. Так, результирующий файл приведённого примера будет содержать 2 строки с именами узлов (возможно, одинаковых), на которых выполнятся 2 процесса задачи, сформированные командой srun.
Если команды srun запускаются в фоновом режиме (символ & в конце строки), то они при наличии ресурсов могут выполняться одновременно.


По умолчанию стандартный вывод пакетной задачи и стандартный поток ошибок направляются в файл с именем slurm-%j.out, где %j заменяется уникальным идентификатором (номером) задачи.

Перенаправление ввода-вывода можно выполнить, указав программе sbatch опции
--error=<filename pattern>, --input=<filename pattern>,
--output=<filename pattern>
.
При задании имени файла (filename pattern) можно использовать символы замены, в частности, %j.

Выдаваемые результаты конкретной команды srun можно поместить вместо стандартного в указанный файл, добавив после команды символ перенаправления вывода (>)
    srun mytest > out_mytest &
Можно (чаще, при интерактивном запуске) параллельно просматривать результаты и сохранять их в файле, например:
    srun --mem 40000 hostname | tee out_hostname

Описание всех опций и примеры команд можно посмотреть в man-руководстве с помощью команд:
    man sbatch
    man srun


Примеры постановки задач в очередь.
u9999@umt:~$ sbatch -n 3 --wrap="srun mytest1 3 5.1"  — сформирована пакетная задача с запуском
                                                                                                3-х процессов mytest1 c 2-мя параметрами;
Submitted batch job 776                                  — задаче присвоен уникальный идентификатор 776;
u9999@umt:~$ srun -N 2 sleep 30 &                — сформирована интерактивная задача в фоновом режиме;
[1] 22313                                     — [1] - номер фоновой задачи в текущем сеансе, 22313 - pid процесса srun на управляющей машине. Уникальный идентификатор можно узнать с помощью команд squeue, sacct.


Информационные команды
     squeue      sacct      sinfo      scontrol      характеристики GPU

squeue — просмотр очереди (информации о задачах, находящихся в счете или в очереди на счет); возможно использование ключей, например:
    squeue --user=`whoami`     — посмотреть только свои задачи;
    squeue --states=RUNNING   — посмотреть считающиеся задачи;
    squeue --long                    — выдать более подробную информацию.

Пример.
u9999@umt:~$ srun -N 2 sleep 30 &
[1] 22313

u9999@umt:~$ squeue

  JOBID PARTITION     NAME     USER    ST    TIME  NODES NODELIST(REASON)
    777     all               sleep      u9999   R     0:23       2      umt[10,15]
JOBID — уникальный идентификатор задачи; никогда не используется повторно ;
PARTITION — название раздела, где считается задача;
NAME — имя задачи пользователя;
USER — логин пользователя;
ST — состояние задачи (R - выполняется, PD - в очереди);
TIME — текущее время счета;
NODES — количество узлов для задачи;
NODELIST(REASON) — список выделенных узлов.

sacct — просмотр задач текущего пользователя за сутки (с начала текущего дня);
возможно использование ключей, например:
     sacct -a --starttime 2011-01-01
     — посмотреть все задачи с начала года.

Пример.
u9999@umt:~$ sacct
       JobID    JobName  Partition    Account  AllocCPUS      State           ExitCode
------------    ---------- ----------   ---------- ------------ ---------------   -----------
522              sbatch      tesla                               2       COMPLETED         0:0
522.batch       batch                                            1       COMPLETED         0:0
777                sleep      all                                   2       CANCELLED+       0:0
780              sbatch      tesla                               2        FAILED               0:0
780.batch       batch                                            1        FAILED            127:0
783                sleep      tesla                               2        RUNNING            0:0

JobID — уникальный идентификатор задачи, повторно не используется;
JobName — имя задачи пользователя;
Partition — название раздела, где считается задача;
State — состояние задачи:   RUNNING — выполняется,
                                           PENDING — ждёт в очереди,
                                           COMPLETED — закончилась,
                                           FAILED — закончилась по ошибке,
                                           CANCELLED+ — снята пользователем;
ExitCode — код возврата.

sinfo — просмотр информации об узлах (прежде всего, о состоянии узлов: доступны, заняты, свободны, ...).
sinfo -s — выдача суммарной информации о разделах кластера без детализации по узлам.

Пример.
u9999@umt:~$ sinfo
PARTITION   AVAIL  TIMELIMIT  NODES   STATE   NODELIST
umt*             up      8:00:00       4         down*   umt[59,92,139,201]
umt*             up      8:00:00     203         idle      umt[1-58,60-91,93-118,120-138,140-200,202-208]
umt*             up      8:00:00       1        down     umt119
tesla               up      8:00:00       1         alloc      tesla2
tesla               up      8:00:00      18         idle       tesla[3-20]
tesla               up      8:00:00       1         down     tesla1

PARTITION — название раздела, где считаются задачи,
                      * - указывает на раздел по умолчанию;
AVAIL — состояние раздела узлов: up - есть доступ, down - нет доступа;
TIMELIMIT — максимальное время, выделяемое для счета задачи;
NODES — количество узлов;
STATE — состояние (в сокращённой форме):
                idle - свободен, alloc - используется процессом, mix - частично занят, частично свободен,
                down, drain, drng - заблокирован,
                comp - все задания, связанные с этим узлом, находятся в процессе завершения;
                * - обозначает узлы, которые в настоящее время не отвечают (not responding);
NODELIST — список узлов.

Пример выдачи sinfo из команд mqinfo и mps:

PARTITION SOCKET CORE CPU THREAD GRES    TIMELIMIT   CPUS(A/I/O/T)
umt           2            4       8      1                      20:00:00   1203/53/408/1664
tesla          2            6       12    1          gpu:8    infinite         322/2/36/360
all*            2            4+     8+   1                      20:00:00   1525/55/444/2024

PARTITION — название раздела: umt, tesla, all; * отмечен раздел по умолчанию;
SOCKET — число процессоров на узле;
CORE — число ядер в процессоре;
CPU — число ядер на узле;
THREAD — число нитей на ядро;
GRES — число общих для узла ресурсов, где gpu - графический ускоритель;
TIMELIMIT — максимальное время, выделяемое для счета задачи;
CPUS(A/I/O/T) — число ядер:
            A (alloc) - заняты, I (idle) - свободны, O (other) - заблокированы, T (total) - всего.

scontrol — выдача детальной информации об узлах, разделах, задачах:

    scontrol show node tesla34 — об узле, в частности, причине состояния drain, down;
    scontrol show partition       — о разделах;
    scontrol show job 174457     — о задаче.


Информацию о технических характеристиках GPU выдает программа pgaccelinfo, которая входит в поставку компилятора PGI. Поэтому предварительно надо установить соответствующий модуль, выполнив команду mpiset, например:
    mpiset 7
    srun --gres=gpu:1 pgaccelinfo

Опция вида -w 'tesla21' позволяет выдать эту информацию для конкретного (в данном случае 21) узла:
    srun -w 'tesla21' --gres=gpu:1 pgaccelinfo


Как удалить задачу
Для отмены выполнения задачи служит команда scancel:

  • Убрать из очереди
        scancel <id1,id2,...,idn> — снимает задачи с уникальными идентификаторами id1,id2,...,idn
        scancel -u u9999 — снимает все задачи пользователя u9999
  • Снять со счёта (выполняется аналогично )
        scancel --state=RUNNING 1,2,3 — снимает со счета уже стартовавшие задачи с идентификаторами 1,2 и 3
        CTRL+C — снимает интерактивную задачу без фонового режима.
  • Пример.
    u9999@umt:~$ squeue
      JOBID PARTITION     NAME     USER     ST       TIME  NODES NODELIST(REASON)
        977     tesla            sleep     u9999    R         1:32      2       tesla[1-2]
    u9999@umt:~$ scancel 977      — сняли со счета интерактивную задачу, считающуюся в фоновом режиме.
    srun: Force Terminated job 977
    u9999@umt:~$ srun: Job step aborted: Waiting up to 2 seconds for job step to finish.
    slurmd[tesla1]: *** STEP 977.0 CANCELLED AT 2011-11-01T18:04:45 ***
    srun: error: tesla1: task 0: Terminated
    srun: error: tesla2: task 1: Terminated
    Enter      — нажать
    [1]+  Exit 15                  srun -p tesla -N 2 sleep 1h
    u9999@umt:~$ squeue
      JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    u9999@umt:~$


    Полезные ссылки

    1. Quick Start User Guide / Slurm, Documentation.
    2. Общие принципы построения системы SLURM. Берсенев А.Ю. / Семинар ОСО, 13.04.2011.
    3. Обзор планировщиков для SLURM. Берсенев А.Ю. / Семинар ОСО, 20.04.2011.
    4. Оптимизация управления ресурсами суперкомпьютеров с помощью SLURM. M. Тим Джонс, 18.10.2012.
    5. Инструкция Slurm для пользователя. Краткое руководство по запуску / Суперкомпьютер ИК НАН Украины
    6. Берсенёв А.Ю. Шарф С.В. "О системе SLURM и изменениях в обслуживании очереди задач"/ Семинар ОСО, 25.04.2013 - Видеоархив УрО РАН: http://uran.vidicor.ru/vod/?id=2013_UrORAN_25_04_2013_slurm